summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorThomas Bauereiss2018-07-07 22:49:42 +0100
committerThomas Bauereiss2018-07-09 14:47:52 +0100
commit3334e0f9de700ed918e5f8c461f8cf08d23e7fd3 (patch)
tree154df6881d631c70981756274d41db97bef21411 /src
parent4eab8dcb613e5eb07414930d715d8b9340fa99f9 (diff)
Fix bug in rewriting of try-catch-blocks with variable updates
Diffstat (limited to 'src')
-rw-r--r--src/rewrites.ml17
1 files changed, 11 insertions, 6 deletions
diff --git a/src/rewrites.ml b/src/rewrites.ml
index 481a1c25..fad1f4d2 100644
--- a/src/rewrites.ml
+++ b/src/rewrites.ml
@@ -3539,11 +3539,12 @@ let rec rewrite_var_updates ((E_aux (expaux,((l,_) as annot))) as exp) =
let eff = union_eff_exps [c;e1;e2] in
let v = E_aux (E_if (c,e1,e2), (gen_loc el, Some (env, typ, eff))) in
Added_vars (v, tuple_pat (if overwrite then varpats else pat :: varpats))
- | E_case (e1,ps) ->
- (* after rewrite_defs_letbind_effects e1 needs no rewriting *)
+ | E_case (e1,ps) | E_try (e1, ps) ->
+ let is_case = match expaux with E_case _ -> true | _ -> false in
let vars, varpats =
- ps
- |> List.map (fun (Pat_aux ((Pat_exp (_,e)|Pat_when (_,_,e)),_)) -> e)
+ (* for E_case, e1 needs no rewriting after rewrite_defs_letbind_effects *)
+ ((if is_case then [] else [e1]) @
+ List.map (fun (Pat_aux ((Pat_exp (_,e)|Pat_when (_,_,e)),_)) -> e) ps)
|> List.map find_updated_vars
|> List.fold_left IdSet.union IdSet.empty
|> IdSet.inter used_vars
@@ -3554,8 +3555,10 @@ let rec rewrite_var_updates ((E_aux (expaux,((l,_) as annot))) as exp) =
Pat_aux (Pat_exp (p,rewrite_var_updates e),a)
| Pat_aux (Pat_when (p,g,e),a) ->
Pat_aux (Pat_when (p,g,rewrite_var_updates e),a)) ps in
- Same_vars (E_aux (E_case (e1,ps),annot))
+ let expaux = if is_case then E_case (e1, ps) else E_try (e1, ps) in
+ Same_vars (E_aux (expaux, annot))
else
+ let e1 = if is_case then e1 else rewrite_var_updates (add_vars overwrite e1 vars) in
let rewrite_pexp (Pat_aux (pexp, (l, _))) = match pexp with
| Pat_exp (pat, exp) ->
let exp = rewrite_var_updates (add_vars overwrite exp vars) in
@@ -3564,10 +3567,12 @@ let rec rewrite_var_updates ((E_aux (expaux,((l,_) as annot))) as exp) =
| Pat_when _ ->
raise (Reporting_basic.err_unreachable l
"Guarded patterns should have been rewritten already") in
+ let ps = List.map rewrite_pexp ps in
+ let expaux = if is_case then E_case (e1, ps) else E_try (e1, ps) in
let typ = match ps with
| Pat_aux ((Pat_exp (_,first)|Pat_when (_,_,first)),_) :: _ -> typ_of first
| _ -> unit_typ in
- let v = fix_eff_exp (annot_exp (E_case (e1, List.map rewrite_pexp ps)) pl env typ) in
+ let v = fix_eff_exp (annot_exp expaux pl env typ) in
Added_vars (v, tuple_pat (if overwrite then varpats else pat :: varpats))
| E_assign (lexp,vexp) ->
let mk_id_pat id = match Env.lookup_id id env with