@@ -627,6 +627,10 @@ let rewrite_exp_remove_vector_concat_pat rewriters (E_aux (exp, (l, annot)) as f
627627 | Pat_aux (Pat_exp (pat , body ), annot' ) ->
628628 let pat, _, decls = remove_vector_concat_pat pat in
629629 Pat_aux (Pat_exp (pat, decls (rewrite_rec body)), annot')
630+ | Pat_aux (Pat_or (pats , body ), annot' ) ->
631+ raise (Reporting. err_unreachable l __POS__ " Pat_or should have been rewritten away" )
632+ (* let pat, _, decls = remove_vector_concat_pat pat in
633+ Pat_aux (Pat_exp (pat, decls (rewrite_rec body)), annot') *)
630634 | Pat_aux (Pat_when (pat , guard , body ), annot' ) ->
631635 let pat, _, decls = remove_vector_concat_pat pat in
632636 Pat_aux (Pat_when (pat, decls (rewrite_rec guard), decls (rewrite_rec body)), annot')
@@ -1053,7 +1057,8 @@ let rec contains_bitvector_pat (P_aux (pat, annot)) =
10531057
10541058let contains_bitvector_pexp = function
10551059 | Pat_aux (Pat_exp (pat , _ ), _ ) | Pat_aux (Pat_when (pat , _ , _ ), _ ) -> contains_bitvector_pat pat
1056-
1060+ | Pat_aux (Pat_or (pats , body ), annot' ) ->
1061+ raise (Reporting. err_unreachable Parse_ast. Unknown __POS__ " Pat_or should have been rewritten away" )
10571062(* Rewrite bitvector patterns to guarded patterns *)
10581063
10591064let remove_bitvector_pat (P_aux (_ , (l , _ )) as pat ) =
@@ -1284,6 +1289,8 @@ let rewrite_exp_remove_bitvector_pat rewriters (E_aux (exp, (l, annot)) as full_
12841289 | Some guard' -> Pat_aux (Pat_when (pat', guard', body'), annot')
12851290 | None -> Pat_aux (Pat_exp (pat', body'), annot')
12861291 )
1292+ | Pat_aux (Pat_or (pats , body ), annot' ) ->
1293+ raise (Reporting. err_unreachable l __POS__ " Pat_or should have been rewritten away" )
12871294 | Pat_aux (Pat_when (pat , guard , body ), annot' ) -> (
12881295 let pat', (guard', decls, _) = remove_bitvector_pat pat in
12891296 let guard'' = rewrite_rec guard in
@@ -1440,6 +1447,9 @@ let rewrite_exp_guarded_pats rewriters (E_aux (exp, (l, annot)) as full_exp) =
14401447 in
14411448 let clause = function
14421449 | Pat_aux (Pat_exp (pat , body ), annot ) -> (pat, None , rewrite_rec body, annot)
1450+ | Pat_aux (Pat_or (pat , body ), annot ) ->
1451+ (* TODO *)
1452+ raise (Reporting. err_unreachable l __POS__ " Pat_or should have been rewritten away" )
14431453 | Pat_aux (Pat_when (pat , guard , body ), annot ) -> (pat, Some (rewrite_rec guard), rewrite_rec body, annot)
14441454 in
14451455 let clauses =
@@ -1460,6 +1470,8 @@ let rewrite_exp_guarded_pats rewriters (E_aux (exp, (l, annot)) as full_exp) =
14601470 let e = rewrite_rec e in
14611471 let clause = function
14621472 | Pat_aux (Pat_exp (pat , body ), annot ) -> (pat, None , rewrite_rec body, annot)
1473+ | Pat_aux (Pat_or (pats , body ), annot' ) ->
1474+ raise (Reporting. err_unreachable l __POS__ " Pat_or should have been rewritten away" )
14631475 | Pat_aux (Pat_when (pat , guard , body ), annot ) -> (pat, Some (rewrite_rec guard), rewrite_rec body, annot)
14641476 in
14651477 let clauses =
@@ -1647,15 +1659,19 @@ let rewrite_ast_early_return effect_info env ast =
16471659 in
16481660
16491661 let e_case (e , pes ) =
1650- let is_return_pexp (Pat_aux (pexp , _ )) = match pexp with Pat_exp (_ , e ) | Pat_when (_ , _ , e ) -> is_return e in
1662+ let is_return_pexp (Pat_aux (pexp , _ )) =
1663+ match pexp with Pat_exp (_ , e ) | Pat_or (_ , e ) | Pat_when (_ , _ , e ) -> is_return e
1664+ in
16511665 let get_return_pexp (Pat_aux (pexp , a )) =
16521666 match pexp with
16531667 | Pat_exp (p , e ) -> Pat_aux (Pat_exp (p, get_return e), a)
1668+ | Pat_or (ps , e ) -> Pat_aux (Pat_or (ps, get_return e), a)
16541669 | Pat_when (p , g , e ) -> Pat_aux (Pat_when (p, g, get_return e), a)
16551670 in
16561671 let annot =
16571672 match List. map get_return_pexp pes with
16581673 | Pat_aux (Pat_exp (_ , E_aux (_ , annot )), _ ) :: _ -> annot
1674+ | Pat_aux (Pat_or (_ , E_aux (_ , annot )), _ ) :: _ -> annot
16591675 | Pat_aux (Pat_when (_ , _ , E_aux (_ , annot )), _ ) :: _ -> annot
16601676 | [] -> (Parse_ast. Unknown , empty_tannot)
16611677 in
@@ -1705,6 +1721,7 @@ let rewrite_ast_early_return effect_info env ast =
17051721 | E_match (e , pes ) ->
17061722 let add_final_return_pexp = function
17071723 | Pat_aux (Pat_exp (p , e ), a ) -> Pat_aux (Pat_exp (p, add_final_return true e), a)
1724+ | Pat_aux (Pat_or (p , e ), a ) -> Pat_aux (Pat_or (p, add_final_return true e), a)
17081725 | Pat_aux (Pat_when (p , g , e ), a ) -> Pat_aux (Pat_when (p, g, add_final_return true e), a)
17091726 in
17101727 rewrap (E_match (e, List. map add_final_return_pexp pes))
@@ -1953,6 +1970,8 @@ let rewrite_split_fun_ctor_pats fun_name effect_info env ast =
19531970 match pexp with
19541971 | Pat_exp (pat , exp ) ->
19551972 FCL_aux (FCL_funcl (id, Pat_aux (Pat_exp (pat, optimize_exp exp), pann)), fannot)
1973+ | Pat_or (pats , exp ) ->
1974+ FCL_aux (FCL_funcl (id, Pat_aux (Pat_or (pats, optimize_exp exp), pann)), fannot)
19561975 | Pat_when (pat , guard , exp ) ->
19571976 FCL_aux
19581977 ( FCL_funcl
@@ -2273,6 +2292,7 @@ let rewrite_ast_letbind_effects effect_info env =
22732292 fun newreturn pexp k ->
22742293 match pexp with
22752294 | Pat_aux (Pat_exp (pat , exp ), annot ) -> k (Pat_aux (Pat_exp (pat, n_exp_term newreturn exp), annot))
2295+ | Pat_aux (Pat_or (pats , exp ), annot ) -> k (Pat_aux (Pat_or (pats, n_exp_term newreturn exp), annot))
22762296 | Pat_aux (Pat_when (pat , guard , exp ), annot ) ->
22772297 k (Pat_aux (Pat_when (pat, n_exp_term newreturn guard, n_exp_term newreturn exp), annot))
22782298 and n_pexpL (newreturn : bool ) (pexps : 'a pexp list ) (k : 'a pexp list -> 'a exp ) : 'a exp =
@@ -2579,6 +2599,9 @@ let rewrite_ast_pat_lits rewrite_lit env ast =
25792599 annot
25802600 )
25812601 end
2602+ | Pat_or (pats , exp ) ->
2603+ (* TODO *)
2604+ raise (Reporting. err_todo Parse_ast. Unknown " Pat_or should have been rewritten away" )
25822605 | Pat_when (pat , guard , exp ) -> begin
25832606 let pat = fold_pat { id_pat_alg with p_aux = rewrite_pat } pat in
25842607 let guard_annot = (fst annot, mk_tannot (env_of exp) bool_typ) in
@@ -2818,7 +2841,8 @@ let rec rewrite_var_updates (E_aux (expaux, ((l, _) as annot)) as exp) =
28182841 let is_case = match expaux with E_match _ -> true | _ -> false in
28192842 let vars, varpats =
28202843 (* for E_match, e1 needs no rewriting after rewrite_ast_letbind_effects *)
2821- (if is_case then [] else [e1]) @ List. map (fun (Pat_aux ((Pat_exp (_ , e ) | Pat_when (_ , _ , e )), _ )) -> e) ps
2844+ (if is_case then [] else [e1])
2845+ @ List. map (fun (Pat_aux ((Pat_exp (_ , e ) | Pat_or (_ , e ) | Pat_when (_ , _ , e )), _ )) -> e) ps
28222846 |> List. map find_updated_vars |> List. fold_left IdSet. union IdSet. empty |> IdSet. inter used_vars
28232847 |> mk_var_exps_pats pl env
28242848 in
@@ -2828,6 +2852,7 @@ let rec rewrite_var_updates (E_aux (expaux, ((l, _) as annot)) as exp) =
28282852 List. map
28292853 (function
28302854 | Pat_aux (Pat_exp (p , e ), a ) -> Pat_aux (Pat_exp (p, rewrite_var_updates e), a)
2855+ | Pat_aux (Pat_or (p , e ), a ) -> Pat_aux (Pat_or (p, rewrite_var_updates e), a)
28312856 | Pat_aux (Pat_when (p , g , e ), a ) -> Pat_aux (Pat_when (p, g, rewrite_var_updates e), a)
28322857 )
28332858 ps
@@ -2842,7 +2867,7 @@ let rec rewrite_var_updates (E_aux (expaux, ((l, _) as annot)) as exp) =
28422867 let exp = rewrite_var_updates (add_vars overwrite exp vars) in
28432868 let pannot = (l, mk_tannot (env_of exp) (typ_of exp)) in
28442869 Pat_aux (Pat_exp (pat, exp), pannot)
2845- | Pat_when _ ->
2870+ | Pat_or _ | Pat_when _ ->
28462871 raise (Reporting. err_unreachable l __POS__ " Guarded patterns should have been rewritten already" )
28472872 in
28482873 let ps = List. map rewrite_pexp ps in
@@ -3057,6 +3082,10 @@ let rewrite_ast_not_pats env =
30573082 in
30583083 match pexp_aux with
30593084 | Pat_exp (pat , exp ) -> rewrite_pexp' pat exp None
3085+ | Pat_or (pats , exp ) ->
3086+ (* TODO *)
3087+ raise (Reporting. err_unreachable Parse_ast. Unknown __POS__ " Pat_or should have been rewritten away" )
3088+ (* rewrite_pexp' pats exp None *)
30603089 | Pat_when (pat , guard , exp ) -> rewrite_pexp' pat exp (Some (strip_exp guard))
30613090 in
30623091 let rw_exp = { id_exp_alg with pat_aux = rewrite_pexp } in
@@ -3222,6 +3251,7 @@ let rewrite_ast_realize_mappings effect_info env ast =
32223251 in
32233252 let true_pexp = function
32243253 | Pat_aux (Pat_exp (pat , _ ), annot ) -> Pat_aux (Pat_exp (pat, mk_lit_exp L_true ), annot)
3254+ | Pat_aux (Pat_or (pats , _ ), annot ) -> Pat_aux (Pat_or (pats, mk_lit_exp L_true ), annot)
32253255 | Pat_aux (Pat_when (pat , guard , _ ), annot ) -> Pat_aux (Pat_when (pat, guard, mk_lit_exp L_true ), annot)
32263256 in
32273257 let annotate_pat ~last = function
@@ -3679,7 +3709,7 @@ module MakeExhaustive = struct
36793709 | Pat_aux (Pat_exp (p , _ ), _ ) ->
36803710 let rps, progress = List. split (List. map (remove_clause_from_pattern ctx p) rps) in
36813711 (List. concat rps, List. exists (fun b -> b) progress)
3682- | Pat_aux (Pat_when _ , (l , _ )) ->
3712+ | Pat_aux (Pat_or _ , ( l , _ )) | Pat_aux ( Pat_when _ , (l , _ )) ->
36833713 raise (Reporting. err_unreachable l __POS__ " Guarded pattern should have been rewritten away" )
36843714
36853715 let check_cases process is_wild loc_of cases =
@@ -3701,13 +3731,22 @@ module MakeExhaustive = struct
37013731
37023732 let not_enum env id = match Env. lookup_id id env with Enum _ -> false | _ -> true
37033733
3734+ let paux_is_wild = function
3735+ | P_aux (P_wild, _ ) -> true
3736+ | P_aux (P_id id , ann ) when not_enum (env_of_annot ann) id -> true
3737+ | _ -> false
3738+
37043739 let pexp_is_wild = function
3705- | Pat_aux (Pat_exp (P_aux (P_wild , _ ), _ ), _ ) -> true
3706- | Pat_aux (Pat_exp (P_aux (P_id id , ann ), _ ), _ ) when not_enum (env_of_annot ann) id -> true
3740+ | Pat_aux (Pat_exp (p , _ ), _ ) -> paux_is_wild p
3741+ | Pat_aux (Pat_or ( ps , _ ), _ ) -> List. exists paux_is_wild ps
37073742 | _ -> false
37083743
37093744 let pexp_loc = function
37103745 | Pat_aux (Pat_exp (P_aux (_ , (l , _ )), _ ), _ ) -> l
3746+ | Pat_aux (Pat_or (ps , _ ), _ ) ->
3747+ let (P_aux (_, (l, _))) = List. hd ps in
3748+ (* TODO: make l to range *)
3749+ l
37113750 | Pat_aux (Pat_when (P_aux (_ , (l , _ )), _ , _ ), _ ) -> l
37123751
37133752 let funcl_is_wild = function FCL_aux (FCL_funcl (_ , pexp ), _ ) -> pexp_is_wild pexp
0 commit comments