Browse Source

apply context type parameters to return type while matching to support GADT

Simon Krajewski 11 years ago
parent
commit
7468243e6f
1 changed files with 3 additions and 1 deletions
  1. 3 1
      matcher.ml

+ 3 - 1
matcher.ml

@@ -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 t = apply_params ctx.type_params monos 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 ->
 						(* apply context monomorphs to locals and replace them back after typing the case body *)
 						let t = v.v_type in
 						v.v_type <- apply_params ctx.type_params monos v.v_type;
 						(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 *)
 					List.iter2 (fun m (_,t) -> match follow m with TMono _ -> Type.unify m t | _ -> ()) monos ctx.type_params;
 					pl,restore,(match with_type with