File 0838-dialyzer-Fix-opaque-related-crash.patch of Package erlang
From d1e48788435ad2ce430d4d573fda81daec1f2806 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?John=20H=C3=B6gberg?= <john@erlang.org>
Date: Mon, 20 Jan 2025 11:41:51 +0100
Subject: [PATCH] dialyzer: Fix opaque-related crash
---
lib/dialyzer/src/erl_types.erl | 1 +
.../src/opaque/opaque_bug6.erl | 19 +++++++++++++++++++
.../src/opaque/opaque_bug6_adt.erl | 8 ++++++++
3 files changed, 28 insertions(+)
create mode 100644 lib/dialyzer/test/opaque_SUITE_data/src/opaque/opaque_bug6.erl
create mode 100644 lib/dialyzer/test/opaque_SUITE_data/src/opaque/opaque_bug6_adt.erl
diff --git a/lib/dialyzer/src/erl_types.erl b/lib/dialyzer/src/erl_types.erl
index 647bcd6888..a2f0503863 100644
--- a/lib/dialyzer/src/erl_types.erl
+++ b/lib/dialyzer/src/erl_types.erl
@@ -632,6 +632,7 @@ t_decorate_with_opaque(T1, T2, Opaques) ->
end.
decorate(Type, ?none, _Opaques) -> Type;
+decorate(Type, ?unit, _Opaques) -> Type;
decorate(?function(Domain, Range), ?function(D, R), Opaques) ->
?function(decorate(Domain, D, Opaques), decorate(Range, R, Opaques));
decorate(?list(Types, Tail, Size), ?list(Ts, Tl, _Sz), Opaques) ->
diff --git a/lib/dialyzer/test/opaque_SUITE_data/src/opaque/opaque_bug6.erl b/lib/dialyzer/test/opaque_SUITE_data/src/opaque/opaque_bug6.erl
new file mode 100644
index 0000000000..1cb43af307
--- /dev/null
+++ b/lib/dialyzer/test/opaque_SUITE_data/src/opaque/opaque_bug6.erl
@@ -0,0 +1,19 @@
+-module(opaque_bug6).
+
+-export([loop/1]).
+-export_type([unused_dummy/0]).
+
+-type other_type() :: opaque_bug6_adt:adt().
+
+%% Required for decorate/3 to be called, jarring the bug loose. Does not need
+%% to be used anywhere.
+-opaque unused_dummy() :: {pid(), binary()}.
+
+-spec loop(other_type()) -> no_return().
+loop(OtherType) ->
+ receive
+ _X ->
+ loop(OtherType)
+ after timer:minutes(30) ->
+ opaque_bug6_adt:do(OtherType)
+ end.
diff --git a/lib/dialyzer/test/opaque_SUITE_data/src/opaque/opaque_bug6_adt.erl b/lib/dialyzer/test/opaque_SUITE_data/src/opaque/opaque_bug6_adt.erl
new file mode 100644
index 0000000000..6e38acfd9b
--- /dev/null
+++ b/lib/dialyzer/test/opaque_SUITE_data/src/opaque/opaque_bug6_adt.erl
@@ -0,0 +1,8 @@
+-module(opaque_bug6_adt).
+-export([do/1]).
+
+-export_type([adt/0]).
+-opaque adt() :: {a, term()}.
+
+-spec do(adt()) -> ok | {error, atom()}.
+do({Mod, Arg}) -> Mod:foo(Arg).
--
2.43.0