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

openSUSE Build Service is sponsored by