aboutsummaryrefslogtreecommitdiffstats
path: root/lib/compiler/src
diff options
context:
space:
mode:
authorJohn Högberg <[email protected]>2019-03-19 09:15:04 +0100
committerJohn Högberg <[email protected]>2019-03-19 09:15:04 +0100
commit47b496da10cfedeea8a0341ce13c76de3c132a57 (patch)
tree8c7cc18efcc99d73466017d4da5c9bd3f23a7051 /lib/compiler/src
parent875eef340a203264702cfda1928c78c30ed897e1 (diff)
parentb79cde3bb7ddf34b4c1f6411393feec9ef85340a (diff)
downloadotp-47b496da10cfedeea8a0341ce13c76de3c132a57.tar.gz
otp-47b496da10cfedeea8a0341ce13c76de3c132a57.tar.bz2
otp-47b496da10cfedeea8a0341ce13c76de3c132a57.zip
Merge branch 'john/compiler/fix-eq-type-infererence-in-validator/ERL-886'
* john/compiler/fix-eq-type-infererence-in-validator/ERL-886: beam_validator: Infer types on both sides of '=:='
Diffstat (limited to 'lib/compiler/src')
-rw-r--r--lib/compiler/src/beam_validator.erl14
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),