ソースを参照

[matcher] don't leak `_` extractor variable (closes #6542)

Simon Krajewski 8 年 前
コミット
4b8d51cfd5

+ 2 - 0
src/typing/matcher.ml

@@ -436,9 +436,11 @@ module Pattern = struct
 					in
 					loop false e1
 			| EBinop(OpArrow,e1,e2) ->
+				let restore = save_locals ctx in
 				let v = add_local "_" null_pos in
 				let e1 = type_expr ctx e1 Value in
 				v.v_name <- "tmp";
+				restore();
 				let pat = make pctx e1.etype e2 in
 				PatExtractor(v,e1,pat)
 			| EDisplay(e,iscall) ->

+ 12 - 0
tests/misc/projects/Issue6542/Main.hx

@@ -0,0 +1,12 @@
+class Main {
+	static function main() {
+		function isEven(value:Float) return value % 2 == 0;
+		for (value in -10 ... 10) {
+			switch value {
+				case value = isEven(_) => true if (_ > 0):  // runtime error
+					trace(value);
+				case _:
+			}
+		}
+	}
+}

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

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

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

@@ -0,0 +1 @@
+Main.hx:6: characters 40-41 : Unknown identifier : _