Browse Source

fix bad recursion in useless pattern detection (closes #5873)

Simon Krajewski 8 years ago
parent
commit
f8558d0eef
2 changed files with 26 additions and 1 deletions
  1. 1 1
      src/typing/matcher.ml
  2. 25 0
      tests/unit/src/unit/issues/Issue5873.hx

+ 1 - 1
src/typing/matcher.ml

@@ -672,7 +672,7 @@ module Useless = struct
 						let patterns1 = ExtList.List.make arity (PatAny,p) in
 						loop ((patterns1 @ patterns2) :: pAcc) (q1 :: qAcc) (r1 :: rAcc) pM qM rM
 					| ((PatOr(pat1,pat2)),_) :: patterns2 ->
-						specialize' is_tuple con (((pat1 :: patterns2) :: (pat2 :: patterns2) :: pAcc)) (q1 :: q1 :: qM @ qAcc) (r1 :: r1 :: rM @ rAcc)
+						loop pAcc qAcc rAcc (((pat1 :: patterns2) :: (pat2 :: patterns2) :: pM)) (q1 :: q1 :: qM) (r1 :: r1 :: rM)
 					| (PatBind(_,pat1),_) :: patterns2 ->
 						loop2 (pat1 :: patterns2)
 					| _ ->

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

@@ -0,0 +1,25 @@
+package unit.issues;
+
+class Issue5873 extends unit.Test {
+	function test() {
+		eq(1, foo("foo", "eot"));
+		eq(2, foo("LF", "x"));
+		eq(2, foo("LF", "LF"));
+		eq(2, foo("x", "LF"));
+		eq(3, foo("LV", "V"));
+		eq(3, foo("LV", "T"));
+		eq(3, foo("V", "T"));
+		eq(3, foo("V", "V"));
+		eq(4, foo("V", "x"));
+	}
+
+	static function foo(prev, next) {
+		return switch([prev,next]) {
+			case [_, 'eot']           : 1;   //A
+			case ['LF', _]
+			   | [_, 'LF']            : 2;   //B
+			case ['LV' | 'V', 'V'|'T']: 3;  //C
+			case _: 4;
+		}
+	}
+}