Browse Source

do not recurse into TFunction when checking return flow (closes #5010)

Simon Krajewski 9 years ago
parent
commit
c961f15e02

+ 1 - 1
src/typing/typeload.ml

@@ -951,7 +951,7 @@ let rec return_flow ctx e =
 	in
 	let return_flow = return_flow ctx in
 	let rec uncond e = match e.eexpr with
-		| TIf _ | TWhile _ | TSwitch _ | TTry _ -> ()
+		| TIf _ | TWhile _ | TSwitch _ | TTry _ | TFunction _ -> ()
 		| TReturn _ | TThrow _ -> raise Exit
 		| _ -> Type.iter uncond e
 	in

+ 15 - 0
tests/misc/projects/Issue5010/Main.hx

@@ -0,0 +1,15 @@
+class Main {
+    static function main() {
+    }
+
+    function f(v:Int):String {
+        switch (v) {
+            case 1:
+                var f = function() return 1;
+                if (Math.random() > 0.5)
+                    return "";
+            default:
+                return null;
+        }
+    }
+}

+ 2 - 0
tests/misc/projects/Issue5010/compile-fail.hxml

@@ -0,0 +1,2 @@
+-main Main
+--interp

+ 1 - 0
tests/misc/projects/Issue5010/compile-fail.hxml.stderr

@@ -0,0 +1 @@
+Main.hx:9: lines 9-10 : Missing return: String

+ 2 - 1
tests/unit/src/unit/issues/Issue4969.hx

@@ -11,7 +11,8 @@ class Issue4969 extends Test {
 	@:keep
 	static function test2() {
 		var __return = function(x:Dynamic) { return 1; }
-		 __return(return null); // Cannot use this expression as value
+		__return(return null); // Cannot use this expression as value
+		return null;
 	}
 
 	@:keep