فهرست منبع

filter _ | x patterns

Simon Krajewski 12 سال پیش
والد
کامیت
cced1d3393
1فایلهای تغییر یافته به همراه19 افزوده شده و 14 حذف شده
  1. 19 14
      matcher.ml

+ 19 - 14
matcher.ml

@@ -386,8 +386,6 @@ let to_pattern ctx e t =
 				mk_con_pat (CArray (List.length el)) pl t p
 			| _ ->
 				error ((s_type (print_context()) t) ^ " should be Array") p)
-		| (EBinop(OpOr,(EBinop(OpOr,e1,e2),p2),e3),p1) ->
-			loop tctx (EBinop(OpOr,e1,(EBinop(OpOr,e2,e3),p2)),p1) t
 		| (EBinop(OpAssign,(EConst(Ident s),p2),e1),p) ->
 			let v = mk_var tctx s t p in
 			let pat1 = loop tctx e1 t in
@@ -396,21 +394,28 @@ let to_pattern ctx e t =
 				ptype = t;
 				ppos = p2;
 			};
+		| (EBinop(OpOr,(EBinop(OpOr,e1,e2),p2),e3),p1) ->
+			loop tctx (EBinop(OpOr,e1,(EBinop(OpOr,e2,e3),p2)),p1) t
 		| (EBinop(OpOr,e1,e2),p) ->
 			let old = tctx.pc_locals in
 			let pat1 = loop tctx e1 t in
-			let tctx2 = {
-				pc_sub_vars = Some tctx.pc_locals;
-				pc_locals = old;
-			} in
-			let pat2 = loop tctx2 e2 t in
-			PMap.iter (fun s _ -> if not (PMap.mem s tctx2.pc_locals) then verror s p) tctx.pc_locals;
-			unify ctx pat1.ptype pat2.ptype pat1.ppos;
-			{
-				pdef = PatOr(pat1,pat2);
-				ptype = pat2.ptype;
-				ppos = punion pat1.ppos pat2.ppos;
-			}
+			(match pat1.pdef with
+			| PatAny | PatVar _ ->
+				ctx.com.warning "This pattern is unused" (pos e2);
+				pat1
+			| _ ->
+				let tctx2 = {
+					pc_sub_vars = Some tctx.pc_locals;
+					pc_locals = old;
+				} in
+				let pat2 = loop tctx2 e2 t in
+				PMap.iter (fun s _ -> if not (PMap.mem s tctx2.pc_locals) then verror s p) tctx.pc_locals;
+				unify ctx pat1.ptype pat2.ptype pat1.ppos;
+				{
+					pdef = PatOr(pat1,pat2);
+					ptype = pat2.ptype;
+					ppos = punion pat1.ppos pat2.ppos;
+				})
 		| (_,p) ->
 			ctx.com.warning "Unrecognized pattern, falling back to normal switch" p;
 			raise Exit