Browse Source

fix assignment type when declaring variables in analyzer (closes #4740)

Simon Krajewski 9 years ago
parent
commit
6e365bbebb
3 changed files with 23 additions and 9 deletions
  1. 2 2
      analyzer.ml
  2. 7 7
      tests/optimization/src/TestJs.hx
  3. 14 0
      tests/unit/src/unit/issues/Issue4740.hx

+ 2 - 2
analyzer.ml

@@ -853,7 +853,7 @@ module TexprTransformer = struct
 			let bb = declare_var_and_assign bb v e in
 			bb,{e with eexpr = TLocal v}
 		and declare_var_and_assign bb v e =
-			let ev = mk (TLocal v) e.etype e.epos in
+			let ev = mk (TLocal v) v.v_type e.epos in
 			let was_assigned = ref false in
 			let assign e =
 				if not !was_assigned then begin
@@ -861,7 +861,7 @@ module TexprTransformer = struct
 					add_var_def g bb v;
 					add_texpr g bb (mk (TVar(v,None)) ctx.com.basic.tvoid ev.epos);
 				end;
-				mk (TBinop(OpAssign,ev,e)) e.etype e.epos
+				mk (TBinop(OpAssign,ev,e)) ev.etype e.epos
 			in
 			begin try
 				let e = map_values assign e in

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

@@ -295,15 +295,15 @@ class TestJs {
 		TestJs["use"](b);
 	')
 	static function testIssue4739() {
-        var a = 0;
-        if (Math.random() < 0.5)
-            a += 2;
+		var a = 0;
+		if (Math.random() < 0.5)
+			a += 2;
 
-        var b = "";
-        if (Math.random() < 0.5)
-            b = b + "hello";
+		var b = "";
+		if (Math.random() < 0.5)
+			b = b + "hello";
 
-        use(a);
+		use(a);
 		use(b);
 	}
 

+ 14 - 0
tests/unit/src/unit/issues/Issue4740.hx

@@ -0,0 +1,14 @@
+package unit.issues;
+
+private abstract Maybe<T>(Null<T>) from Null<T> {
+	public inline function or(def:T):T {
+		return if (this != null) this else def;
+	}
+}
+
+class Issue4740 extends Test {
+	function test() {
+		var session:Int = (null : Maybe<Null<Int>>).or(0);
+		eq(0, session);
+	}
+}