Răsfoiți Sursa

[analyzer] improve dealing with block-values (closes #4855)

Simon Krajewski 9 ani în urmă
părinte
comite
e137ea58a1
2 a modificat fișierele cu 20 adăugiri și 1 ștergeri
  1. 19 0
      analyzer.ml
  2. 1 1
      tests/optimization/src/TestJs.hx

+ 19 - 0
analyzer.ml

@@ -1136,6 +1136,25 @@ module TexprTransformer = struct
 			let e = List.fold_left (fun e f -> f e) e (List.rev fl) in
 			bb,e
 		and declare_var_and_assign bb v e =
+			let rec loop bb e = match e.eexpr with
+				| TParenthesis e1 ->
+					loop bb e1
+				| TBlock el ->
+					let rec loop2 bb el = match el with
+						| [e] ->
+							bb,e
+						| e1 :: el ->
+							let bb = block_element bb e1 in
+							loop2 bb el
+						| [] ->
+							assert false
+					in
+					let bb,e = loop2 bb el in
+					loop bb e
+				| _ ->
+					bb,e
+			in
+			let bb,e = loop bb e in
 			begin match follow v.v_type with
 				| TAbstract({a_path=[],"Void"},_) -> error "Cannot use Void as value" e.epos
 				| _ -> ()

+ 1 - 1
tests/optimization/src/TestJs.hx

@@ -90,7 +90,7 @@ class TestJs {
 		forEach(function(x) trace(x + 2));
 	}
 
-	@:js('var a = "";var e;var __ex0 = a;var _g = __ex0.toLowerCase();switch(_g) {case "e":e = 0;break;default:throw new Error();}')
+	@:js('var a = "";var __ex0 = a;var e;var _g = __ex0.toLowerCase();switch(_g) {case "e":e = 0;break;default:throw new Error();}')
 	@:analyzer(no_const_propagation, no_local_dce, no_copy_propagation)
 	static function testRValueSwitchWithExtractors() {
 		var a = "";