Selaa lähdekoodia

[filters] treat `v = function() { v; }` as special case for var init

closes #9919
Simon Krajewski 2 vuotta sitten
vanhempi
commit
c4e6f40d39

+ 10 - 2
src/filters/filters.ml

@@ -178,8 +178,16 @@ let check_local_vars_init ctx e =
 			restore vars old_vars (List.rev !declared);
 			declared := old;
 		| TBinop (OpAssign,{ eexpr = TLocal v },e) when PMap.mem v.v_id !vars ->
-			loop vars e;
-			vars := PMap.add v.v_id true !vars
+			begin match (Texpr.skip e).eexpr with
+				| TFunction _ ->
+					(* We can be sure that the function doesn't execute immediately, so it's fine to
+					   consider the local initialized (issue #9919). *)
+					vars := PMap.add v.v_id true !vars;
+					loop vars e;
+				| _ ->
+					loop vars e;
+					vars := PMap.add v.v_id true !vars
+			end
 		| TIf (e1,e2,eo) ->
 			loop vars e1;
 			let vbase = !vars in

+ 7 - 0
tests/misc/projects/Issue9919/Main.hx

@@ -0,0 +1,7 @@
+function main() {
+	var foo:Void->Void;
+	foo = function() {
+		trace("Hello");
+		haxe.Timer.delay(foo, 1);
+	};
+}

+ 3 - 0
tests/misc/projects/Issue9919/compile.hxml

@@ -0,0 +1,3 @@
+-cp src
+-main Main
+--interp

+ 0 - 0
tests/misc/projects/Issue9919/compile.hxml.stderr