Browse Source

[analyzer] fix evaluation order issue when calling enum ctors (closes #6643)

Simon Krajewski 8 years ago
parent
commit
2a4fc20405
2 changed files with 28 additions and 1 deletions
  1. 1 1
      src/optimization/analyzerTexpr.ml
  2. 27 0
      tests/unit/src/unit/issues/Issue6643.hx

+ 1 - 1
src/optimization/analyzerTexpr.ml

@@ -890,7 +890,7 @@ module Fusion = struct
 							if not !found && (has_state_write ir || has_state_read ir || has_any_field_read ir || has_any_field_write ir) then raise Exit;
 							{e with eexpr = TNew(c,tl,el)}
 						| TCall({eexpr = TField(_,FEnum _)} as ef,el) ->
-							let el = List.map replace el in
+							let el = handle_el el in
 							{e with eexpr = TCall(ef,el)}
 						| TCall({eexpr = TField(_,fa)} as ef,el) when PurityState.is_pure_field_access fa ->
 							let ef,el = handle_call ef el in

+ 27 - 0
tests/unit/src/unit/issues/Issue6643.hx

@@ -0,0 +1,27 @@
+package unit.issues;
+
+private enum MyEnum {
+	MyCtor(a:Int, b:Int);
+}
+
+
+class Issue6643 extends unit.Test {
+	function test() {
+		var r = MyCtor(sideEffect(), sideEffect());
+		var rA = -1;
+		var rB = -1;
+		switch (r) {
+			case MyCtor(a, b):
+				rA = a;
+				rB = b;
+		}
+		eq(0, rA);
+		eq(1, rB);
+	}
+
+	static var x = 0;
+
+	static function sideEffect() {
+		return x++;
+	}
+}