File 0362-dialyzer-Correct-indentation-of-field-warnings.patch of Package erlang

From 6b8b77173b426cecadd94c04c2c6d904569936a7 Mon Sep 17 00:00:00 2001
From: Hans Bolinder <hasse@erlang.org>
Date: Tue, 4 Jun 2019 14:09:38 +0200
Subject: [PATCH] dialyzer: Correct indentation of field warnings

See also https://bugs.erlang.org/browse/ERL-953.
---
 lib/dialyzer/src/dialyzer.erl                      |  6 +-
 .../test/small_SUITE_data/results/union_paren      | 30 +++++++--
 .../test/small_SUITE_data/src/union_paren.erl      | 74 ++++++++++++++++++++++
 3 files changed, 101 insertions(+), 9 deletions(-)

diff --git a/lib/dialyzer/src/dialyzer.erl b/lib/dialyzer/src/dialyzer.erl
index cfe5fa9b3f..d4fe064edd 100644
--- a/lib/dialyzer/src/dialyzer.erl
+++ b/lib/dialyzer/src/dialyzer.erl
@@ -642,11 +642,11 @@ c(Cerl, _I) ->
 field_diffs(Src, false) ->
   Src;
 field_diffs(Src, true) ->
-  Fields = string:split(Src, " and "),
+  Fields = string:split(Src, " and ", all),
   lists:join(" and ", [field_diff(Field) || Field <- Fields]).
 
 field_diff(Field) ->
-  [F | Ts] = string:split(Field, "::"),
+  [F | Ts] = string:split(Field, "::", all),
   F ++ " ::" ++ t(lists:flatten(lists:join("::", Ts)), true).
 
 rec_type("record "++Src, I) ->
@@ -658,7 +658,7 @@ ps("pattern "++Src, I) ->
 ps("variable "++_=Src, _I) ->
   Src;
 ps("record field"++Rest, I) ->
-  [S, TypeStr] = string:split(Rest, "of type "),
+  [S, TypeStr] = string:split(Rest, "of type ", all),
   "record field" ++ S ++ "of type " ++ t(TypeStr, I).
 
 %% Scan and parse a type or a literal, and pretty-print it using erl_pp.
diff --git a/lib/dialyzer/test/small_SUITE_data/results/union_paren b/lib/dialyzer/test/small_SUITE_data/results/union_paren
index 3a3526df89..1766773f2d 100644
--- a/lib/dialyzer/test/small_SUITE_data/results/union_paren
+++ b/lib/dialyzer/test/small_SUITE_data/results/union_paren
@@ -1,7 +1,25 @@
 
-union_paren.erl:12: Function t2/0 has no local return
-union_paren.erl:13: The call union_paren:t2(3.14) breaks the contract (integer() | atom()) -> integer()
-union_paren.erl:19: Function t3/0 has no local return
-union_paren.erl:20: The pattern 3.14 can never match the type atom() | integer()
-union_paren.erl:5: Function t1/0 has no local return
-union_paren.erl:6: The call union_paren:t1(3.14) breaks the contract ((A::integer()) | (B::atom())) -> integer()
+union_paren.erl:20: Function r1/0 has no local return
+union_paren.erl:21: Record construction #r1{f1::[4,...],f2::'undefined',f3::'undefined',f8::float()} violates the declared type of field f2::[atom() | pid() | integer()] and f3::[atom() | pid() | integer()] and f8::[atom() | pid() | integer()]
+union_paren.erl:23: Function t1/0 has no local return
+union_paren.erl:24: The call union_paren:t1(3.14) breaks the contract ((A::integer()) | (B::atom())) -> integer()
+union_paren.erl:30: Function t2/0 has no local return
+union_paren.erl:31: The call union_paren:t2(3.14) breaks the contract (integer() | atom()) -> integer()
+union_paren.erl:37: Function t3/0 has no local return
+union_paren.erl:38: The pattern 3.14 can never match the type atom() | integer()
+union_paren.erl:44: Function c1/0 has no local return
+union_paren.erl:45: The call union_paren:c1({'r0', 'a', 'undefined', 'undefined'}) breaks the contract (#r0{f1::integer() | pid()}) -> atom()
+union_paren.erl:51: Function c2/0 has no local return
+union_paren.erl:52: The call union_paren:c2({'r0', 'a', 'undefined', 'undefined'}) breaks the contract (#r0{f1::A::integer() | pid()}) -> atom()
+union_paren.erl:58: Function c3/0 has no local return
+union_paren.erl:59: The call union_paren:c3({'r0', 'a', 'undefined', 'undefined'}) breaks the contract (#r0{f1::(A::integer()) | (B::pid())}) -> atom()
+union_paren.erl:65: Function c4/0 has no local return
+union_paren.erl:66: The call union_paren:c4({'r0', 'a', 'undefined', 'undefined'}) breaks the contract (#r0{f1::X::(A::integer()) | (B::pid())}) -> atom()
+union_paren.erl:72: Function c5/0 has no local return
+union_paren.erl:73: The call union_paren:c5({'r1', ['a'], [1], ['a'], ['u']}) breaks the contract (#r1{f1::[integer()] | [pid()]}) -> atom()
+union_paren.erl:79: Function c6/0 has no local return
+union_paren.erl:80: The call union_paren:c6({'r1', ['a'], [1], ['a'], ['u']}) breaks the contract (#r1{f1::A::[integer()] | [pid()]}) -> atom()
+union_paren.erl:86: Function c7/0 has no local return
+union_paren.erl:87: The call union_paren:c7({'r1', ['a'], [1], ['a'], ['u']}) breaks the contract (#r1{f1::(A::[integer()]) | (B::[pid()])}) -> atom()
+union_paren.erl:93: Function c8/0 has no local return
+union_paren.erl:94: The call union_paren:c8({'r1', ['a'], [1], ['a'], ['u']}) breaks the contract (#r1{f1::X::(A::[integer()]) | (B::[pid()])}) -> atom()
diff --git a/lib/dialyzer/test/small_SUITE_data/src/union_paren.erl b/lib/dialyzer/test/small_SUITE_data/src/union_paren.erl
index 4691a57d98..65bda1876e 100644
--- a/lib/dialyzer/test/small_SUITE_data/src/union_paren.erl
+++ b/lib/dialyzer/test/small_SUITE_data/src/union_paren.erl
@@ -2,6 +2,24 @@
 
 -compile(export_all).
 
+-record(r0,
+        {
+         f1 = 4 :: atom () | integer() | pid(),
+         f2 :: atom() | integer() | pid(),
+         f3 :: A :: atom() | integer() | pid
+        }).
+
+-record(r1,
+        {
+         f1 = [4] :: [atom ()] | [integer()] | [pid()],
+         f2 :: [atom()] | [integer()] | [pid()],
+         f3 :: A :: [atom()] | [integer()] | [pid()],
+         f8 = [u] :: X :: [A :: atom()] | [B :: integer()] | (C :: [pid()])
+        }).
+
+r1() ->
+    #r1{f8 = 3.14}.
+
 t1() ->
     t1(3.14).
 
@@ -22,3 +40,59 @@ t3() ->
 -spec t3(_) -> (I :: integer()) | (A :: atom()).
 t3(A) when is_atom(A) -> A;
 t3(I) when is_integer(I) -> I.
+
+c1() ->
+    c1(#r0{f1 = a}).
+
+-spec c1(#r0{f1 :: integer() | pid()}) -> atom().
+c1(_) ->
+    a.
+
+c2() ->
+    c2(#r0{f1 = a}).
+
+-spec c2(#r0{f1 :: A :: integer() | pid()}) -> atom().
+c2(_) ->
+    a.
+
+c3() ->
+    c3(#r0{f1 = a}).
+
+-spec c3(#r0{f1 :: (A :: integer()) | (B :: pid())}) -> atom().
+c3(_) ->
+    a.
+
+c4() ->
+    c4(#r0{f1 = a}).
+
+-spec c4(#r0{f1 :: X :: (A :: integer()) | (B :: pid())}) -> atom().
+c4(_) ->
+    a.
+
+c5() ->
+    c5(#r1{f1 = [a], f2 = [1], f3 = [a]}).
+
+-spec c5(#r1{f1 :: [integer()] | [pid()]}) -> atom().
+c5(_) ->
+    a.
+
+c6() ->
+    c6(#r1{f1 = [a], f2 = [1], f3 = [a]}).
+
+-spec c6(#r1{f1 :: A :: [integer()] | [pid()]}) -> atom().
+c6(_) ->
+    a.
+
+c7() ->
+    c7(#r1{f1 = [a], f2 = [1], f3 = [a]}).
+
+-spec c7(#r1{f1 :: (A :: [integer()]) | (B :: [pid()])}) -> atom().
+c7(_) ->
+    a.
+
+c8() ->
+    c8(#r1{f1 = [a], f2 = [1], f3 = [a]}).
+
+-spec c8(#r1{f1 :: X :: (A :: [integer()]) | (B :: [pid()])}) -> atom().
+c8(_) ->
+    a.
-- 
2.16.4

openSUSE Build Service is sponsored by