aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHans Bolinder <[email protected]>2019-02-11 08:59:05 +0100
committerHans Bolinder <[email protected]>2019-02-11 08:59:05 +0100
commit5a5e34ab31417f0cea2859ea8e22c04f59e82193 (patch)
treebd494099f42ac729836d6798250e13ee85c8f2f7
parenteac67ca98374701eb27be53836a216e8600be4aa (diff)
parentfbb6ee2fa4fca7b908fcd502c769a66420765b36 (diff)
downloadotp-5a5e34ab31417f0cea2859ea8e22c04f59e82193.tar.gz
otp-5a5e34ab31417f0cea2859ea8e22c04f59e82193.tar.bz2
otp-5a5e34ab31417f0cea2859ea8e22c04f59e82193.zip
Merge branch 'maint'
* maint: dialyzer: Fix a bug affecting keyfind/keysearch/keymember
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/lists_key_bug.erl19
-rw-r--r--lib/hipe/cerl/erl_bif_types.erl6
2 files changed, 20 insertions, 5 deletions
diff --git a/lib/dialyzer/test/small_SUITE_data/src/lists_key_bug.erl b/lib/dialyzer/test/small_SUITE_data/src/lists_key_bug.erl
new file mode 100644
index 0000000000..d7cbc27a4d
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/src/lists_key_bug.erl
@@ -0,0 +1,19 @@
+-module(lists_key_bug).
+
+%% OTP-15570
+
+-export([t/1]).
+
+t(V) ->
+ K = key(V),
+ case lists:keyfind(K, 1, [{<<"foo">>, bar}]) of
+ false ->
+ a;
+ {_, _} ->
+ b
+ end.
+
+key(1) ->
+ 3;
+key(2) ->
+ <<"foo">>.
diff --git a/lib/hipe/cerl/erl_bif_types.erl b/lib/hipe/cerl/erl_bif_types.erl
index 48ce641ab9..799957dfdc 100644
--- a/lib/hipe/cerl/erl_bif_types.erl
+++ b/lib/hipe/cerl/erl_bif_types.erl
@@ -2224,11 +2224,7 @@ type_order() ->
[t_number(), t_atom(), t_reference(), t_fun(), t_port(), t_pid(), t_tuple(),
t_map(), t_list(), t_bitstr()].
-key_comparisons_fail(X0, KeyPos, TupleList, Opaques) ->
- X = case t_is_number(t_inf(X0, t_number(), Opaques), Opaques) of
- false -> X0;
- true -> t_number()
- end,
+key_comparisons_fail(X, KeyPos, TupleList, Opaques) ->
lists:all(fun(Tuple) ->
Key = type(erlang, element, 2, [KeyPos, Tuple]),
t_is_none(t_inf(Key, X, Opaques))