Skip to content

Commit a6a38e1

Browse files
authoredMar 25, 2025
Handle non-binary bitstring in struct default values (#14363)
1 parent 5c63c8d commit a6a38e1

File tree

2 files changed

+19
-0
lines changed

2 files changed

+19
-0
lines changed
 

‎lib/elixir/src/elixir_erl.erl

+10
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,9 @@ elixir_to_erl(Tree, Ann) when is_binary(Tree) ->
9696
%% considers a string in a binary to be encoded in latin1, so the bytes
9797
%% are not changed in any fashion.
9898
{bin, Ann, [{bin_element, Ann, {string, Ann, binary_to_list(Tree)}, default, default}]};
99+
elixir_to_erl(Tree, Ann) when is_bitstring(Tree) ->
100+
Segments = [elixir_to_erl_bitstring_segment(X, Ann) || X <- bitstring_to_list(Tree)],
101+
{bin, Ann, Segments};
99102
elixir_to_erl(Tree, Ann) when is_function(Tree) ->
100103
case (erlang:fun_info(Tree, type) == {type, external}) andalso
101104
(erlang:fun_info(Tree, env) == {env, []}) of
@@ -115,6 +118,13 @@ elixir_to_erl(Tree, Ann) ->
115118
elixir_to_erl_cons([H | T], Ann) -> {cons, Ann, elixir_to_erl(H, Ann), elixir_to_erl_cons(T, Ann)};
116119
elixir_to_erl_cons(T, Ann) -> elixir_to_erl(T, Ann).
117120

121+
elixir_to_erl_bitstring_segment(Int, Ann) when is_integer(Int) ->
122+
{bin_element, Ann, {integer, Ann, Int}, default, [integer]};
123+
elixir_to_erl_bitstring_segment(Rest, Ann) when is_bitstring(Rest) ->
124+
Size = bit_size(Rest),
125+
<<Int:Size>> = Rest,
126+
{bin_element, Ann, {integer, Ann, Int}, {integer, Ann, Size}, [integer]}.
127+
118128
%% Returns a scope for translation.
119129

120130
scope(_Meta, ExpandCaptures) ->

‎lib/elixir/test/elixir/map_test.exs

+9
Original file line numberDiff line numberDiff line change
@@ -395,6 +395,15 @@ defmodule MapTest do
395395
assert quoted == {:%, [], [User, {:%{}, [], [{:foo, 1}]}]}
396396
end
397397

398+
test "structs with bitstring defaults" do
399+
defmodule WithBitstring do
400+
defstruct bitstring: <<255, 127::7>>
401+
end
402+
403+
info = Macro.struct_info!(WithBitstring, __ENV__)
404+
assert info == [%{default: <<255, 127::7>>, field: :bitstring}]
405+
end
406+
398407
test "defstruct can only be used once in a module" do
399408
message =
400409
"defstruct has already been called for TestMod, " <>

0 commit comments

Comments
 (0)