Skip to content

Commit c9a3cfa

Browse files
committed
Raise CompileError in case of duplicated clauses given for receive
1 parent 9726dad commit c9a3cfa

File tree

2 files changed

+16
-1
lines changed

2 files changed

+16
-1
lines changed

lib/elixir/src/elixir_exp_clauses.erl

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,11 @@ do_cond(Meta, {Key, _}, _Acc, E) ->
8181
'receive'(Meta, KV, E) when not is_list(KV) ->
8282
compile_error(Meta, ?m(E, file), "invalid arguments for receive");
8383
'receive'(Meta, KV, E) ->
84+
RaiseError = fun(Kind) ->
85+
compile_error(Meta, ?m(E, file), "duplicated ~ts clauses given for receive", [Kind])
86+
end,
87+
ok = assert_at_most_once('do', KV, 0, RaiseError),
88+
ok = assert_at_most_once('after', KV, 0, RaiseError),
8489
EE = E#{export_vars := []},
8590
{EClauses, EVars} = lists:mapfoldl(fun(X, Acc) -> do_receive(Meta, X, Acc, EE) end, [], KV),
8691
{EClauses, elixir_env:mergev(EVars, E)}.

lib/elixir/test/elixir/kernel/expansion_test.exs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -385,6 +385,16 @@ defmodule Kernel.ExpansionTest do
385385
quote do: (receive do x -> x = x after y() -> y(); w = y() end; :erlang.+(x, w))
386386
end
387387

388+
test "receive: expects at most one clause" do
389+
assert_raise CompileError, ~r"duplicated do clauses given for receive", fn ->
390+
expand(quote(do: (receive do: (x -> x), do: (y -> y))))
391+
end
392+
393+
assert_raise CompileError, ~r"duplicated after clauses given for receive", fn ->
394+
expand(quote(do: (receive do x -> x after y -> y after z -> z end)))
395+
end
396+
end
397+
388398
## Try
389399

390400
test "try: expands catch" do
@@ -415,7 +425,7 @@ defmodule Kernel.ExpansionTest do
415425

416426
test "try: expects at most one clause" do
417427
assert_raise CompileError, ~r"duplicated do clauses given for try", fn ->
418-
expand(quote(do: try(do: e, do: f)))
428+
expand(quote(do: (try do: e, do: f)))
419429
end
420430

421431
assert_raise CompileError, ~r"duplicated rescue clauses given for try", fn ->

0 commit comments

Comments
 (0)