diff options
Diffstat (limited to 'lib/compiler/src/beam_validator.erl')
-rw-r--r-- | lib/compiler/src/beam_validator.erl | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/lib/compiler/src/beam_validator.erl b/lib/compiler/src/beam_validator.erl index 285db8a26a..217b7a2c97 100644 --- a/lib/compiler/src/beam_validator.erl +++ b/lib/compiler/src/beam_validator.erl @@ -1582,7 +1582,7 @@ update_create_bin_list([], Vst) -> Vst. update_create_bin_type(append) -> #t_bitstring{}; update_create_bin_type(private_append) -> #t_bitstring{}; update_create_bin_type(binary) -> #t_bitstring{}; -update_create_bin_type(float) -> #t_float{}; +update_create_bin_type(float) -> #t_number{}; update_create_bin_type(integer) -> #t_integer{}; update_create_bin_type(utf8) -> #t_integer{}; update_create_bin_type(utf16) -> #t_integer{}; @@ -3435,7 +3435,17 @@ bif_types(Op, Ss, Vst) -> Other end; {_,_} -> - beam_call_types:types(erlang, Op, Args) + Res0 = beam_call_types:types(erlang, Op, Args), + {Ret0, ArgTypes, SubSafe} = Res0, + + %% Match the non-converging range analysis done in + %% `beam_ssa_type:opt_ranges/1`. This is safe since the validator + %% doesn't have to worry about convergence. + case beam_call_types:arith_type({bif, Op}, Args) of + any -> Res0; + Ret0 -> Res0; + Ret -> {meet(Ret, Ret0), ArgTypes, SubSafe} + end end. join_tuple_elements(Tuple) -> |