File 4452-beam_ssa_bsm-Break-infinite-loop-when-generating-war.patch of Package erlang
From 27a0d2318f0811585a210058cb04998b61b5462e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?John=20H=C3=B6gberg?= <john@erlang.org>
Date: Thu, 19 Mar 2020 15:03:36 +0100
Subject: [PATCH 2/2] beam_ssa_bsm: Break infinite loop when generating
 warnings
---
 lib/compiler/src/beam_ssa_bsm.erl    | 12 +++++++-----
 lib/compiler/test/bs_match_SUITE.erl | 14 ++++++++++++--
 2 files changed, 19 insertions(+), 7 deletions(-)
diff --git a/lib/compiler/src/beam_ssa_bsm.erl b/lib/compiler/src/beam_ssa_bsm.erl
index d56372e53f..d82cc0fd87 100644
--- a/lib/compiler/src/beam_ssa_bsm.erl
+++ b/lib/compiler/src/beam_ssa_bsm.erl
@@ -170,12 +170,14 @@ ccc_1([#b_local{}=Call | Args], Ctx, Aliases, ModInfo) ->
             Parameters = funcinfo_get(Callee, parameters, ModInfo),
             Parameter = nth(1 + arg_index(Ctx, Args), Parameters),
 
-            case maps:find(Parameter, ParamInfo) of
-                {ok, suitable_for_reuse} ->
+            case ParamInfo of
+                #{ Parameter := suitable_for_reuse } ->
                     suitable_for_reuse;
-                {ok, Other} ->
-                    {unsuitable_call, {Call, Other}};
-                error ->
+                #{ Parameter := {unsuitable_call, {Call, _}}=Info } ->
+                    Info;
+                #{ Parameter := Info } ->
+                    {unsuitable_call, {Call, Info}};
+                #{} ->
                     {no_match_on_entry, Call}
             end;
         UseCount > 1 ->
diff --git a/lib/compiler/test/bs_match_SUITE.erl b/lib/compiler/test/bs_match_SUITE.erl
index 490fc096eb..9795609390 100644
--- a/lib/compiler/test/bs_match_SUITE.erl
+++ b/lib/compiler/test/bs_match_SUITE.erl
@@ -47,7 +47,7 @@
          restore_after_catch/1,matches_on_parameter/1,big_positions/1,
          matching_meets_apply/1,bs_start_match2_defs/1,
          exceptions_after_match_failure/1, bad_phi_paths/1,
-         combine_empty_segments/1]).
+         combine_empty_segments/1,hangs_forever/1]).
 
 -export([coverage_id/1,coverage_external_ignore/2]).
 
@@ -85,7 +85,7 @@ groups() ->
        matches_on_parameter,big_positions,
        matching_meets_apply,bs_start_match2_defs,
        exceptions_after_match_failure,bad_phi_paths,
-       combine_empty_segments]}].
+       combine_empty_segments,hangs_forever]}].
 
 
 init_per_suite(Config) ->
@@ -2352,6 +2352,16 @@ combine_empty_segments_1(A) ->
     <<D/bits>> = C,
     D.
 
+%% This never finishes compiling under +no_copt.
+hangs_forever(Config) ->
+    true = is_function(id(fun() -> hangs_forever_1(Config) end)),
+    ok.
+
+hangs_forever_1(V0) ->
+    case hangs_forever_1(V0) of
+        <<A:1>> -> A
+    end.
+
 id(I) -> I.
 
 expand_and_squeeze(Config) when is_list(Config) ->
-- 
2.16.4