File 5081-dialyzer-overlapping_domain-option-is-opt-in.patch of Package erlang
From 1eaa3a2726dce181fb434548a8067790c568a8ff Mon Sep 17 00:00:00 2001
From: Kiko Fernandez-Reyes <kiko@erlang.org>
Date: Fri, 9 Dec 2022 13:39:49 +0100
Subject: [PATCH 1/4] dialyzer: overlapping_domain option is opt-in
---
lib/dialyzer/src/dialyzer.hrl | 35 ++++++++++---------
lib/dialyzer/src/dialyzer_cl_parse.erl | 2 ++
lib/dialyzer/src/dialyzer_contracts.erl | 2 +-
lib/dialyzer/src/dialyzer_options.erl | 2 ++
.../dialyzer_options | 1 +
.../default_ignore_overlapping_contract | 0
.../default_ignore_overlapping_contract.erl | 13 +++++++
.../test/indent_SUITE_data/dialyzer_options | 2 +-
.../dialyzer_options | 1 +
.../results/overlapping_contract | 2 ++
.../src/overlapping_contract.erl | 12 +++++++
.../test/small_SUITE_data/dialyzer_options | 2 +-
lib/stdlib/src/erl_lint.erl | 2 +-
13 files changed, 55 insertions(+), 21 deletions(-)
create mode 100644 lib/dialyzer/test/default_ignore_overlapping_contract_SUITE_data/dialyzer_options
create mode 100644 lib/dialyzer/test/default_ignore_overlapping_contract_SUITE_data/results/default_ignore_overlapping_contract
create mode 100644 lib/dialyzer/test/default_ignore_overlapping_contract_SUITE_data/src/default_ignore_overlapping_contract.erl
create mode 100644 lib/dialyzer/test/overlapping_contract_SUITE_data/dialyzer_options
create mode 100644 lib/dialyzer/test/overlapping_contract_SUITE_data/results/overlapping_contract
create mode 100644 lib/dialyzer/test/overlapping_contract_SUITE_data/src/overlapping_contract.erl
diff --git a/lib/dialyzer/src/dialyzer.hrl b/lib/dialyzer/src/dialyzer.hrl
index c1fcda169a..07647bbbd4 100644
--- a/lib/dialyzer/src/dialyzer.hrl
+++ b/lib/dialyzer/src/dialyzer.hrl
@@ -33,29 +33,30 @@
%% Warning classification
%%--------------------------------------------------------------------
--define(WARN_RETURN_NO_RETURN, warn_return_no_exit).
--define(WARN_RETURN_ONLY_EXIT, warn_return_only_exit).
--define(WARN_NOT_CALLED, warn_not_called).
--define(WARN_NON_PROPER_LIST, warn_non_proper_list).
--define(WARN_FUN_APP, warn_fun_app).
--define(WARN_MATCHING, warn_matching).
--define(WARN_OPAQUE, warn_opaque).
--define(WARN_FAILING_CALL, warn_failing_call).
+-define(WARN_BEHAVIOUR, warn_behaviour).
-define(WARN_BIN_CONSTRUCTION, warn_bin_construction).
--define(WARN_CONTRACT_TYPES, warn_contract_types).
--define(WARN_CONTRACT_SYNTAX, warn_contract_syntax).
+-define(WARN_CALLGRAPH, warn_callgraph).
+-define(WARN_CONTRACT_EXTRA_RETURN, warn_contract_extra_return).
+-define(WARN_CONTRACT_MISSING_RETURN, warn_contract_missing_return).
-define(WARN_CONTRACT_NOT_EQUAL, warn_contract_not_equal).
+-define(WARN_CONTRACT_RANGE, warn_contract_range).
-define(WARN_CONTRACT_SUBTYPE, warn_contract_subtype).
--define(WARN_CONTRACT_MISSING_RETURN, warn_contract_missing_return).
-define(WARN_CONTRACT_SUPERTYPE, warn_contract_supertype).
--define(WARN_CONTRACT_EXTRA_RETURN, warn_contract_extra_return).
--define(WARN_CONTRACT_RANGE, warn_contract_range).
--define(WARN_CALLGRAPH, warn_callgraph).
--define(WARN_UNMATCHED_RETURN, warn_umatched_return).
--define(WARN_BEHAVIOUR, warn_behaviour).
+-define(WARN_CONTRACT_SYNTAX, warn_contract_syntax).
+-define(WARN_CONTRACT_TYPES, warn_contract_types).
+-define(WARN_FAILING_CALL, warn_failing_call).
+-define(WARN_FUN_APP, warn_fun_app).
+-define(WARN_MAP_CONSTRUCTION, warn_map_construction).
+-define(WARN_MATCHING, warn_matching).
+-define(WARN_NON_PROPER_LIST, warn_non_proper_list).
+-define(WARN_NOT_CALLED, warn_not_called).
+-define(WARN_OPAQUE, warn_opaque).
+-define(WARN_OVERLAPPING_CONTRACT, warn_overlapping_contract).
+-define(WARN_RETURN_NO_RETURN, warn_return_no_exit).
+-define(WARN_RETURN_ONLY_EXIT, warn_return_only_exit).
-define(WARN_UNDEFINED_CALLBACK, warn_undefined_callbacks).
-define(WARN_UNKNOWN, warn_unknown).
--define(WARN_MAP_CONSTRUCTION, warn_map_construction).
+-define(WARN_UNMATCHED_RETURN, warn_umatched_return).
%%
%% The following type has double role:
diff --git a/lib/dialyzer/src/dialyzer_cl_parse.erl b/lib/dialyzer/src/dialyzer_cl_parse.erl
index a0dcf8dd0f..4fac1df6a6 100644
--- a/lib/dialyzer/src/dialyzer_cl_parse.erl
+++ b/lib/dialyzer/src/dialyzer_cl_parse.erl
@@ -608,6 +608,8 @@ warning_options_msg() ->
-Wmissing_return ***
Warn about functions that return values that are not part
of the specification.
+ -Woverlapping_contract ***
+ Warn about overloaded functions whose specification include types that overlap.
-Wunknown ***
Let warnings about unknown functions and types affect the
exit status of the command line version. The default is to ignore
diff --git a/lib/dialyzer/src/dialyzer_contracts.erl b/lib/dialyzer/src/dialyzer_contracts.erl
index a1f4265f98..9623a6d6ff 100644
--- a/lib/dialyzer/src/dialyzer_contracts.erl
+++ b/lib/dialyzer/src/dialyzer_contracts.erl
@@ -918,7 +918,7 @@ contract_opaque_warning({M, F, A}, WarningInfo, OpType, SuccType, RecDict) ->
{contract_with_opaque, [M, F, A, OpaqueStr, SuccTypeStr]}}.
overlapping_contract_warning({M, F, A}, WarningInfo) ->
- {?WARN_CONTRACT_TYPES, WarningInfo, {overlapping_contract, [M, F, A]}}.
+ {?WARN_OVERLAPPING_CONTRACT, WarningInfo, {overlapping_contract, [M, F, A]}}.
extra_range_warning({M, F, A}, WarningInfo, ExtraRanges, STRange) ->
ERangesStr = erl_types:t_to_string(ExtraRanges),
diff --git a/lib/dialyzer/src/dialyzer_options.erl b/lib/dialyzer/src/dialyzer_options.erl
index bcac905fc1..326ad59afb 100644
--- a/lib/dialyzer/src/dialyzer_options.erl
+++ b/lib/dialyzer/src/dialyzer_options.erl
@@ -479,6 +479,8 @@ build_warnings([Opt|Opts], Warnings) ->
ordsets:del_element(?WARN_CONTRACT_MISSING_RETURN, Warnings);
unknown ->
ordsets:add_element(?WARN_UNKNOWN, Warnings);
+ overlapping_contract ->
+ ordsets:add_element(?WARN_OVERLAPPING_CONTRACT, Warnings);
OtherAtom ->
bad_option("Unknown dialyzer warning option", OtherAtom)
end,
diff --git a/lib/dialyzer/test/default_ignore_overlapping_contract_SUITE_data/dialyzer_options b/lib/dialyzer/test/default_ignore_overlapping_contract_SUITE_data/dialyzer_options
new file mode 100644
index 0000000000..8413436b67
--- /dev/null
+++ b/lib/dialyzer/test/default_ignore_overlapping_contract_SUITE_data/dialyzer_options
@@ -0,0 +1 @@
+{dialyzer_options, [{indent_opt, false}]}.
diff --git a/lib/dialyzer/test/default_ignore_overlapping_contract_SUITE_data/results/default_ignore_overlapping_contract b/lib/dialyzer/test/default_ignore_overlapping_contract_SUITE_data/results/default_ignore_overlapping_contract
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/lib/dialyzer/test/default_ignore_overlapping_contract_SUITE_data/src/default_ignore_overlapping_contract.erl b/lib/dialyzer/test/default_ignore_overlapping_contract_SUITE_data/src/default_ignore_overlapping_contract.erl
new file mode 100644
index 0000000000..8303cf8ca6
--- /dev/null
+++ b/lib/dialyzer/test/default_ignore_overlapping_contract_SUITE_data/src/default_ignore_overlapping_contract.erl
@@ -0,0 +1,13 @@
+-module(default_ignore_overlapping_contract).
+
+-export([t1/0]).
+
+%% Should not result in a overlapping_contract warning,
+%% as dialyzer_options does not set it to active
+-spec t1() -> list();
+ () -> [atom].
+t1() ->
+ case rand:uniform(2) of
+ 1 -> [test];
+ 2 -> [2]
+ end.
diff --git a/lib/dialyzer/test/indent_SUITE_data/dialyzer_options b/lib/dialyzer/test/indent_SUITE_data/dialyzer_options
index 3ff26b87db..c14551a8ad 100644
--- a/lib/dialyzer/test/indent_SUITE_data/dialyzer_options
+++ b/lib/dialyzer/test/indent_SUITE_data/dialyzer_options
@@ -1 +1 @@
-{dialyzer_options, [{warnings, [no_unused, no_return]}]}.
+{dialyzer_options, [{warnings, [no_unused, no_return, overlapping_contract]}]}.
diff --git a/lib/dialyzer/test/overlapping_contract_SUITE_data/dialyzer_options b/lib/dialyzer/test/overlapping_contract_SUITE_data/dialyzer_options
new file mode 100644
index 0000000000..6a36904eda
--- /dev/null
+++ b/lib/dialyzer/test/overlapping_contract_SUITE_data/dialyzer_options
@@ -0,0 +1 @@
+{dialyzer_options, [{indent_opt, false}, {warnings, [overlapping_contract]}]}.
diff --git a/lib/dialyzer/test/overlapping_contract_SUITE_data/results/overlapping_contract b/lib/dialyzer/test/overlapping_contract_SUITE_data/results/overlapping_contract
new file mode 100644
index 0000000000..d7b5f8a846
--- /dev/null
+++ b/lib/dialyzer/test/overlapping_contract_SUITE_data/results/overlapping_contract
@@ -0,0 +1,2 @@
+
+overlapping_contract.erl:6:2: Overloaded contract for overlapping_contract:t1/0 has overlapping domains; such contracts are currently unsupported and are simply ignored
diff --git a/lib/dialyzer/test/overlapping_contract_SUITE_data/src/overlapping_contract.erl b/lib/dialyzer/test/overlapping_contract_SUITE_data/src/overlapping_contract.erl
new file mode 100644
index 0000000000..57b0d7f799
--- /dev/null
+++ b/lib/dialyzer/test/overlapping_contract_SUITE_data/src/overlapping_contract.erl
@@ -0,0 +1,12 @@
+-module(overlapping_contract).
+
+-export([t1/0]).
+
+%% Should result in a overlapping_contract warning
+-spec t1() -> list();
+ () -> [atom].
+t1() ->
+ case rand:uniform(2) of
+ 1 -> [test];
+ 2 -> [2]
+ end.
diff --git a/lib/dialyzer/test/small_SUITE_data/dialyzer_options b/lib/dialyzer/test/small_SUITE_data/dialyzer_options
index 43bf4775fe..8a5cefaa1f 100644
--- a/lib/dialyzer/test/small_SUITE_data/dialyzer_options
+++ b/lib/dialyzer/test/small_SUITE_data/dialyzer_options
@@ -1 +1 @@
-{dialyzer_options, [{indent_opt, false}, {error_location, column}]}.
+{dialyzer_options, [{indent_opt, false}, {error_location, column}, {warnings, [overlapping_contract]}]}.
diff --git a/lib/stdlib/src/erl_lint.erl b/lib/stdlib/src/erl_lint.erl
index 31eee8b360..7f26c28a1a 100644
--- a/lib/stdlib/src/erl_lint.erl
+++ b/lib/stdlib/src/erl_lint.erl
@@ -3414,7 +3414,7 @@ is_module_dialyzer_option(Option) ->
error_handling,race_conditions,no_missing_calls,
specdiffs,overspecs,underspecs,unknown,
no_underspecs,extra_return,no_extra_return,
- missing_return,no_missing_return
+ missing_return,no_missing_return,overlapping_contract
]).
%% try_catch_clauses(Scs, Ccs, In, ImportVarTable, State) ->
--
2.35.3