diff options
author | Björn Gustavsson <bjorn@erlang.org> | 2022-08-23 12:38:59 +0200 |
---|---|---|
committer | Björn Gustavsson <bjorn@erlang.org> | 2022-08-23 13:35:52 +0200 |
commit | f1ad79dc876a882535204dc67b31eb4e9d1c13f4 (patch) | |
tree | cb00b25828809021274307bf765e7f5a531b134f | |
parent | 98dbb9de044ffa2d0f96696ab7a55e8a581cc90b (diff) | |
download | erlang-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.erl | 14 | ||||
-rw-r--r-- | 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,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. |