diff options
author | Björn Gustavsson <[email protected]> | 2019-01-18 11:26:45 +0100 |
---|---|---|
committer | Björn Gustavsson <[email protected]> | 2019-01-18 11:26:45 +0100 |
commit | 329aff6202d05e5eaa6d0975e6e27b1d121215ee (patch) | |
tree | be70df7b3998157be14be3e46032dbe49990721f /lib/compiler/src | |
parent | 75e0c601890d9561b103936479de0483cbcafd9d (diff) | |
parent | f9ea85611faca82c7494449ddb8bcb1ef1d194cb (diff) | |
download | otp-329aff6202d05e5eaa6d0975e6e27b1d121215ee.tar.gz otp-329aff6202d05e5eaa6d0975e6e27b1d121215ee.tar.bz2 otp-329aff6202d05e5eaa6d0975e6e27b1d121215ee.zip |
Merge branch 'bjorn/compiler/beam_validator/ERL-832'
* bjorn/compiler/beam_validator/ERL-832:
Make the beam_validator smarter (again)
Diffstat (limited to 'lib/compiler/src')
-rw-r--r-- | lib/compiler/src/beam_validator.erl | 19 |
1 files changed, 12 insertions, 7 deletions
diff --git a/lib/compiler/src/beam_validator.erl b/lib/compiler/src/beam_validator.erl index 46c689e034..3d53054f69 100644 --- a/lib/compiler/src/beam_validator.erl +++ b/lib/compiler/src/beam_validator.erl @@ -828,13 +828,14 @@ valfun_4({test,is_map,{f,Lbl},[Src]}, Vst0) -> _ -> kill_state(Vst0) end; -valfun_4({test,is_nil,{f,Lbl},[Src]}, Vst) -> - case get_term_type(Src, Vst) of - list -> - branch_state(Lbl, set_type_reg(cons, Src, Vst)); - _ -> - branch_state(Lbl, Vst) - end; +valfun_4({test,is_nil,{f,Lbl},[Src]}, Vst0) -> + Vst = case get_term_type(Src, Vst0) of + list -> + branch_state(Lbl, set_type_reg(cons, Src, Vst0)); + _ -> + branch_state(Lbl, Vst0) + end, + set_aliased_type(nil, Src, Vst); valfun_4({test,is_eq_exact,{f,Lbl},[Src,Val]=Ss}, Vst0) -> validate_src(Ss, Vst0), Infer = infer_types(Src, Vst0), @@ -1903,6 +1904,10 @@ merge_types({atom,A}, bool) -> merge_bool(A); merge_types(cons, {literal,[_|_]}) -> cons; +merge_types(cons, nil) -> + list; +merge_types(nil, cons) -> + list; merge_types({literal,[_|_]}, cons) -> cons; merge_types({literal,[_|_]}, {literal,[_|_]}) -> |