Skip to content

Commit b1fec93

Browse files
committed
Raise CompileError in case of duplicated do clauses for cond
1 parent c9a3cfa commit b1fec93

File tree

2 files changed

+9
-0
lines changed

2 files changed

+9
-0
lines changed

lib/elixir/src/elixir_exp_clauses.erl

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,9 @@ do_case(Meta, {Key, _}, _Acc, E) ->
6464
'cond'(Meta, KV, E) when not is_list(KV) ->
6565
compile_error(Meta, ?m(E, file), "invalid arguments for cond");
6666
'cond'(Meta, KV, E) ->
67+
ok = assert_at_most_once('do', KV, 0, fun(Kind) ->
68+
compile_error(Meta, ?m(E, file), "duplicated ~ts clauses given for cond", [Kind])
69+
end),
6770
EE = E#{export_vars := []},
6871
{EClauses, EVars} = lists:mapfoldl(fun(X, Acc) -> do_cond(Meta, X, Acc, EE) end, [], KV),
6972
{EClauses, elixir_env:mergev(EVars, E)}.

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -326,6 +326,12 @@ defmodule Kernel.ExpansionTest do
326326
quote do: (cond do 1 -> x = 1; 2 -> y = 2 end; :erlang.+(x, y))
327327
end
328328

329+
test "cond: expects at most one do" do
330+
assert_raise CompileError, ~r"duplicated do clauses given for cond", fn ->
331+
expand(quote(do: (cond do: (x -> x), do: (y -> y))))
332+
end
333+
end
334+
329335
## Case
330336

331337
test "case: expands each clause" do

0 commit comments

Comments
 (0)