Просмотр исходного кода

fix type of field init assignments when inlining constructors (closes #5340)

Simon Krajewski 9 лет назад
Родитель
Сommit
02da63034a
2 измененных файлов с 33 добавлено и 2 удалено
  1. 2 2
      src/optimization/optimizer.ml
  2. 31 0
      tests/unit/src/unit/issues/Issue5340.hx

+ 2 - 2
src/optimization/optimizer.ml

@@ -1463,8 +1463,8 @@ let inline_constructors ctx e =
 						let ev = mk (TLocal v) v.v_type e.epos in
 						let el_init = List.fold_left (fun acc cf -> match cf.cf_kind,cf.cf_expr with
 							| Var _,Some e ->
-								let ef = mk (TField(ev,FInstance(c,tl,cf))) e.etype e.epos in
-								let e = mk (TBinop(OpAssign,ef,e)) e.etype e.epos in
+								let ef = mk (TField(ev,FInstance(c,tl,cf))) cf.cf_type e.epos in
+								let e = mk (TBinop(OpAssign,ef,e)) cf.cf_type e.epos in
 								e :: acc
 							| _ -> acc
 						) el_init c.cl_ordered_fields in

+ 31 - 0
tests/unit/src/unit/issues/Issue5340.hx

@@ -0,0 +1,31 @@
+package unit.issues;
+
+private class Vector{
+	public var x : Float = 0;
+
+	public var inverse(get, never) : Vector;
+
+	public inline function new(?x : Float = 0.) {
+		this.x = x;
+	}
+	inline function get_inverse() return new Vector(-x);
+	public function toString() return 'Vec($x)';
+}
+
+private class Matrix {
+	public var m : Array< Float > = [0.11, 0.33];
+
+	public function new() {}
+	public inline function back() return new Vector(m[0]);
+	public inline function fwd() return back().inverse;
+}
+
+class Issue5340 extends unit.Test {
+	function test() {
+		var m = new Matrix();
+		m.m[0] = 0.22;
+		var dir = m.fwd();
+
+		eq("Vec(-0.22)", "" + dir);
+	}
+}