Skip to content

Commit 01a4889

Browse files
Aleksei Matiushkinjosevalim
authored andcommitted
Fix the nested uniq: acc name clash by preserving a scope (#11532)
1 parent d5e7446 commit 01a4889

File tree

2 files changed

+23
-10
lines changed

2 files changed

+23
-10
lines changed

lib/elixir/src/elixir_erl_for.erl

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ translate_reduce(Meta, Cases, Expr, Reduce, S) ->
2121
({'case', CaseAnn, _, CaseBlock}, InnerAcc) -> {'case', CaseAnn, InnerAcc, CaseBlock}
2222
end,
2323

24-
{build_reduce(Ann, TCases, InnerFun, TExpr, TReduce, false, SE), SE}.
24+
build_reduce(Ann, TCases, InnerFun, TExpr, TReduce, false, SE).
2525

2626
translate_into(Meta, Cases, Expr, Opts, Return, S) ->
2727
Ann = ?ann(Meta),
@@ -115,11 +115,11 @@ build_inline(Ann, Clauses, Expr, Into, Uniq, S) ->
115115

116116
build_inline_each(Ann, Clauses, Expr, false, Uniq, S) ->
117117
InnerFun = fun(InnerExpr, _InnerAcc) -> InnerExpr end,
118-
{build_reduce(Ann, Clauses, InnerFun, Expr, {nil, Ann}, Uniq, S), S};
118+
build_reduce(Ann, Clauses, InnerFun, Expr, {nil, Ann}, Uniq, S);
119119
build_inline_each(Ann, Clauses, Expr, {nil, _} = Into, Uniq, S) ->
120120
InnerFun = fun(InnerExpr, InnerAcc) -> {cons, Ann, InnerExpr, InnerAcc} end,
121-
ReduceExpr = build_reduce(Ann, Clauses, InnerFun, Expr, Into, Uniq, S),
122-
{?remote(Ann, lists, reverse, [ReduceExpr]), S};
121+
{ReduceExpr, SR} = build_reduce(Ann, Clauses, InnerFun, Expr, Into, Uniq, S),
122+
{?remote(Ann, lists, reverse, [ReduceExpr]), SR};
123123
build_inline_each(Ann, Clauses, Expr, {bin, _, []}, Uniq, S) ->
124124
{InnerValue, SV} = build_var(Ann, S),
125125
Generated = erl_anno:set_generated(true, Ann),
@@ -138,8 +138,8 @@ build_inline_each(Ann, Clauses, Expr, {bin, _, []}, Uniq, S) ->
138138
]}
139139
end,
140140

141-
ReduceExpr = build_reduce(Ann, Clauses, InnerFun, Expr, {nil, Ann}, Uniq, SV),
142-
{?remote(Ann, erlang, list_to_bitstring, [ReduceExpr]), SV}.
141+
{ReduceExpr, SR} = build_reduce(Ann, Clauses, InnerFun, Expr, {nil, Ann}, Uniq, SV),
142+
{?remote(Ann, erlang, list_to_bitstring, [ReduceExpr]), SR}.
143143

144144
build_into(Ann, Clauses, Expr, {map, _, []}, Uniq, S) ->
145145
{ReduceExpr, SR} = build_inline_each(Ann, Clauses, Expr, {nil, Ann}, Uniq, S),
@@ -161,7 +161,7 @@ build_into(Ann, Clauses, Expr, Into, Uniq, S) ->
161161
?remote(Ann, 'Elixir.Collectable', into, [Into])
162162
},
163163

164-
IntoReduceExpr = build_reduce(Ann, Clauses, InnerFun, Expr, Acc, Uniq, SD),
164+
{IntoReduceExpr, SN} = build_reduce(Ann, Clauses, InnerFun, Expr, Acc, Uniq, SD),
165165

166166
TryExpr =
167167
{'try', Ann,
@@ -173,7 +173,7 @@ build_into(Ann, Clauses, Expr, Into, Uniq, S) ->
173173
[stacktrace_clause(Ann, Fun, Acc, Kind, Reason, Stack)],
174174
[]},
175175

176-
{{block, Ann, [MatchExpr, TryExpr]}, SD}.
176+
{{block, Ann, [MatchExpr, TryExpr]}, SN}.
177177

178178
stacktrace_clause(Ann, Fun, Acc, Kind, Reason, Stack) ->
179179
{clause, Ann,
@@ -186,7 +186,7 @@ stacktrace_clause(Ann, Fun, Acc, Kind, Reason, Stack) ->
186186

187187
build_reduce(Ann, Clauses, InnerFun, Expr, Into, false, S) ->
188188
{Acc, SA} = build_var(Ann, S),
189-
build_reduce_each(Clauses, InnerFun(Expr, Acc), Into, Acc, SA);
189+
{build_reduce_each(Clauses, InnerFun(Expr, Acc), Into, Acc, SA), SA};
190190
build_reduce(Ann, Clauses, InnerFun, Expr, Into, true, S) ->
191191
%% Those variables are used only inside the anonymous function
192192
%% so we don't need to worry about returning the scope.
@@ -209,7 +209,7 @@ build_reduce(Ann, Clauses, InnerFun, Expr, Into, true, S) ->
209209
]},
210210

211211
EnumReduceCall = build_reduce_each(Clauses, InnerExpr, NewInto, Acc, SU),
212-
?remote(Ann, erlang, element, [{integer, Ann, 1}, EnumReduceCall]).
212+
{?remote(Ann, erlang, element, [{integer, Ann, 1}, EnumReduceCall]), SU}.
213213

214214
build_reduce_each([{enum, Meta, Left, Right, Filters} | T], Expr, Arg, Acc, S) ->
215215
Ann = ?ann(Meta),

lib/elixir/test/elixir/kernel/comprehension_test.exs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,19 @@ defmodule Kernel.ComprehensionTest do
9898
assert Process.get(:into_halt)
9999
end
100100

101+
test "nested for comprehensions with unique values" do
102+
assert for(x <- [1, 1, 2], uniq: true, do: for(y <- [3, 3], uniq: true, do: x * y)) == [
103+
[3],
104+
[6]
105+
]
106+
107+
assert for(<<x <- "abcabc">>,
108+
uniq: true,
109+
into: "",
110+
do: for(<<y <- "zz">>, uniq: true, into: "", do: to_bin(x) <> to_bin(y))
111+
) == "azbzcz"
112+
end
113+
101114
test "for comprehensions with nilly filters" do
102115
assert for(x <- 1..3, nilly(), do: x * 2) == []
103116
end

0 commit comments

Comments
 (0)