aboutsummaryrefslogtreecommitdiffstats
path: root/lib/compiler/test/fun_SUITE.erl
diff options
context:
space:
mode:
Diffstat (limited to 'lib/compiler/test/fun_SUITE.erl')
-rw-r--r--lib/compiler/test/fun_SUITE.erl136
1 files changed, 136 insertions, 0 deletions
diff --git a/lib/compiler/test/fun_SUITE.erl b/lib/compiler/test/fun_SUITE.erl
new file mode 100644
index 0000000000..fb2667245a
--- /dev/null
+++ b/lib/compiler/test/fun_SUITE.erl
@@ -0,0 +1,136 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2000-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+-module(fun_SUITE).
+
+-export([all/1,
+ test1/1,overwritten_fun/1,otp_7202/1,bif_fun/1]).
+
+-include("test_server.hrl").
+
+all(suite) ->
+ test_lib:recompile(?MODULE),
+ [test1,overwritten_fun,otp_7202,bif_fun].
+
+%%% The help functions below are copied from emulator:bs_construct_SUITE.
+
+-define(T(B, L), {B, ??B, L}).
+
+l1() ->
+ [
+ ?T((begin A = 3, F = fun(A) -> 1; (_) -> 2 end, F(2) end), 1),
+ ?T((begin G = fun(1=0) -> ok end, {'EXIT',_} = (catch G(2)), ok end), ok)
+ ].
+
+test1(suite) -> [];
+test1(Config) when is_list(Config) ->
+ ?line lists:foreach(fun one_test/1, eval_list(l1(), [])),
+ ok.
+
+evaluate(Str, Vars) ->
+ {ok,Tokens,_} =
+ erl_scan:string(Str ++ " . "),
+ {ok, [Expr]} = erl_parse:parse_exprs(Tokens),
+ case erl_eval:expr(Expr, Vars) of
+ {value, Result, _} ->
+ Result
+ end.
+
+eval_list([], _Vars) ->
+ [];
+eval_list([{C_bin, Str, Bytes} | Rest], Vars) ->
+ case catch evaluate(Str, Vars) of
+ {'EXIT', Error} ->
+ io:format("Evaluation error: ~p, ~p, ~p~n", [Str, Vars, Error]),
+ exit(Error);
+ E_bin ->
+ [{C_bin, E_bin, Str, Bytes} | eval_list(Rest, Vars)]
+ end.
+
+one_test({C, E, Str, Correct}) ->
+ io:format(" ~s, ~p~n", [Str, Correct]),
+ if
+ C == Correct ->
+ ok;
+ true ->
+ io:format("ERROR: Compiled: ~p. Expected ~p. Got ~p.~n",
+ [Str, Correct, C]),
+ test_server:fail(comp)
+ end,
+ if
+ E == Correct ->
+ ok;
+ true ->
+ io:format("ERROR: Interpreted: ~p. Expected ~p. Got ~p.~n",
+ [Str, Correct, E]),
+ test_server:fail(comp)
+ end.
+
+-record(b, {c}).
+
+%% OTP-7102. (Thanks to Simon Cornish.)
+
+overwritten_fun(Config) when is_list(Config) ->
+ ?line {a2,a} = overwritten_fun_1(a),
+ ?line {a2,{b,c}} = overwritten_fun_1(#b{c=c}),
+ ?line one = overwritten_fun_1(#b{c=[]}),
+ ok.
+
+overwritten_fun_1(A) ->
+ F = fun() ->
+ {ok, A}
+ end,
+ if A#b.c == [] ->
+ one;
+ true ->
+ case F() of
+ {ok, A2} ->
+ {a2, A2};
+ _ ->
+ three
+ end
+ end.
+
+%% OTP-7202. The liveness calculation for the make_fun2 instruction was wrong.
+
+otp_7202(Config) when is_list(Config) ->
+ otp_7202().
+
+otp_7202() ->
+ List = [a],
+ Error = case otp_7202_func() of
+ no_value -> true;
+ {ok, V} -> V
+ end,
+ lists:foreach(fun(_E) ->
+ case Error of
+ true ->
+ ok;
+ false ->
+ ok
+ end
+ end, List).
+
+otp_7202_func() ->
+ no_value.
+
+bif_fun(Config) when is_list(Config) ->
+ ?line F = fun abs/1,
+ ?line 5 = F(-5),
+ ok.
+