File 0234-dialyzer-Correct-handling-of-erlang-abs-1.patch of Package erlang

From e8a8d0a81be4ef1ffbb5c382705a27bd24ebefea Mon Sep 17 00:00:00 2001
From: Hans Bolinder <hasse@erlang.org>
Date: Mon, 8 Jan 2018 12:43:15 +0100
Subject: [PATCH] dialyzer: Correct handling of erlang:abs/1

See also https://bugs.erlang.org/browse/ERL-551.
---
 lib/dialyzer/test/small_SUITE_data/src/abs.erl | 9 ++++++++-
 lib/hipe/cerl/erl_bif_types.erl                | 6 ++++--
 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)
-- 
2.15.1

openSUSE Build Service is sponsored by