|
@@ -1124,12 +1124,14 @@ let match_expr ctx e cases def with_type p =
|
|
let monos = List.map (fun _ -> mk_mono()) ctx.type_params in
|
|
let monos = List.map (fun _ -> mk_mono()) ctx.type_params in
|
|
let t = apply_params ctx.type_params monos t in
|
|
let t = apply_params ctx.type_params monos t in
|
|
let pl = [add_pattern_locals (to_pattern ctx ep t)] in
|
|
let pl = [add_pattern_locals (to_pattern ctx ep t)] in
|
|
|
|
+ let old_ret = ctx.ret in
|
|
|
|
+ ctx.ret <- apply_params ctx.type_params monos ctx.ret;
|
|
let restore = PMap.fold (fun v acc ->
|
|
let restore = PMap.fold (fun v acc ->
|
|
(* apply context monomorphs to locals and replace them back after typing the case body *)
|
|
(* apply context monomorphs to locals and replace them back after typing the case body *)
|
|
let t = v.v_type in
|
|
let t = v.v_type in
|
|
v.v_type <- apply_params ctx.type_params monos v.v_type;
|
|
v.v_type <- apply_params ctx.type_params monos v.v_type;
|
|
(fun () -> v.v_type <- t) :: acc
|
|
(fun () -> v.v_type <- t) :: acc
|
|
- ) ctx.locals [] in
|
|
|
|
|
|
+ ) ctx.locals [fun() -> ctx.ret <- old_ret] in
|
|
(* turn any still unknown types back to type parameters *)
|
|
(* turn any still unknown types back to type parameters *)
|
|
List.iter2 (fun m (_,t) -> match follow m with TMono _ -> Type.unify m t | _ -> ()) monos ctx.type_params;
|
|
List.iter2 (fun m (_,t) -> match follow m with TMono _ -> Type.unify m t | _ -> ()) monos ctx.type_params;
|
|
pl,restore,(match with_type with
|
|
pl,restore,(match with_type with
|