summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBjörn Gustavsson <bjorn@erlang.org>2022-08-23 12:38:59 +0200
committerBjörn Gustavsson <bjorn@erlang.org>2022-08-23 13:35:52 +0200
commitf1ad79dc876a882535204dc67b31eb4e9d1c13f4 (patch)
treecb00b25828809021274307bf765e7f5a531b134f
parent98dbb9de044ffa2d0f96696ab7a55e8a581cc90b (diff)
downloaderlang-f1ad79dc876a882535204dc67b31eb4e9d1c13f4.tar.gz
Eliminate false warnings when using the inline_list_funcs option
Closes #6158
-rw-r--r--lib/compiler/src/sys_core_fold_lists.erl14
-rw-r--r--lib/compiler/test/warnings_SUITE.erl33
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,7 @@
underscore/1,no_warnings/1,
bit_syntax/1,inlining/1,tuple_calls/1,
recv_opt_info/1,opportunistic_warnings/1,
- eep49/1]).
+ eep49/1,inline_list_funcs/1]).
init_per_testcase(_Case, Config) ->
Config.
@@ -68,7 +68,7 @@ groups() ->
redundant_boolean_clauses,
underscore,no_warnings,bit_syntax,inlining,
tuple_calls,recv_opt_info,opportunistic_warnings,
- eep49]}].
+ eep49,inline_list_funcs]}].
init_per_suite(Config) ->
test_lib:recompile(?MODULE),
@@ -1248,6 +1248,35 @@ eep49(Config) ->
run(Config, Ts),
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.