aboutsummaryrefslogtreecommitdiffstats
path: root/lib/compiler/src
diff options
context:
space:
mode:
authorBjörn Gustavsson <[email protected]>2016-05-13 10:23:19 +0200
committerBjörn Gustavsson <[email protected]>2016-05-13 10:23:19 +0200
commit35bee6986f9dd2a8111ffa86f93c5907a7bfe759 (patch)
treefd465c4563a7dedfea6a6ace6a58fa16f23f0bf3 /lib/compiler/src
parent787392012da7671a71f15d9c04725601856b6a97 (diff)
parenta0bef9607f44c273a1dcebd639af3bc68f2c9872 (diff)
downloadotp-35bee6986f9dd2a8111ffa86f93c5907a7bfe759.tar.gz
otp-35bee6986f9dd2a8111ffa86f93c5907a7bfe759.tar.bz2
otp-35bee6986f9dd2a8111ffa86f93c5907a7bfe759.zip
Merge branch 'bjorn/compiler/badfun-literal/ERL-138/OTP-13552'
* bjorn/compiler/badfun-literal/ERL-138/OTP-13552: sys_core_fold: Don't generated failing calls such as 3(4) fun_SUITE: Test for failing calls to funs
Diffstat (limited to 'lib/compiler/src')
-rw-r--r--lib/compiler/src/sys_core_fold.erl17
1 files changed, 15 insertions, 2 deletions
diff --git a/lib/compiler/src/sys_core_fold.erl b/lib/compiler/src/sys_core_fold.erl
index b5b8d8a8ec..dbc27db377 100644
--- a/lib/compiler/src/sys_core_fold.erl
+++ b/lib/compiler/src/sys_core_fold.erl
@@ -374,10 +374,21 @@ expr(#c_receive{clauses=Cs0,timeout=T0,action=A0}=Recv, Ctxt, Sub) ->
T1 = expr(T0, value, Sub),
A1 = body(A0, Ctxt, Sub),
Recv#c_receive{clauses=Cs1,timeout=T1,action=A1};
-expr(#c_apply{op=Op0,args=As0}=App, _, Sub) ->
+expr(#c_apply{anno=Anno,op=Op0,args=As0}=App, _, Sub) ->
Op1 = expr(Op0, value, Sub),
As1 = expr_list(As0, value, Sub),
- App#c_apply{op=Op1,args=As1};
+ case Op1 of
+ #c_var{} ->
+ App#c_apply{op=Op1,args=As1};
+ _ ->
+ add_warning(App, invalid_call),
+ Err = #c_call{anno=Anno,
+ module=#c_literal{val=erlang},
+ name=#c_literal{val=error},
+ args=[#c_tuple{es=[#c_literal{val='badfun'},
+ Op1]}]},
+ make_effect_seq(As1++[Err], Sub)
+ end;
expr(#c_call{module=M0,name=N0}=Call0, Ctxt, Sub) ->
M1 = expr(M0, value, Sub),
N1 = expr(N0, value, Sub),
@@ -3395,6 +3406,8 @@ format_error({no_effect,{erlang,F,A}}) ->
format_error(result_ignored) ->
"the result of the expression is ignored "
"(suppress the warning by assigning the expression to the _ variable)";
+format_error(invalid_call) ->
+ "invalid function call";
format_error(useless_building) ->
"a term is constructed, but never used";
format_error(bin_opt_alias) ->