summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBrian Campbell2019-06-03 18:28:47 +0100
committerBrian Campbell2019-06-03 18:28:47 +0100
commitd076ac77dfbb4ff683bc57cb58c52f497f0e4618 (patch)
tree2d36b1a4862d661b23d049ebf78b1b45b25659cd /src
parentd89b97959852f506693bab49bb2a86812bb07c2b (diff)
Coq: support non-exhaustive pattern rewrite for exception handling
Diffstat (limited to 'src')
-rw-r--r--src/rewrites.ml12
1 files changed, 9 insertions, 3 deletions
diff --git a/src/rewrites.ml b/src/rewrites.ml
index c10d931d..84f23c77 100644
--- a/src/rewrites.ml
+++ b/src/rewrites.ml
@@ -4338,12 +4338,18 @@ let funcl_loc (FCL_aux (_,(l,_))) = l
let rewrite_case (e,ann) =
match e with
- | E_case (e1,cases) ->
+ | E_case (e1,cases)
+ | E_try (e1,cases) ->
begin
let env = env_of_annot ann in
let cases, rps = check_cases (process_pexp env) pexp_is_wild pexp_loc cases in
+ let rebuild cases = match e with
+ | E_case _ -> E_case (e1,cases)
+ | E_try _ -> E_try (e1,cases)
+ | _ -> assert false
+ in
match rps with
- | [] -> E_aux (E_case (e1,cases),ann)
+ | [] -> E_aux (rebuild cases,ann)
| (example::_) ->
let _ =
@@ -4356,7 +4362,7 @@ let rewrite_case (e,ann) =
let ann' = mk_tannot env (typ_of_annot ann) (mk_effect [BE_escape]) in
(* TODO: use an expression that specifically indicates a failed pattern match *)
let b = E_aux (E_exit (E_aux (E_lit (L_aux (L_unit, l)),(l,empty_tannot))),(l,ann')) in
- E_aux (E_case (e1,cases@[Pat_aux (Pat_exp (p,b),(l,empty_tannot))]),ann)
+ E_aux (rebuild (cases@[Pat_aux (Pat_exp (p,b),(l,empty_tannot))]),ann)
end
| E_let (LB_aux (LB_val (pat,e1),lb_ann),e2) ->
begin