From 2ca91b2f861a17a741ef0249dd11a319dc72660b Mon Sep 17 00:00:00 2001 From: Anthony Ramine Date: Sun, 4 Nov 2012 17:24:15 +0100 Subject: Make inlined list functions fail with function_clause The function_clause errors produced by inline_list_funcs should properly be annotated with their function names to avoid kernel_v3 making them into case_clauses errors. See v3_kernel:translate_match_fail_1/4. --- lib/compiler/test/inline_SUITE.erl | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) (limited to 'lib/compiler/test/inline_SUITE.erl') diff --git a/lib/compiler/test/inline_SUITE.erl b/lib/compiler/test/inline_SUITE.erl index 2e17d3fde6..01bc9b34ad 100644 --- a/lib/compiler/test/inline_SUITE.erl +++ b/lib/compiler/test/inline_SUITE.erl @@ -255,6 +255,28 @@ lists(Config) when is_list(Config) -> %% Cleanup. erase(?MODULE), + + {'EXIT',{function_clause,_}} = + (catch lists:map(fun (X) -> X end, not_a_list)), + {'EXIT',{function_clause,_}} = + (catch lists:flatmap(fun (X) -> X end, not_a_list)), + {'EXIT',{function_clause,_}} = + (catch lists:foreach(fun (X) -> X end, not_a_list)), + {'EXIT',{function_clause,_}} = + (catch lists:filter(fun (_) -> true end, not_a_list)), + {'EXIT',{function_clause,_}} = + (catch lists:any(fun (_) -> false end, not_a_list)), + {'EXIT',{function_clause,_}} = + (catch lists:all(fun (_) -> true end, not_a_list)), + {'EXIT',{function_clause,_}} = + (catch lists:foldl(fun (X, Acc) -> {X,Acc} end, acc, not_a_list)), + {'EXIT',{function_clause,_}} = + (catch lists:foldr(fun (X, Acc) -> {X,Acc} end, acc, not_a_list)), + {'EXIT',{function_clause,_}} = + (catch lists:mapfoldl(fun (X, Acc) -> {X,Acc} end, acc, not_a_list)), + {'EXIT',{function_clause,_}} = + (catch lists:mapfoldr(fun (X, Acc) -> {X,Acc} end, acc, not_a_list)), + ok. my_apply(M, F, A, Init) -> -- cgit v1.2.3 From 572d66b1e4a5d5e519f89881a18bdf4f2745f62c Mon Sep 17 00:00:00 2001 From: Anthony Ramine Date: Sun, 4 Nov 2012 19:20:29 +0100 Subject: Properly guard against badly-typed arguments when inlining The inlining code for inline_list_funcs silenced the function_clause error that should occur when calling lists:map(3.5, []). --- lib/compiler/test/inline_SUITE.erl | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'lib/compiler/test/inline_SUITE.erl') diff --git a/lib/compiler/test/inline_SUITE.erl b/lib/compiler/test/inline_SUITE.erl index 01bc9b34ad..63180c3f95 100644 --- a/lib/compiler/test/inline_SUITE.erl +++ b/lib/compiler/test/inline_SUITE.erl @@ -277,6 +277,19 @@ lists(Config) when is_list(Config) -> {'EXIT',{function_clause,_}} = (catch lists:mapfoldr(fun (X, Acc) -> {X,Acc} end, acc, not_a_list)), + {'EXIT',{function_clause,_}} = (catch lists:map(not_a_function, [])), + {'EXIT',{function_clause,_}} = (catch lists:flatmap(not_a_function, [])), + {'EXIT',{function_clause,_}} = (catch lists:foreach(not_a_function, [])), + {'EXIT',{function_clause,_}} = (catch lists:filter(not_a_function, [])), + {'EXIT',{function_clause,_}} = (catch lists:any(not_a_function, [])), + {'EXIT',{function_clause,_}} = (catch lists:all(not_a_function, [])), + {'EXIT',{function_clause,_}} = (catch lists:foldl(not_a_function, acc, [])), + {'EXIT',{function_clause,_}} = (catch lists:foldr(not_a_function, acc, [])), + {'EXIT',{function_clause,_}} = + (catch lists:mapfoldl(not_a_function, acc, [])), + {'EXIT',{function_clause,_}} = + (catch lists:mapfoldr(not_a_function, acc, [])), + ok. my_apply(M, F, A, Init) -> -- cgit v1.2.3 From 7b0b3688ba8b921b8cc1eff39ed39a14c424d557 Mon Sep 17 00:00:00 2001 From: Anthony Ramine Date: Mon, 5 Nov 2012 17:04:07 +0100 Subject: Raise a function_clause error with the right arguments when inlining The inlined lists functions raised an error with only the list instead of all their given arguments. --- lib/compiler/test/inline_SUITE.erl | 48 ++++++++++++++++++++++---------------- 1 file changed, 28 insertions(+), 20 deletions(-) (limited to 'lib/compiler/test/inline_SUITE.erl') diff --git a/lib/compiler/test/inline_SUITE.erl b/lib/compiler/test/inline_SUITE.erl index 63180c3f95..e7bb552edb 100644 --- a/lib/compiler/test/inline_SUITE.erl +++ b/lib/compiler/test/inline_SUITE.erl @@ -256,38 +256,46 @@ lists(Config) when is_list(Config) -> %% Cleanup. erase(?MODULE), - {'EXIT',{function_clause,_}} = + {'EXIT',{function_clause,[{?MODULE,_,[_,not_a_list],_}|_]}} = (catch lists:map(fun (X) -> X end, not_a_list)), - {'EXIT',{function_clause,_}} = + {'EXIT',{function_clause,[{?MODULE,_,[_,not_a_list],_}|_]}} = (catch lists:flatmap(fun (X) -> X end, not_a_list)), - {'EXIT',{function_clause,_}} = + {'EXIT',{function_clause,[{?MODULE,_,[_,not_a_list],_}|_]}} = (catch lists:foreach(fun (X) -> X end, not_a_list)), - {'EXIT',{function_clause,_}} = + {'EXIT',{function_clause,[{?MODULE,_,[_,not_a_list],_}|_]}} = (catch lists:filter(fun (_) -> true end, not_a_list)), - {'EXIT',{function_clause,_}} = + {'EXIT',{function_clause,[{?MODULE,_,[_,not_a_list],_}|_]}} = (catch lists:any(fun (_) -> false end, not_a_list)), - {'EXIT',{function_clause,_}} = + {'EXIT',{function_clause,[{?MODULE,_,[_,not_a_list],_}|_]}} = (catch lists:all(fun (_) -> true end, not_a_list)), - {'EXIT',{function_clause,_}} = + {'EXIT',{function_clause,[{?MODULE,_,[_,acc,not_a_list],_}|_]}} = (catch lists:foldl(fun (X, Acc) -> {X,Acc} end, acc, not_a_list)), - {'EXIT',{function_clause,_}} = + {'EXIT',{function_clause,[{?MODULE,_,[_,acc,not_a_list],_}|_]}} = (catch lists:foldr(fun (X, Acc) -> {X,Acc} end, acc, not_a_list)), - {'EXIT',{function_clause,_}} = + {'EXIT',{function_clause,[{?MODULE,_,[_,acc,not_a_list],_}|_]}} = (catch lists:mapfoldl(fun (X, Acc) -> {X,Acc} end, acc, not_a_list)), - {'EXIT',{function_clause,_}} = + {'EXIT',{function_clause,[{?MODULE,_,[_,acc,not_a_list],_}|_]}} = (catch lists:mapfoldr(fun (X, Acc) -> {X,Acc} end, acc, not_a_list)), - {'EXIT',{function_clause,_}} = (catch lists:map(not_a_function, [])), - {'EXIT',{function_clause,_}} = (catch lists:flatmap(not_a_function, [])), - {'EXIT',{function_clause,_}} = (catch lists:foreach(not_a_function, [])), - {'EXIT',{function_clause,_}} = (catch lists:filter(not_a_function, [])), - {'EXIT',{function_clause,_}} = (catch lists:any(not_a_function, [])), - {'EXIT',{function_clause,_}} = (catch lists:all(not_a_function, [])), - {'EXIT',{function_clause,_}} = (catch lists:foldl(not_a_function, acc, [])), - {'EXIT',{function_clause,_}} = (catch lists:foldr(not_a_function, acc, [])), - {'EXIT',{function_clause,_}} = + {'EXIT',{function_clause,[{?MODULE,_,[not_a_function,[]],_}|_]}} = + (catch lists:map(not_a_function, [])), + {'EXIT',{function_clause,[{?MODULE,_,[not_a_function,[]],_}|_]}} = + (catch lists:flatmap(not_a_function, [])), + {'EXIT',{function_clause,[{?MODULE,_,[not_a_function,[]],_}|_]}} = + (catch lists:foreach(not_a_function, [])), + {'EXIT',{function_clause,[{?MODULE,_,[not_a_function,[]],_}|_]}} = + (catch lists:filter(not_a_function, [])), + {'EXIT',{function_clause,[{?MODULE,_,[not_a_function,[]],_}|_]}} = + (catch lists:any(not_a_function, [])), + {'EXIT',{function_clause,[{?MODULE,_,[not_a_function,[]],_}|_]}} = + (catch lists:all(not_a_function, [])), + {'EXIT',{function_clause,[{?MODULE,_,[not_a_function,acc,[]],_}|_]}} = + (catch lists:foldl(not_a_function, acc, [])), + {'EXIT',{function_clause,[{?MODULE,_,[not_a_function,acc,[]],_}|_]}} = + (catch lists:foldr(not_a_function, acc, [])), + {'EXIT',{function_clause,[{?MODULE,_,[not_a_function,acc,[]],_}|_]}} = (catch lists:mapfoldl(not_a_function, acc, [])), - {'EXIT',{function_clause,_}} = + {'EXIT',{function_clause,[{?MODULE,_,[not_a_function,acc,[]],_}|_]}} = (catch lists:mapfoldr(not_a_function, acc, [])), ok. -- cgit v1.2.3