Browse Source

[cs] Fixed casting on OpAssign. Closes #3512

Cauê Waneck 11 years ago
parent
commit
23414c57f1
2 changed files with 36 additions and 1 deletions
  1. 2 1
      gencommon.ml
  2. 34 0
      tests/unit/src/unit/issues/Issue3512.hx

+ 2 - 1
gencommon.ml

@@ -6328,7 +6328,8 @@ struct
 
 
 				| TBinop ( (Ast.OpAssign | Ast.OpAssignOp _ as op), e1, e2 ) ->
 				| TBinop ( (Ast.OpAssign | Ast.OpAssignOp _ as op), e1, e2 ) ->
 					let e1 = run ~just_type:true e1 in
 					let e1 = run ~just_type:true e1 in
-					{ e with eexpr = TBinop(op, clean_cast e1, run e2) }
+					let e2 = handle (run e2) e1.etype e2.etype in
+					{ e with eexpr = TBinop(op, clean_cast e1, e2) }
 				| TField(ef, f) ->
 				| TField(ef, f) ->
 					handle_type_parameter gen None e (run ef) ~clean_ef:ef ~overloads_cast_to_base:overloads_cast_to_base f [] calls_parameters_explicitly
 					handle_type_parameter gen None e (run ef) ~clean_ef:ef ~overloads_cast_to_base:overloads_cast_to_base f [] calls_parameters_explicitly
 				| TArrayDecl el ->
 				| TArrayDecl el ->

+ 34 - 0
tests/unit/src/unit/issues/Issue3512.hx

@@ -0,0 +1,34 @@
+package unit.issues;
+
+class Issue3512 extends Test {
+	function test()
+	{
+		arr = getArr();
+		eq(arr[0], 1);
+		t(Std.is(arr[0],Int));
+		var arr2:Array<Int> = getArr();
+		eq(arr2[0], 1);
+		t(Std.is(arr2[0], Int));
+		arr2 = getArr();
+		eq(arr2[0], 1);
+		t(Std.is(arr2[0], Int));
+		var arr3:Array<Float> = getArr();
+		eq(arr3[0], 1);
+		t(Std.is(arr3[0], Float));
+		arr3 = getArr();
+		eq(arr3[0], 1);
+		t(Std.is(arr3[0], Float));
+	}
+
+	static var arr:Array<Int>;
+
+	public static function getArr():Dynamic
+	{
+		var arr:Array<Dynamic> = [];
+		arr.push(1);
+		arr.push(2);
+		arr.push(3);
+		return arr;
+	}
+}
+