File 0590-Eliminate-crash-in-dialyzer_dep.patch of Package erlang
From 937808d6dd2d0bd011173bc57479d9fdd750df82 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bj=C3=B6rn=20Gustavsson?= <bjorn@erlang.org>
Date: Thu, 1 Dec 2022 04:58:23 +0100
Subject: [PATCH] Eliminate crash in dialyzer_dep
Closes #6518
---
lib/dialyzer/src/dialyzer_dep.erl | 26 +++++++++++--------
.../test/small_SUITE_data/src/gh_6518.erl | 12 +++++++++
2 files changed, 27 insertions(+), 11 deletions(-)
create mode 100644 lib/dialyzer/test/small_SUITE_data/src/gh_6518.erl
diff --git a/lib/dialyzer/src/dialyzer_dep.erl b/lib/dialyzer/src/dialyzer_dep.erl
index c565a0a612..c869be76a3 100644
--- a/lib/dialyzer/src/dialyzer_dep.erl
+++ b/lib/dialyzer/src/dialyzer_dep.erl
@@ -124,22 +124,26 @@ traverse(Tree, Out, State, CurrentFun) ->
{merge_outs([HdFuns, TlFuns]), State2};
'fun' ->
%% io:format("Entering fun: ~w\n", [cerl_trees:get_label(Tree)]),
+ OldNumRvals = state__num_rvals(State),
+ State1 = state__store_num_rvals(1, State),
Body = cerl:fun_body(Tree),
Label = cerl_trees:get_label(Tree),
- State1 =
- if CurrentFun =:= top ->
- state__add_deps(top, output(set__singleton(Label)), State);
- true ->
- O1 = output(set__singleton(CurrentFun)),
- O2 = output(set__singleton(Label)),
- TmpState = state__add_deps(Label, O1, State),
- state__add_deps(CurrentFun, O2,TmpState)
+ State2 =
+ if
+ CurrentFun =:= top ->
+ state__add_deps(top, output(set__singleton(Label)), State1);
+ true ->
+ O1 = output(set__singleton(CurrentFun)),
+ O2 = output(set__singleton(Label)),
+ TmpState = state__add_deps(Label, O1, State1),
+ state__add_deps(CurrentFun, O2, TmpState)
end,
Vars = cerl:fun_vars(Tree),
Out1 = bind_single(Vars, output(set__singleton(external)), Out),
- {BodyFuns, State2} =
- traverse(Body, Out1, State1, cerl_trees:get_label(Tree)),
- {output(set__singleton(Label)), state__add_esc(BodyFuns, State2)};
+ {BodyFuns, State3} =
+ traverse(Body, Out1, State2, cerl_trees:get_label(Tree)),
+ State4 = state__store_num_rvals(OldNumRvals, State3),
+ {output(set__singleton(Label)), state__add_esc(BodyFuns, State4)};
'let' ->
Vars = cerl:let_vars(Tree),
Arg = cerl:let_arg(Tree),
diff --git a/lib/dialyzer/test/small_SUITE_data/src/gh_6518.erl b/lib/dialyzer/test/small_SUITE_data/src/gh_6518.erl
new file mode 100644
index 0000000000..794548b37a
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/src/gh_6518.erl
@@ -0,0 +1,12 @@
+-module(gh_6518).
+-export([f/1]).
+
+f(X) ->
+ case
+ fun() ->
+ [ok || _ <- []]
+ end
+ of
+ _ ->
+ (Y = X)
+ end andalso Y.
--
2.35.3