Skip to content

Commit 23d9bfd

Browse files
committed
Do not leak vars between default args
Closes #15463.
1 parent 99cd654 commit 23d9bfd

2 files changed

Lines changed: 10 additions & 1 deletion

File tree

lib/elixir/src/elixir_def.erl

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -310,7 +310,8 @@ unpack_expanded(_Kind, _Meta, _Name, [], _Counter, Acc, Clauses) ->
310310

311311
expand_defaults([{'\\\\', Meta, [Expr, Default]} | Args], S, E, Acc) ->
312312
{ExpandedDefault, SE, _} = elixir_expand:expand(Default, S, E),
313-
expand_defaults(Args, SE, E, [{'\\\\', Meta, [Expr, ExpandedDefault]} | Acc]);
313+
expand_defaults(Args, elixir_env:reset_read(SE, S), E,
314+
[{'\\\\', Meta, [Expr, ExpandedDefault]} | Acc]);
314315
expand_defaults([Arg | Args], S, E, Acc) ->
315316
expand_defaults(Args, S, E, [Arg | Acc]);
316317
expand_defaults([], S, _E, Acc) ->

lib/elixir/test/elixir/kernel/defaults_test.exs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,14 @@ defmodule Kernel.DefaultsTest do
5252
end)
5353
end
5454

55+
test "errors on accessing variable from another default" do
56+
assert_compile_error(~r/undefined variable \"x\"/, fn ->
57+
defmodule VarDefaultScopeBetweenDefaults do
58+
def test(a \\ x = 1, b \\ x), do: {a, b}
59+
end
60+
end)
61+
end
62+
5563
test "errors on multiple defaults" do
5664
message = ~r"def hello/1 defines defaults multiple times"
5765

0 commit comments

Comments
 (0)