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