aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorHans Bolinder <[email protected]>2018-01-09 12:09:55 +0100
committerHans Bolinder <[email protected]>2018-01-09 12:09:55 +0100
commit34a9e40405cef0c4b4606df63f31716214b8b44d (patch)
treea3f7f20772d5858951008c7e998eb8936b4ce549 /lib
parent6aed6670e08c75e363838091c8ad60e20c72758d (diff)
parente8a8d0a81be4ef1ffbb5c382705a27bd24ebefea (diff)
downloadotp-34a9e40405cef0c4b4606df63f31716214b8b44d.tar.gz
otp-34a9e40405cef0c4b4606df63f31716214b8b44d.tar.bz2
otp-34a9e40405cef0c4b4606df63f31716214b8b44d.zip
Merge branch 'hasse/dialyzer/fix_abs/OTP-14858/ERL-551' into maint
* hasse/dialyzer/fix_abs/OTP-14858/ERL-551: dialyzer: Correct handling of erlang:abs/1
Diffstat (limited to 'lib')
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/abs.erl9
-rw-r--r--lib/hipe/cerl/erl_bif_types.erl6
2 files changed, 12 insertions, 3 deletions
diff --git a/lib/dialyzer/test/small_SUITE_data/src/abs.erl b/lib/dialyzer/test/small_SUITE_data/src/abs.erl
index 251e24cdfc..0e38c3dbb7 100644
--- a/lib/dialyzer/test/small_SUITE_data/src/abs.erl
+++ b/lib/dialyzer/test/small_SUITE_data/src/abs.erl
@@ -5,7 +5,7 @@
-export([t/0]).
t() ->
- Fs = [fun i1/0, fun i2/0, fun i3/0, fun i4/0, fun f1/0],
+ Fs = [fun i1/0, fun i2/0, fun i3/0, fun i4/0, fun f1/0, fun erl_551/0],
_ = [catch F() || F <- Fs],
ok.
@@ -60,6 +60,13 @@ f1() ->
f1(A) ->
abs(A).
+erl_551() ->
+ accept(9),
+ accept(-3).
+
+accept(Number) when abs(Number) >= 8 -> first;
+accept(_Number) -> second.
+
-spec int() -> integer().
int() ->
diff --git a/lib/hipe/cerl/erl_bif_types.erl b/lib/hipe/cerl/erl_bif_types.erl
index a3a936322a..2e56d25694 100644
--- a/lib/hipe/cerl/erl_bif_types.erl
+++ b/lib/hipe/cerl/erl_bif_types.erl
@@ -1992,9 +1992,11 @@ arith_abs(X1, Opaques) ->
case infinity_geq(Min1, 0) of
true -> {Min1, Max1};
false ->
+ NegMin1 = infinity_inv(Min1),
+ NegMax1 = infinity_inv(Max1),
case infinity_geq(Max1, 0) of
- true -> {0, infinity_inv(Min1)};
- false -> {infinity_inv(Max1), infinity_inv(Min1)}
+ true -> {0, max(NegMin1, Max1)};
+ false -> {NegMax1, NegMin1}
end
end,
t_from_range(NewMin, NewMax)