summaryrefslogtreecommitdiff
path: root/compiler/PureMicroPasses.ml
diff options
context:
space:
mode:
authorSon Ho2022-11-14 11:57:53 +0100
committerSon HO2022-11-14 14:21:04 +0100
commit868fa924a37a3af6e701bbc0a2d51fefc2dc7c33 (patch)
treee770fe4d89baf7b1017d2c88d9f866eb54a56ce3 /compiler/PureMicroPasses.ml
parent019a9e34e6375a5e015e4978aad89aa8febc237c (diff)
Make [Result::Failure] type an [Error] parameter
Diffstat (limited to '')
-rw-r--r--compiler/PureMicroPasses.ml21
1 files changed, 17 insertions, 4 deletions
diff --git a/compiler/PureMicroPasses.ml b/compiler/PureMicroPasses.ml
index 1cb35613..c5eb3c64 100644
--- a/compiler/PureMicroPasses.ml
+++ b/compiler/PureMicroPasses.ml
@@ -123,7 +123,7 @@ type pn_ctx = {
{[
let py = id(&mut x);
*py = 2;
- assert!(x == 2);
+ assert!(x = 2);
]}
After desugaring, we get the following MIR:
@@ -131,7 +131,7 @@ type pn_ctx = {
^0 = &mut x; // anonymous variable
py = id(move ^0);
*py += 2;
- assert!(x == 2);
+ assert!(x = 2);
]}
We want this to be translated as:
@@ -1228,6 +1228,9 @@ let unfold_monadic_let_bindings (_ctx : trans_ctx) (def : fun_decl) : fun_decl =
match def.body with
| None -> def
| Some body ->
+ let cnt = get_body_min_var_counter body in
+ let _, fresh_id = VarId.mk_stateful_generator cnt in
+
(* It is a very simple map *)
let obj =
object (_self)
@@ -1257,8 +1260,18 @@ let unfold_monadic_let_bindings (_ctx : trans_ctx) (def : fun_decl) : fun_decl =
* store in an enum ("monadic" should be an enum, not a bool). *)
let re_ty = Option.get (opt_destruct_result re.ty) in
assert (lv.ty = re_ty);
- let fail_pat = mk_result_fail_pattern lv.ty in
- let fail_value = mk_result_fail_texpression e.ty in
+ let err_vid = fresh_id () in
+ let err_var : var =
+ {
+ id = err_vid;
+ basename = Some ConstStrings.error_basename;
+ ty = mk_error_ty;
+ }
+ in
+ let err_pat = mk_typed_pattern_from_var err_var None in
+ let fail_pat = mk_result_fail_pattern err_pat.value lv.ty in
+ let err_v = mk_texpression_from_var err_var in
+ let fail_value = mk_result_fail_texpression err_v e.ty in
let fail_branch = { pat = fail_pat; branch = fail_value } in
let success_pat = mk_result_return_pattern lv in
let success_branch = { pat = success_pat; branch = e } in