diff options
author | Hans Bolinder <[email protected]> | 2018-02-15 16:49:43 +0100 |
---|---|---|
committer | Hans Bolinder <[email protected]> | 2018-02-15 16:49:43 +0100 |
commit | 9efdc2408ff33139878a58a58ab49402352a7a28 (patch) | |
tree | 7f6b2ebe21680a701f16300d2e2dfbf888b63e07 /lib/dialyzer | |
parent | 8405b0c802e216f42afaafc5ec8501eba329cced (diff) | |
parent | 120760b543159d36d88f1feb204ff84c74306515 (diff) | |
download | otp-9efdc2408ff33139878a58a58ab49402352a7a28.tar.gz otp-9efdc2408ff33139878a58a58ab49402352a7a28.tar.bz2 otp-9efdc2408ff33139878a58a58ab49402352a7a28.zip |
Merge branch 'hasse/dialyzer/fix_record_match/OTP-14911' into maint
* hasse/dialyzer/fix_record_match/OTP-14911:
dialyzer: Fix a crash
Diffstat (limited to 'lib/dialyzer')
-rw-r--r-- | lib/dialyzer/src/dialyzer_dataflow.erl | 7 | ||||
-rw-r--r-- | lib/dialyzer/test/small_SUITE_data/results/record_match | 3 | ||||
-rw-r--r-- | lib/dialyzer/test/small_SUITE_data/src/record_match.erl | 17 |
3 files changed, 27 insertions, 0 deletions
diff --git a/lib/dialyzer/src/dialyzer_dataflow.erl b/lib/dialyzer/src/dialyzer_dataflow.erl index f6433a807d..fca5b74a9e 100644 --- a/lib/dialyzer/src/dialyzer_dataflow.erl +++ b/lib/dialyzer/src/dialyzer_dataflow.erl @@ -1235,6 +1235,13 @@ handle_tuple(Tree, Map, State) -> State2 = state__add_warning(State1, ?WARN_OPAQUE, Tree, Msg), {State2, Map1, t_none()}; + {error, record, ErrorPat, ErrorType, _} -> + Msg = {record_match, + [format_patterns(ErrorPat), + format_type(ErrorType, State1)]}, + State2 = state__add_warning(State1, ?WARN_MATCHING, + Tree, Msg), + {State2, Map1, t_none()}; {Map2, ETypes} -> {State1, Map2, t_tuple(ETypes)} end diff --git a/lib/dialyzer/test/small_SUITE_data/results/record_match b/lib/dialyzer/test/small_SUITE_data/results/record_match new file mode 100644 index 0000000000..a0dd6f560a --- /dev/null +++ b/lib/dialyzer/test/small_SUITE_data/results/record_match @@ -0,0 +1,3 @@ + +record_match.erl:16: Function select/0 has no local return +record_match.erl:17: Matching of pattern {'b_literal', 'undefined'} tagged with a record name violates the declared type of #b_local{} | #b_remote{} diff --git a/lib/dialyzer/test/small_SUITE_data/src/record_match.erl b/lib/dialyzer/test/small_SUITE_data/src/record_match.erl new file mode 100644 index 0000000000..8e9b91937f --- /dev/null +++ b/lib/dialyzer/test/small_SUITE_data/src/record_match.erl @@ -0,0 +1,17 @@ +-module(record_match). + +-export([select/0]). + +-record(b_literal, {val}). +-record(b_remote, {mod,name,arity}). +-record(b_local, {name,arity}). + +-type b_remote() :: #b_remote{}. +-type b_local() :: #b_local{}. + +-type argument() :: b_remote() | b_local(). + +-record(b_set, {args=[] :: [argument()]}). + +select() -> + #b_set{args=[#b_remote{},#b_literal{}]}. |