浏览代码

catch empty sub-term list when pattern matching (closes #3150)

Simon Krajewski 11 年之前
父节点
当前提交
18a19b8596
共有 2 个文件被更改,包括 21 次插入2 次删除
  1. 9 2
      matcher.ml
  2. 12 0
      tests/unit/issues/Issue3150.hx

+ 9 - 2
matcher.ml

@@ -889,7 +889,9 @@ let rec compile mctx stl pmat toplevel =
 					raise (Not_exhaustive(collapse_pattern pl,st))
 			end
 		| _ ->
-			assert false)
+			(* This can happen in cases a value is required and all default cases are guarded (issue #3150).
+			   Not a particularly elegant solution, may want to revisit this later. *)
+			raise Exit)
 	| ([|{p_def = PTuple pt}|],out) :: pl ->
 		compile mctx stl ((pt,out) :: pl) toplevel
 	| (pv,out) :: pl ->
@@ -952,7 +954,12 @@ let rec compile mctx stl pmat toplevel =
 				compile mctx st_tail def false
 			| def,_ ->
 				let cdef = mk_con CAny t_dynamic st_head.st_pos in
-				let cases = cases @ [cdef,compile mctx st_tail def false] in
+				let def = try
+					compile mctx st_tail def false
+				with Exit ->
+					raise (Not_exhaustive(any,st_head))
+				in
+				let cases = cases @ [cdef,def] in
 				switch st_head cases
 			in
 			if bl = [] then dt else bind bl dt

+ 12 - 0
tests/unit/issues/Issue3150.hx

@@ -0,0 +1,12 @@
+package unit.issues;
+
+class Issue3150 extends Test {
+	function test() {
+		t(unit.TestType.typeError(
+			var d = switch (2) {
+				case 3: 90;
+				case f if (f == 0 | 2): -135;
+			}
+		));
+	}
+}