File 0460-Eliminate-false-warnings-when-using-the-inline_list_.patch of Package erlang

From f1ad79dc876a882535204dc67b31eb4e9d1c13f4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bj=C3=B6rn=20Gustavsson?= <bjorn@erlang.org>
Date: Tue, 23 Aug 2022 12:38:59 +0200
Subject: [PATCH] Eliminate false warnings when using the inline_list_funcs
 option

Closes #6158
---
 lib/compiler/src/sys_core_fold_lists.erl | 14 +++++-----
 lib/compiler/test/warnings_SUITE.erl     | 33 ++++++++++++++++++++++--
 2 files changed, 39 insertions(+), 8 deletions(-)

diff --git a/lib/compiler/src/sys_core_fold_lists.erl b/lib/compiler/src/sys_core_fold_lists.erl
index f94a25d961..6fc98e3411 100644
--- a/lib/compiler/src/sys_core_fold_lists.erl
+++ b/lib/compiler/src/sys_core_fold_lists.erl
@@ -43,12 +43,13 @@ call(#c_call{anno=Anno}, lists, all, [Arg1,Arg2]) ->
     CC2 = #c_clause{anno=Anno,
                     pats=[#c_literal{val=false}], guard=#c_literal{val=true},
 		    body=#c_literal{val=false}},
-    CC3 = #c_clause{anno=Anno,
+    CC3 = #c_clause{anno=[compiler_generated|Anno],
                     pats=[X], guard=#c_literal{val=true},
 		    body=match_fail(Anno, Err1)},
     C1 = #c_clause{anno=Anno,
                    pats=[#c_cons{hd=X, tl=Xs}], guard=#c_literal{val=true},
-		   body=#c_case{arg=#c_apply{anno=Anno, op=F, args=[X]},
+		   body=#c_case{anno=Anno,
+                                arg=#c_apply{anno=Anno, op=F, args=[X]},
 				clauses = [CC1, CC2, CC3]}},
     C2 = #c_clause{anno=Anno,
                    pats=[#c_literal{val=[]}],
@@ -59,7 +60,7 @@ call(#c_call{anno=Anno}, lists, all, [Arg1,Arg2]) ->
     C3 = #c_clause{anno=Anno, pats=[Xs], guard=#c_literal{val=true},
 		   body=function_clause(Anno, [F, Xs])},
     Fun = #c_fun{vars=[Xs],
-		 body=#c_case{arg=Xs, clauses=[C1, C2, C3]}},
+		 body=#c_case{anno=Anno, arg=Xs, clauses=[C1, C2, C3]}},
     L = #c_var{name='L'},
     #c_let{vars=[F, L], arg=#c_values{es=[Arg1, Arg2]},
 	   body=#c_letrec{defs=[{Loop,Fun}],
@@ -76,12 +77,13 @@ call(#c_call{anno=Anno}, lists, any, [Arg1,Arg2]) ->
     CC2 = #c_clause{anno=Anno,
                     pats=[#c_literal{val=false}], guard=#c_literal{val=true},
 		    body=#c_apply{anno=Anno, op=Loop, args=[Xs]}},
-    CC3 = #c_clause{anno=Anno,
+    CC3 = #c_clause{anno=[compiler_generated|Anno],
                     pats=[X], guard=#c_literal{val=true},
 		    body=match_fail(Anno, Err1)},
     C1 = #c_clause{anno=Anno,
                    pats=[#c_cons{hd=X, tl=Xs}], guard=#c_literal{val=true},
-		   body=#c_case{arg=#c_apply{anno=Anno, op=F, args=[X]},
+		   body=#c_case{anno=Anno,
+                                arg=#c_apply{anno=Anno, op=F, args=[X]},
 				clauses = [CC1, CC2, CC3]}},
     C2 = #c_clause{anno=Anno,
                    pats=[#c_literal{val=[]}],
@@ -92,7 +94,7 @@ call(#c_call{anno=Anno}, lists, any, [Arg1,Arg2]) ->
     C3 = #c_clause{pats=[Xs], guard=#c_literal{val=true},
 		   body=function_clause(Anno, [F, Xs])},
     Fun = #c_fun{vars=[Xs],
-		 body=#c_case{arg=Xs, clauses=[C1, C2, C3]}},
+		 body=#c_case{anno=Anno, arg=Xs, clauses=[C1, C2, C3]}},
     L = #c_var{name='L'},
     #c_let{vars=[F, L], arg=#c_values{es=[Arg1, Arg2]},
 	   body=#c_letrec{defs=[{Loop,Fun}],
diff --git a/lib/compiler/test/warnings_SUITE.erl b/lib/compiler/test/warnings_SUITE.erl
index 628d05ca4e..9b860de951 100644
--- a/lib/compiler/test/warnings_SUITE.erl
+++ b/lib/compiler/test/warnings_SUITE.erl
@@ -44,7 +44,8 @@
          redundant_boolean_clauses/1,
 	 underscore/1,no_warnings/1,
 	 bit_syntax/1,inlining/1,tuple_calls/1,
-         recv_opt_info/1,opportunistic_warnings/1]).
+         recv_opt_info/1,opportunistic_warnings/1,
+         inline_list_funcs/1]).
 
 init_per_testcase(_Case, Config) ->
     Config.
@@ -68,7 +68,8 @@ groups() ->
        maps_bin_opt_info,
        redundant_boolean_clauses,
        underscore,no_warnings,bit_syntax,inlining,
-       tuple_calls,recv_opt_info,opportunistic_warnings]}].
+       tuple_calls,recv_opt_info,opportunistic_warnings]},
+       inline_list_funcs]}].
 
 init_per_suite(Config) ->
     test_lib:recompile(?MODULE),
@@ -1248,6 +1248,36 @@ eep49(Config) ->
 
     ok.
 
+%% GH-6158: There would be a warning for a clause that could not match.
+inline_list_funcs(Config) ->
+    Ts = [{basic,
+           <<"all(L) ->
+                  lists:all(fun erlang:is_integer/1, L).
+              any(L) ->
+                  lists:any(fun erlang:is_integer/1, L).
+              foreach(L) ->
+                  lists:foreach(fun erlang:is_integer/1, L).
+              map(L) ->
+                  lists:map(fun erlang:abs/1, L).
+              filter(L) ->
+                  lists:map(fun erlang:is_integer/1, L).
+              foldl(L) ->
+                  lists:foldl(fun erlang:is_function/2, L).
+              foldr(L) ->
+                  lists:foldl(fun erlang:is_function/2, L).
+              mapfoldl(L) ->
+                  lists:mapfoldl(fun erlang:is_function/2, L).
+              mapfoldr(L) ->
+                  lists:mapfoldr(fun erlang:is_function/2, L).
+              ">>,
+           [inline_list_funcs],
+           []}
+         ],
+    run(Config, Ts),
+
+    ok.
+
+
 %%%
 %%% End of test cases.
 %%%
-- 
2.35.3

openSUSE Build Service is sponsored by