-module(receive_stacked).
-compile([export_all,nowarn_export_all]).
%% Messages may be stored outside any process heap until they
%% have been accepted by the 'remove_message' instruction.
%% When matching of a message fails, it is not allowed to
%% leave references to the message or any part of it in
%% the Y registers. An experimental code generator could
%% do that, causing an emulator crash if there happenened to
%% be a garbage collection.
%%
%% The 'S' file corresponding to this file was compiled with
%% that experimental code generator.
f1() ->
receive
X when is_integer(X) ->
id(42),
X
end.
f2() ->
receive
[X] ->
Res = {ok,X},
id(42),
{Res,X}
end.
f3() ->
receive
[H|_] when is_integer(H) ->
Res = {ok,H},
id(42),
{Res,H}
end.
f4() ->
receive
[_|T] when is_list(T) ->
Res = {ok,T},
id(42),
{Res,T}
end.
f5() ->
receive
{X} when is_integer(X) ->
Res = #{key=>X},
id(42),
{Res,X}
end.
f6() ->
receive
<<_:8,T/binary>> when byte_size(T) > 8 ->
id(42),
T
end.
f7() ->
receive
<<_:8,T/binary>> when is_binary(T) ->
id(42),
T
end.
f8() ->
receive
<<_:8,T/binary>> = Bin when is_binary(Bin) ->
id(42),
T
end.
m1() ->
receive
#{key:=V} when is_integer(V) ->
id(42),
[V]
end.
m2() ->
K1 = id(key1),
K2 = id(key2),
receive
#{K1:=V1,K2:=V2} when is_integer(V1), is_integer(V2) ->
id(42),
{V1,V2}
end.
id(I) ->
I.