瀏覽代碼

[cs] clean up casts in an lvalue. Closes #3118

Cauê Waneck 11 年之前
父節點
當前提交
52234b3d70
共有 2 個文件被更改,包括 34 次插入1 次删除
  1. 8 1
      gencommon.ml
  2. 26 0
      tests/unit/issues/Issue3118.hx

+ 8 - 1
gencommon.ml

@@ -6176,6 +6176,12 @@ struct
 
 		let in_value = ref false in
 
+		let rec clean_cast e = match e.eexpr with
+		 | TCast(e,_) -> clean_cast e
+		 | TParenthesis(e) | TMeta(_,e) -> clean_cast e
+		 | _ -> e
+		in
+
 		let rec run ?(just_type = false) e =
 			let handle = if not just_type then handle else fun e t1 t2 -> { e with etype = gen.greal_type t2 } in
 			let was_in_value = !in_value in
@@ -6196,7 +6202,8 @@ struct
 					{ e with eexpr = TCast({ e2 with eexpr = TCall(local, [Type.map_expr run del]) }, None) }
 
 				| TBinop ( (Ast.OpAssign | Ast.OpAssignOp _ as op), e1, e2 ) ->
-					{ e with eexpr = TBinop(op, run ~just_type:true e1, run e2) }
+					let e1 = run ~just_type:true e1 in
+					{ e with eexpr = TBinop(op, clean_cast e1, run e2) }
 				| 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
 				| TArrayDecl el ->

+ 26 - 0
tests/unit/issues/Issue3118.hx

@@ -0,0 +1,26 @@
+package unit.issues;
+
+class Issue3118 extends Test
+{
+	public function test()
+	{
+		var data = new Final();
+		data.a2 = [];
+		data.a2.push(1);
+		eq(data.a2[0],1);
+		eq(data.a2.length,1);
+	}
+}
+
+class Base<A>
+{
+  public function new() {}
+
+  public var a2:A;
+
+}
+
+@:final
+class Final extends Base<Array<Int>>
+{
+}