浏览代码

[analyzer] support terminators in value-places (closes #4969)

Simon Krajewski 9 年之前
父节点
当前提交
4a9837e64b
共有 2 个文件被更改,包括 36 次插入1 次删除
  1. 4 1
      src/optimization/analyzer.ml
  2. 32 0
      tests/unit/src/unit/issues/Issue4969.hx

+ 4 - 1
src/optimization/analyzer.ml

@@ -1111,7 +1111,10 @@ module TexprTransformer = struct
 				bb,e
 				bb,e
 			| TConst _ | TTypeExpr _ ->
 			| TConst _ | TTypeExpr _ ->
 				bb,e
 				bb,e
-			| TContinue | TBreak | TThrow _ | TReturn _ | TVar _ | TFor _ | TWhile _ ->
+			| TThrow _ | TReturn _ | TBreak | TContinue ->
+				let bb = block_element bb e in
+				bb,mk (TConst TNull) t_dynamic e.epos
+			| TVar _ | TFor _ | TWhile _ ->
 				error "Cannot use this expression as value" e.epos
 				error "Cannot use this expression as value" e.epos
 		and ordered_value_list bb el =
 		and ordered_value_list bb el =
 			let might_be_affected,collect_modified_locals = Optimizer.create_affection_checker() in
 			let might_be_affected,collect_modified_locals = Optimizer.create_affection_checker() in

+ 32 - 0
tests/unit/src/unit/issues/Issue4969.hx

@@ -0,0 +1,32 @@
+package unit.issues;
+
+class Issue4969 extends Test {
+
+	@:keep
+	static function test1() {
+		var __return = function(x:Dynamic) { return 1; }
+		__return(throw null); // Cannot use this expression as value
+	}
+
+	@:keep
+	static function test2() {
+		var __return = function(x:Dynamic) { return 1; }
+		 __return(return null); // Cannot use this expression as value
+	}
+
+	@:keep
+	static function test3() {
+		var __return = function(x:Dynamic) { return 1; }
+		while (true) {
+			__return(break); // Cannot use this expression as value
+		}
+	}
+
+	@:keep
+	static function test4() {
+		var __return = function(x:Dynamic) { return 1; }
+		while (true) {
+			__return(continue); // Cannot use this expression as value
+		}
+	}
+}