Skip to content

Commit 977bb41

Browse files
author
José Valim
committed
Ensure variables in function clauses are not reused, closes #4815
1 parent 735296a commit 977bb41

File tree

5 files changed

+15
-13
lines changed

5 files changed

+15
-13
lines changed

lib/elixir/src/elixir_fn.erl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ translate(Meta, Clauses, S) ->
88
{Args, Guards} = elixir_clauses:extract_splat_guards(ArgsWithGuards),
99
{TClause, TS } = elixir_clauses:clause(CMeta, fun translate_fn_match/2,
1010
Args, Expr, Guards, Acc),
11-
{TClause, elixir_scope:mergef(S, TS)}
11+
{TClause, elixir_scope:mergec(S, TS)}
1212
end,
1313

1414
{TClauses, NS} = lists:mapfoldl(Transformer, S, Clauses),

lib/elixir/src/elixir_scope.erl

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,7 @@
22
-module(elixir_scope).
33
-export([translate_var/4, build_var/2, context_info/1,
44
load_binding/2, dump_binding/2,
5-
mergev/2, mergec/2, mergef/2,
6-
merge_vars/2, merge_opt_vars/2,
5+
mergev/2, mergec/2, merge_vars/2, merge_opt_vars/2,
76
warn_unsafe_var/4, warn_underscored_var_access/3, format_error/1
87
]).
98
-include("elixir.hrl").
@@ -128,14 +127,6 @@ mergec(S1, S2) ->
128127
caller=S2#elixir_scope.caller
129128
}.
130129

131-
%% Similar to mergec but does not merge the user vars counter.
132-
133-
mergef(S1, S2) ->
134-
S1#elixir_scope{
135-
super=S2#elixir_scope.super,
136-
caller=S2#elixir_scope.caller
137-
}.
138-
139130
%% Mergers.
140131

141132
merge_vars(V, V) -> V;

lib/elixir/test/elixir/kernel/fn_test.exs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,18 @@ defmodule Kernel.FnTest do
1818
refute (fn ^x -> true; _ -> false end).(1.0)
1919
end
2020

21+
test "case function hoisting does not affect anonymous fns" do
22+
assert :undefined =
23+
(if is_a?(:atom, 0) do
24+
user = :defined
25+
else
26+
(fn() ->
27+
user = :undefined
28+
user
29+
end).()
30+
end)
31+
end
32+
2133
test "capture with access" do
2234
assert (&(&1[:hello])).([hello: :world]) == :world
2335
end

lib/elixir/test/elixir/kernel/macros_test.exs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ defmodule Kernel.MacrosTest do
4848
assert_raise UndefinedFunctionError, fn -> x.value end
4949
end
5050

51-
test "bang do block" do
51+
test "macros with bang and do block have proper precedence" do
5252
import Kernel.MacrosTest.Nested
5353
assert (do_identity! do 1 end) == 1
5454
assert (Kernel.MacrosTest.Nested.do_identity! do 1 end) == 1

lib/elixir/test/erlang/string_test.erl

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ extract_interpolations(String) ->
1515
Z
1616
end.
1717

18-
1918
% Interpolations
2019

2120
extract_interpolations_without_interpolation_test() ->

0 commit comments

Comments
 (0)