File 0261-dialyzer-Fix-a-crash.patch of Package erlang

From 120760b543159d36d88f1feb204ff84c74306515 Mon Sep 17 00:00:00 2001
From: Hans Bolinder <hasse@erlang.org>
Date: Wed, 7 Feb 2018 15:16:15 +0100
Subject: [PATCH] dialyzer: Fix a crash

---
 lib/dialyzer/src/dialyzer_dataflow.erl                  |  7 +++++++
 lib/dialyzer/test/small_SUITE_data/results/record_match |  3 +++
 lib/dialyzer/test/small_SUITE_data/src/record_match.erl | 17 +++++++++++++++++
 3 files changed, 27 insertions(+)
 create mode 100644 lib/dialyzer/test/small_SUITE_data/results/record_match
 create mode 100644 lib/dialyzer/test/small_SUITE_data/src/record_match.erl

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{}]}.
-- 
2.16.1

openSUSE Build Service is sponsored by