Skip to content

Commit

Permalink
don't create monos on control flow terminator if we have an expected …
Browse files Browse the repository at this point in the history
…type

In most cases they won't be unified with anything, so we might as well use the expected type directly.
  • Loading branch information
Simn committed Dec 18, 2024
1 parent f4d631d commit 683c11e
Showing 1 changed file with 13 additions and 11 deletions.
24 changes: 13 additions & 11 deletions src/typing/typer.ml
Original file line number Diff line number Diff line change
Expand Up @@ -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 =
Expand Down Expand Up @@ -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;
Expand All @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -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
Expand All @@ -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) ->
Expand All @@ -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) ->
Expand Down

0 comments on commit 683c11e

Please sign in to comment.