diff options
author | Björn Gustavsson <[email protected]> | 2016-05-13 10:23:19 +0200 |
---|---|---|
committer | Björn Gustavsson <[email protected]> | 2016-05-13 10:23:19 +0200 |
commit | 35bee6986f9dd2a8111ffa86f93c5907a7bfe759 (patch) | |
tree | fd465c4563a7dedfea6a6ace6a58fa16f23f0bf3 /lib/compiler/src | |
parent | 787392012da7671a71f15d9c04725601856b6a97 (diff) | |
parent | a0bef9607f44c273a1dcebd639af3bc68f2c9872 (diff) | |
download | otp-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.erl | 17 |
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) -> |