File 1258-Dialyzer-Fix-a-bug-that-caused-Dialyzer-to-go-into-a.patch of Package erlang

From 6a0d7e9abef8474ae1de739868ecb2245e8aa6a8 Mon Sep 17 00:00:00 2001
From: Hans Bolinder <hasse@erlang.org>
Date: Wed, 8 Jun 2016 08:35:10 +0200
Subject: [PATCH] Dialyzer: Fix a bug that caused Dialyzer to go into an
 infinite loop.

Dialyzer failed to remove all loops among constraints.
---
 lib/dialyzer/src/dialyzer_contracts.erl          | 11 +++++++----
 lib/dialyzer/test/small_SUITE_data/src/loopy.erl | 17 +++++++++++++++++
 2 files changed, 24 insertions(+), 4 deletions(-)
 create mode 100644 lib/dialyzer/test/small_SUITE_data/src/loopy.erl

diff --git a/lib/dialyzer/src/dialyzer_contracts.erl b/lib/dialyzer/src/dialyzer_contracts.erl
index d1ffa07..272ad10 100644
--- a/lib/dialyzer/src/dialyzer_contracts.erl
+++ b/lib/dialyzer/src/dialyzer_contracts.erl
@@ -591,10 +591,13 @@ remove_uses([{Var, Use}|ToRemove], Constrs0) ->
 remove_uses(_Var, _Use, []) -> [];
 remove_uses(Var, Use, [Constr|Constrs]) ->
   {V, Form} = Constr,
-  case erl_types:t_var_name(V) =:= Var of
-    true -> [{V, remove_use(Form, Use)}|Constrs];
-    false -> [Constr|remove_uses(Var, Use, Constrs)]
-  end.
+  NewConstr = case erl_types:t_var_name(V) =:= Var of
+                true ->
+                  {V, remove_use(Form, Use)};
+                false ->
+                  Constr
+              end,
+  [NewConstr|remove_uses(Var, Use, Constrs)].
 
 remove_use({var, L, V}, V) -> {var, L, '_'};
 remove_use(T, V) when is_tuple(T) ->
diff --git a/lib/dialyzer/test/small_SUITE_data/src/loopy.erl b/lib/dialyzer/test/small_SUITE_data/src/loopy.erl
new file mode 100644
index 0000000..28125ec
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/src/loopy.erl
@@ -0,0 +1,17 @@
+%% ERL-157, OTP-13653.
+%% Would cause Dialyzer to go into an infinite loop.
+
+-module(loopy).
+
+-export([loop/1]).
+
+
+-spec loop(Args) -> ok when
+      Args :: [{Module, Args}],
+      Module :: module(),
+      Args :: any().
+loop([{Module, Args} | Rest]) ->
+    Module:init(Args),
+    loop(Rest);
+loop([]) ->
+    ok.
-- 
2.1.4

openSUSE Build Service is sponsored by