Browse Source

[analyzer] fix EnumValue equality in const propagation

closes #8959
Simon Krajewski 5 years ago
parent
commit
7cd8ed9e87
2 changed files with 27 additions and 2 deletions
  1. 2 2
      src/optimization/analyzer.ml
  2. 25 0
      tests/unit/src/unit/issues/Issue8959.hx

+ 2 - 2
src/optimization/analyzer.ml

@@ -365,11 +365,11 @@ module ConstPropagation = DataFlow(struct
 	let top = Top
 	let bottom = Bottom
 
-	let equals lat1 lat2 = match lat1,lat2 with
+	let rec equals lat1 lat2 = match lat1,lat2 with
 		| Top,Top | Bottom,Bottom -> true
 		| Const ct1,Const ct2 -> ct1 = ct2
 		| Null t1,Null t2 -> t1 == t2
-		| EnumValue(i1,_),EnumValue(i2,_) -> i1 = i2
+		| EnumValue(i1,tl1),EnumValue(i2,tl2) -> i1 = i2 && List.for_all2 equals tl1 tl2
 		| ModuleType(mt1,_),ModuleType (mt2,_) -> mt1 == mt2
 		| _ -> false
 

+ 25 - 0
tests/unit/src/unit/issues/Issue8959.hx

@@ -0,0 +1,25 @@
+package unit.issues;
+
+private enum List<T> {
+	Cons(element:T, next:List<T>);
+	Nil;
+}
+
+class Issue8959 extends unit.Test {
+	function test() {
+		var list = Cons(1, Cons(2, Cons(3, Nil)));
+		var acc = 0;
+
+		while (true) {
+			switch list {
+				case Cons(element, next):
+					list = next;
+					acc = acc + element;
+				case Nil:
+					break;
+			}
+		}
+
+		eq(6, acc);
+	}
+}