Skip to content

Commit f9263f0

Browse files
committed
WIP
1 parent fd18b93 commit f9263f0

File tree

14 files changed

+116
-9
lines changed

14 files changed

+116
-9
lines changed

language/sail.ott

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -558,7 +558,9 @@ pexp :: 'Pat_' ::=
558558
{{ com pattern match }}
559559
{{ aux _ annot }} {{ auxparam 'a }}
560560
| pat => exp :: :: exp
561+
| pat1 ... patn => exp :: :: or
561562
| pat if exp1 => exp :: :: when
563+
562564
% apparently could use -> or => for this.
563565

564566
%% % psexp :: 'Pats' ::=

src/lib/ast_util.ml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1295,6 +1295,9 @@ and string_of_fexp (FE_aux (FE_fexp (field, exp), _)) = string_of_id field ^ " =
12951295
and string_of_pexp (Pat_aux (pexp, _)) =
12961296
match pexp with
12971297
| Pat_exp (pat, exp) -> string_of_pat pat ^ " => " ^ string_of_exp exp
1298+
| Pat_or (pats, exp) ->
1299+
let pat_strings = List.map (fun pat -> string_of_pat pat) pats in
1300+
String.concat ", " pat_strings ^ " => " ^ string_of_exp exp
12981301
| Pat_when (pat, guard, exp) -> string_of_pat pat ^ " if " ^ string_of_exp guard ^ " => " ^ string_of_exp exp
12991302

13001303
and string_of_typ_pat (TP_aux (tpat_aux, _)) =
@@ -1804,6 +1807,7 @@ and subst_pexp id value (Pat_aux (pexp_aux, annot)) =
18041807
match pexp_aux with
18051808
| Pat_exp (pat, exp) when IdSet.mem id (pat_ids pat) -> Pat_exp (pat, exp)
18061809
| Pat_exp (pat, exp) -> Pat_exp (pat, subst id value exp)
1810+
| Pat_or (pats, exp) -> Pat_or (pats, subst id value exp)
18071811
| Pat_when (pat, guard, exp) when IdSet.mem id (pat_ids pat) -> Pat_when (pat, guard, exp)
18081812
| Pat_when (pat, guard, exp) -> Pat_when (pat, subst id value guard, subst id value exp)
18091813
in
@@ -2296,6 +2300,7 @@ struct
22962300
else (
22972301
match aux with
22982302
| Pat_exp (pat, exp) -> option_chain (find_annot_pat sl pat) (find_annot_exp sl exp)
2303+
| Pat_or (pats, exp) -> option_chain (find_annot_pat sl (List.hd pats)) (find_annot_exp sl exp)
22992304
| Pat_when (pat, guard, exp) -> option_chain (find_annot_pat sl pat) (option_mapm (find_annot_exp sl) [guard; exp])
23002305
)
23012306

src/lib/chunk_ast.ml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -746,6 +746,7 @@ let is_aligned pexps =
746746
let rec pexp_exp_column = function
747747
| Pat_aux (Pat_attribute (_, _, pexp), _) -> pexp_exp_column pexp
748748
| Pat_aux (Pat_exp (_, E_aux (_, l)), _) -> starting_column_num l
749+
| Pat_aux (Pat_or (_, E_aux (_, l)), _) -> starting_column_num l
749750
| Pat_aux (Pat_when (_, _, E_aux (_, l)), _) -> starting_column_num l
750751
in
751752
List.fold_left
@@ -1068,6 +1069,7 @@ and chunk_pexp ?delim comments chunks (Pat_aux (aux, l)) =
10681069
(match delim with Some d -> Queue.add (Delim d) exp_chunks | _ -> ());
10691070
ignore (pop_trailing_comment comments exp_chunks (ending_line_num l));
10701071
{ funcl_space; pat = pat_chunks; guard = None; body = exp_chunks }
1072+
| Pat_or (pats, exp) -> raise (Reporting.err_unreachable l __POS__ "Pattern or is not supported in this context")
10711073
| Pat_when (pat, guard, exp) ->
10721074
let pat_chunks = Queue.create () in
10731075
chunk_pat comments pat_chunks pat;

src/lib/initial_check.ml

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -716,6 +716,9 @@ module KindInference = struct
716716
| P.Pat_exp (pat, exp) ->
717717
let* pat = infer_pat ctx pat in
718718
wrap (P.Pat_exp (pat, exp))
719+
| P.Pat_or (pats, exp) ->
720+
let* pats = mapM (infer_pat ctx) pats in
721+
wrap (P.Pat_or (pats, exp))
719722
| P.Pat_when (pat, guard, exp) ->
720723
let* pat = infer_pat ctx pat in
721724
wrap (P.Pat_when (pat, guard, exp))
@@ -1304,7 +1307,7 @@ and to_ast_exp ctx exp =
13041307
| _ -> raise (Reporting.err_unreachable l __POS__ "to_ast_fexps with true returned none")
13051308
)
13061309
| P.E_field (exp, id) -> E_field (to_ast_exp ctx exp, to_ast_id ctx id)
1307-
| P.E_match (exp, pexps) -> E_match (to_ast_exp ctx exp, List.map (to_ast_case ctx) pexps)
1310+
| P.E_match (exp, pexps) -> E_match (to_ast_exp ctx exp, List.mapi (to_ast_match_case_i ctx) pexps)
13081311
| P.E_try (exp, pexps) -> E_try (to_ast_exp ctx exp, List.map (to_ast_case ctx) pexps)
13091312
| P.E_let (leb, exp) -> E_let (to_ast_letbind ctx leb, to_ast_exp ctx exp)
13101313
| P.E_assign (lexp, exp) -> E_assign (to_ast_lexp ctx lexp, to_ast_exp ctx exp)
@@ -1391,9 +1394,27 @@ and to_ast_case ctx (P.Pat_aux (pexp_aux, l) : P.pexp) : uannot pexp =
13911394
let annot = add_attribute l attr arg annot in
13921395
Pat_aux (pexp, (pexp_l, annot))
13931396
| P.Pat_exp (pat, exp) -> Pat_aux (Pat_exp (to_ast_pat ctx pat, to_ast_exp ctx exp), (l, empty_uannot))
1397+
| P.Pat_or (pats, exp) -> raise (Reporting.err_typ l "Only Match supports pat_list")
13941398
| P.Pat_when (pat, guard, exp) ->
13951399
Pat_aux (Pat_when (to_ast_pat ctx pat, to_ast_exp ctx guard, to_ast_exp ctx exp), (l, empty_uannot))
13961400

1401+
and to_ast_match_case_i ctx i ((P.Pat_aux (pexp_aux, l) : P.pexp) as pat) : uannot pexp =
1402+
match pexp_aux with
1403+
| P.Pat_or (pats, exp) ->
1404+
let id = mk_id ("p#" ^ string_of_int i) in
1405+
let p = mk_pat (P_id id) in
1406+
let guard =
1407+
mk_exp
1408+
(E_match
1409+
( mk_exp (E_id id),
1410+
List.mapi (fun i p -> mk_pexp (Pat_exp (to_ast_pat ctx p, mk_exp (E_lit (mk_lit L_true))))) pats
1411+
@ [mk_pexp (Pat_exp (mk_pat P_wild, mk_exp (E_lit (mk_lit L_false))))]
1412+
)
1413+
)
1414+
in
1415+
Pat_aux (Pat_when (p, guard, to_ast_exp ctx exp), (l, empty_uannot))
1416+
| _ -> to_ast_case ctx pat
1417+
13971418
and to_ast_fexps (fail_on_error : bool) ctx (exps : P.exp list) : uannot fexp list option =
13981419
match exps with
13991420
| [] -> Some []

src/lib/lint.ml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ open Ast_util
5151
let scan_exp_in_pexp f (Pat_aux (aux, _)) =
5252
match aux with
5353
| Pat_exp (_, exp) -> f exp
54+
| Pat_or (_, exp) -> f exp
5455
| Pat_when (_, guard, exp) ->
5556
f guard;
5657
f exp

src/lib/parse_ast.ml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -260,6 +260,7 @@ and opt_default = Def_val_aux of opt_default_aux * l
260260
and pexp_aux =
261261
(* Pattern match *)
262262
| Pat_exp of pat * exp
263+
| Pat_or of pat list * exp
263264
| Pat_when of pat * exp * exp
264265
| Pat_attribute of string * attribute_data option * pexp
265266

src/lib/parser.mly

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -724,6 +724,8 @@ exp0:
724724
case:
725725
| p = pat; EqGt; body = exp
726726
{ mk_pexp (Pat_exp (p, body)) $startpos $endpos }
727+
| ps = pat_list; EqGt; body = exp
728+
{ mk_pexp (Pat_or (ps, body)) $startpos $endpos }
727729
| p = pat; If_; guard = exp; EqGt; body = exp
728730
{ mk_pexp (Pat_when (p, guard, body)) $startpos $endpos }
729731
| a = attribute; Lparen; c = case; Rparen

src/lib/pattern_completeness.ml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -944,6 +944,7 @@ module Make (C : Config) = struct
944944
)
945945
(* We also don't consider guarded cases *)
946946
| Pat_aux (Pat_when _, _) :: cases -> cases_to_pats ctx from ~have_guard:true ~have_mapping cases
947+
| Pat_aux (Pat_or _, _) :: cases -> cases_to_pats ctx from ~have_guard:true ~have_mapping cases
947948

948949
let rec update_cases l new_pats cases =
949950
match (new_pats, cases) with

src/lib/rewriter.ml

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,8 @@ let rewrite_pexp rewriters =
151151
let rewrite = rewriters.rewrite_exp rewriters in
152152
function
153153
| Pat_aux (Pat_exp (p, e), pannot) -> Pat_aux (Pat_exp (rewriters.rewrite_pat rewriters p, rewrite e), pannot)
154+
| Pat_aux (Pat_or (ps, e), pannot) ->
155+
Pat_aux (Pat_or (List.map (rewriters.rewrite_pat rewriters) ps, rewrite e), pannot)
154156
| Pat_aux (Pat_when (p, e, e'), pannot) ->
155157
Pat_aux (Pat_when (rewriters.rewrite_pat rewriters p, rewrite e, rewrite e'), pannot)
156158

@@ -603,6 +605,18 @@ and fold_fexp alg (FE_aux (fexp_aux, annot)) = alg.fe_aux (fold_fexp_aux alg fex
603605

604606
and fold_pexp_aux alg = function
605607
| Pat_exp (pat, e) -> alg.pat_exp (fold_pat alg.pat_alg pat, fold_exp alg e)
608+
| Pat_or (pats, e) ->
609+
let id = mk_id "p" in
610+
let guard =
611+
mk_exp
612+
(E_match
613+
( mk_exp (E_id id),
614+
List.mapi (fun i p -> mk_pexp (Pat_exp (p, mk_exp (E_lit (mk_lit L_true))))) pats
615+
@ [mk_pexp (Pat_exp (mk_pat P_wild, mk_exp (E_lit (mk_lit L_false))))]
616+
)
617+
)
618+
in
619+
alg.pat_when (mk_pat (P_id id), guard, fold_exp alg e)
606620
| Pat_when (pat, e, e') -> alg.pat_when (fold_pat alg.pat_alg pat, fold_exp alg e, fold_exp alg e')
607621

608622
and fold_pexp alg (Pat_aux (pexp_aux, annot)) = alg.pat_aux (fold_pexp_aux alg pexp_aux, annot)
@@ -923,6 +937,9 @@ let default_fold_pexp f x (Pat_aux (pe, ann)) =
923937
| Pat_exp (p, e) ->
924938
let x, e = f x e in
925939
(x, Pat_exp (p, e))
940+
| Pat_or (ps, e) ->
941+
let x, e = f x e in
942+
(x, Pat_or (ps, e))
926943
| Pat_when (p, e1, e2) ->
927944
let x, e1 = f x e1 in
928945
let x, e2 = f x e2 in

src/lib/rewrites.ml

Lines changed: 46 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -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

10541058
let 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

10591064
let 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

Comments
 (0)