Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
home:Ledest:erlang:25
erlang
2421-dialyzer-overlapping_domain-option-is-opt-...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 2421-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
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor