diff options
author | John Högberg <[email protected]> | 2019-03-18 09:41:02 +0100 |
---|---|---|
committer | John Högberg <[email protected]> | 2019-03-18 10:18:13 +0100 |
commit | b79cde3bb7ddf34b4c1f6411393feec9ef85340a (patch) | |
tree | 44edd7607aea807e6798c24a861ee571ade57625 /lib/compiler/src | |
parent | 6f97929787126b9c602c769a97a5598e0c35bef4 (diff) | |
download | otp-b79cde3bb7ddf34b4c1f6411393feec9ef85340a.tar.gz otp-b79cde3bb7ddf34b4c1f6411393feec9ef85340a.tar.bz2 otp-b79cde3bb7ddf34b4c1f6411393feec9ef85340a.zip |
beam_validator: Infer types on both sides of '=:='
Diffstat (limited to 'lib/compiler/src')
-rw-r--r-- | lib/compiler/src/beam_validator.erl | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/lib/compiler/src/beam_validator.erl b/lib/compiler/src/beam_validator.erl index ab8caa1a0d..4fba3fa1c6 100644 --- a/lib/compiler/src/beam_validator.erl +++ b/lib/compiler/src/beam_validator.erl @@ -1595,8 +1595,11 @@ infer_types(_, #vst{}) -> infer_types_1(#value{op={bif,'=:='},args=[LHS,RHS]}) -> fun({atom,true}, S) -> - Infer = infer_types(RHS, S), - Infer(LHS, S); + %% Either side might contain something worth inferring, so we need + %% to check them both. + Infer_L = infer_types(RHS, S), + Infer_R = infer_types(LHS, S), + Infer_R(RHS, Infer_L(LHS, S)); (_, S) -> S end; infer_types_1(#value{op={bif,element},args=[{integer,Index}=Key,Tuple]}) -> @@ -1772,8 +1775,11 @@ update_ne_types(LHS, RHS, Vst) -> end. update_eq_types(LHS, RHS, Vst0) -> - Infer = infer_types(LHS, Vst0), - Vst1 = Infer(RHS, Vst0), + %% Either side might contain something worth inferring, so we need + %% to check them both. + Infer_L = infer_types(RHS, Vst0), + Infer_R = infer_types(LHS, Vst0), + Vst1 = Infer_R(RHS, Infer_L(LHS, Vst0)), T1 = get_term_type(LHS, Vst1), T2 = get_term_type(RHS, Vst1), |