Skip to content

Commit 8fdef5c

Browse files
committed
Properly track variables inside comprehensions size, closes #15247
1 parent d0514df commit 8fdef5c

2 files changed

Lines changed: 9 additions & 2 deletions

File tree

lib/elixir/src/elixir_erl_for.erl

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -318,8 +318,10 @@ no_var(ParentAnn, Elements) ->
318318

319319
no_var_expr(Ann, {string, _, String}) -> [{var, Ann, '_'} || _ <- String];
320320
no_var_expr(Ann, _) -> [{var, Ann, '_'}].
321-
no_var_size({var, _, _}) -> throw(unbound_size);
322-
no_var_size(Size) -> Size.
321+
322+
no_var_size(default) -> default;
323+
no_var_size(Size) when is_integer(Size) -> Size;
324+
no_var_size(_) -> throw(unbound_size).
323325

324326
build_comprehension(Ann, Clauses, Expr, Into) ->
325327
{comprehension_kind(Into), Ann, Expr, comprehension_clause(Clauses)}.

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -513,6 +513,11 @@ defmodule Kernel.ComprehensionTest do
513513
bin = <<8, 1, 32, 2, 3>>
514514
assert for(<<s, x::size(s) <- bin>>, into: "", do: <<x::size(s)>>) == <<1>>
515515
assert for(<<s, x::size(s) <- bin>>, into: %{}, do: {s, x}) == %{8 => 1}
516+
517+
# Computed
518+
bin = <<1, 1, 2, 2, 3>>
519+
assert for(<<s, x::size(s * 8) <- bin>>, into: "", do: <<x::size(s * 8)>>) == <<1, 2, 3>>
520+
assert for(<<s, x::size(s * 8) <- bin>>, into: %{}, do: {s, x}) == %{1 => 1, 2 => 515}
516521
end
517522

518523
test "binary for comprehensions where value is not used" do

0 commit comments

Comments
 (0)