File 0244-dialyzer-Fix-bsl-2-bug.patch of Package erlang

From cecf41457d92a3bd21a7690b589f79c0a2901a93 Mon Sep 17 00:00:00 2001
From: Hans Bolinder <hasse@erlang.org>
Date: Fri, 12 Jan 2018 15:44:21 +0100
Subject: [PATCH] dialyzer: Fix bsl/2 bug

Also modified erl_bif_types:infinity_bsl() when called with zero as
first argument. As of writing this, erlang:'bsl'/2 is modified on the
master branch to never fail if called with a huge second argument.
---
 lib/dialyzer/test/small_SUITE_data/src/bsL.erl | 13 +++++++++++++
 lib/hipe/cerl/erl_bif_types.erl                |  3 ++-
 lib/hipe/cerl/erl_types.erl                    |  4 ++++
 3 files changed, 19 insertions(+), 1 deletion(-)
 create mode 100644 lib/dialyzer/test/small_SUITE_data/src/bsL.erl

diff --git a/lib/dialyzer/test/small_SUITE_data/src/bsL.erl b/lib/dialyzer/test/small_SUITE_data/src/bsL.erl
new file mode 100644
index 0000000000..b2fdc16324
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/src/bsL.erl
@@ -0,0 +1,13 @@
+-module(bsL).
+
+-export([t/0]).
+
+%% Found in lib/observer/test/crashdump_helper.erl.
+
+t() ->
+    Size = 60,
+    <<H:16/unit:8>> = erlang:md5(<<Size:32>>),
+    true = H < 20,
+    true = H > 2,
+    Data = ((H bsl (8*150)) div (H+7919)),
+    <<Data:Size/unit:8>>.
diff --git a/lib/hipe/cerl/erl_bif_types.erl b/lib/hipe/cerl/erl_bif_types.erl
index 2e56d25694..518f67ee1b 100644
--- a/lib/hipe/cerl/erl_bif_types.erl
+++ b/lib/hipe/cerl/erl_bif_types.erl
@@ -1903,7 +1903,8 @@ infinity_div(Number1, Number2) when is_integer(Number1), is_integer(Number2) ->
 
 infinity_bsl(pos_inf, _) -> pos_inf;
 infinity_bsl(neg_inf, _) -> neg_inf;
-infinity_bsl(Number, pos_inf) when is_integer(Number), Number >= 0 -> pos_inf;
+infinity_bsl(0, pos_inf) -> 0;
+infinity_bsl(Number, pos_inf) when is_integer(Number), Number > 0 -> pos_inf;
 infinity_bsl(Number, pos_inf) when is_integer(Number) -> neg_inf;
 infinity_bsl(Number, neg_inf) when is_integer(Number), Number >= 0 -> 0;
 infinity_bsl(Number, neg_inf) when is_integer(Number) -> -1;
diff --git a/lib/hipe/cerl/erl_types.erl b/lib/hipe/cerl/erl_types.erl
index 4e0f93212d..2b290b2f23 100644
--- a/lib/hipe/cerl/erl_types.erl
+++ b/lib/hipe/cerl/erl_types.erl
@@ -2351,6 +2351,8 @@ t_from_range(X, Y) ->
 
 -else.
 
+t_from_range(pos_inf, pos_inf) -> ?integer_pos;
+t_from_range(neg_inf, neg_inf) -> ?integer_neg;
 t_from_range(neg_inf, pos_inf) -> t_integer();
 t_from_range(neg_inf, Y) when is_integer(Y), Y < 0  -> ?integer_neg;
 t_from_range(neg_inf, Y) when is_integer(Y), Y >= 0 -> t_integer();
@@ -2383,6 +2385,8 @@ t_from_range(pos_inf, neg_inf) -> t_none().
 
 -spec t_from_range_unsafe(rng_elem(), rng_elem()) -> erl_type().
 
+t_from_range_unsafe(pos_inf, pos_inf) -> ?integer_pos;
+t_from_range_unsafe(neg_inf, neg_inf) -> ?integer_neg;
 t_from_range_unsafe(neg_inf, pos_inf) -> t_integer();
 t_from_range_unsafe(neg_inf, Y) -> ?int_range(neg_inf, Y);
 t_from_range_unsafe(X, pos_inf) -> ?int_range(X, pos_inf);
-- 
2.16.0

openSUSE Build Service is sponsored by