diff --git a/src/typing/typer.ml b/src/typing/typer.ml index 682ceba6c37..2615606783d 100644 --- a/src/typing/typer.ml +++ b/src/typing/typer.ml @@ -36,10 +36,12 @@ open Operators (* ---------------------------------------------------------------------- *) (* TOOLS *) -let mono_or_dynamic ctx with_type p = match with_type with +let terminator_type ctx with_type p = match with_type with | WithType.NoValue -> t_dynamic - | Value _ | WithType _ -> + | WithType(t,_) -> + t + | Value _ -> spawn_monomorph ctx p let get_iterator_param t = @@ -1475,7 +1477,7 @@ and type_return ?(implicit=false) ctx e with_type p = match e with | None when is_abstract_ctor -> let e_cast = mk (TCast(get_this ctx p,None)) ctx.e.ret p in - mk (TReturn (Some e_cast)) (mono_or_dynamic ctx with_type p) p + mk (TReturn (Some e_cast)) (terminator_type ctx with_type p) p | None -> let v = ctx.t.tvoid in unify ctx v ctx.e.ret p; @@ -1484,7 +1486,7 @@ and type_return ?(implicit=false) ctx e with_type p = | WithType.Value (Some ImplicitReturn) -> true | _ -> false in - mk (TReturn None) (if expect_void then v else (mono_or_dynamic ctx with_type p)) p + mk (TReturn None) (if expect_void then v else (terminator_type ctx with_type p)) p | Some e -> if is_abstract_ctor then begin match fst e with @@ -1510,20 +1512,20 @@ and type_return ?(implicit=false) ctx e with_type p = | _ -> () end; (* if we get a Void expression (e.g. from inlining) we don't want to return it (issue #4323) *) - let t = mono_or_dynamic ctx with_type p in + let t = terminator_type ctx with_type p in mk (TBlock [ e; mk (TReturn None) t p ]) t e.epos; | _ -> - mk (TReturn (Some e)) (mono_or_dynamic ctx with_type p) p + mk (TReturn (Some e)) (terminator_type ctx with_type p) p with Error err -> let p = err.err_pos in check_error ctx err; (* If we have a bad return, let's generate a return null expression at least. This surpresses various follow-up errors that come from the fact that the function no longer has a return expression (issue #6445). *) let e_null = mk (TConst TNull) (mk_mono()) p in - mk (TReturn (Some e_null)) (mono_or_dynamic ctx with_type p) p + mk (TReturn (Some e_null)) (terminator_type ctx with_type p) p and type_cast ctx e t p = let tpos = pos t in @@ -1952,7 +1954,7 @@ and type_expr ?(mode=MGet) ctx (e,p) (with_type:WithType.t) = display_error ctx.com "Return outside function" p; match e with | None -> - Texpr.Builder.make_null (mono_or_dynamic ctx with_type p) p + Texpr.Builder.make_null (terminator_type ctx with_type p) p | Some e -> (* type the return expression to see if there are more errors as well as use its type as if there was no `return`, since @@ -1962,10 +1964,10 @@ and type_expr ?(mode=MGet) ctx (e,p) (with_type:WithType.t) = type_return ctx e with_type p | EBreak -> if not ctx.e.in_loop then display_error ctx.com "Break outside loop" p; - mk TBreak (mono_or_dynamic ctx with_type p) p + mk TBreak (terminator_type ctx with_type p) p | EContinue -> if not ctx.e.in_loop then display_error ctx.com "Continue outside loop" p; - mk TContinue (mono_or_dynamic ctx with_type p) p + mk TContinue (terminator_type ctx with_type p) p | ETry (e1,[]) -> type_expr ctx e1 with_type | ETry (e1,catches) -> @@ -1977,7 +1979,7 @@ and type_expr ?(mode=MGet) ctx (e,p) (with_type:WithType.t) = check_error ctx err; Texpr.Builder.make_null t_dynamic p in - mk (TThrow e) (mono_or_dynamic ctx with_type p) p + mk (TThrow e) (terminator_type ctx with_type p) p | ENew (t,el) -> type_new ctx t el with_type false p | EUnop (op,flag,e) ->