diff --git a/lib/elixir/src/elixir_bitstring.erl b/lib/elixir/src/elixir_bitstring.erl index 43354ad75c..8daa0acc4a 100644 --- a/lib/elixir/src/elixir_bitstring.erl +++ b/lib/elixir/src/elixir_bitstring.erl @@ -226,9 +226,9 @@ build_spec(Meta, Size, Unit, Type, Endianess, Sign, Spec, E) when Type == intege add_spec(Type, add_spec(Endianess, add_spec(Sign, Spec))) end. -number_size(default, _) -> default; -number_size(Size, default) -> Size; -number_size(Size, Unit) -> Size * Unit. +number_size(Size, default) when is_integer(Size) -> Size; +number_size(Size, Unit) when is_integer(Size) -> Size * Unit; +number_size(Size, _) -> Size. add_spec(default, Spec) -> Spec; add_spec(Key, Spec) -> [{Key, [], []} | Spec]. diff --git a/lib/elixir/test/elixir/kernel/expansion_test.exs b/lib/elixir/test/elixir/kernel/expansion_test.exs index c9385909c7..ca3a51873a 100644 --- a/lib/elixir/test/elixir/kernel/expansion_test.exs +++ b/lib/elixir/test/elixir/kernel/expansion_test.exs @@ -1078,6 +1078,12 @@ defmodule Kernel.ExpansionTest do quote do: (:"Elixir.Kernel.ExpansionTarget"; <>) end + test "supports dynamic size" do + import Kernel, except: [-: 2] + assert expand(quote do: (var = 1; <>)) == + quote do: (var = 1; <>) + end + test "raises on size or unit for literal bitstrings" do assert_raise CompileError, ~r"literal <<>> in bitstring supports only type specifiers", fn -> expand(quote do: << <<"foo">>::32 >>)