@@ -33,12 +33,22 @@ expand(_BitstrMeta, _Fun, [], Acc, S, E, Alignment, _RequireSize) ->
33
33
expand (BitstrMeta , Fun , [{'::' , Meta , [Left , Right ]} | T ], Acc , S , E , Alignment , RequireSize ) ->
34
34
{ELeft , {SL , OriginalS }, EL } = expand_expr (Meta , Left , Fun , S , E ),
35
35
36
- MatchOrRequireSize = RequireSize or is_match_size (T , EL ),
37
- EType = expr_type (ELeft ),
38
- {ERight , EAlignment , SS , ES } = expand_specs (EType , Meta , Right , SL , OriginalS , EL , MatchOrRequireSize ),
39
-
40
- EAcc = concat_or_prepend_bitstring (Meta , ELeft , ERight , Acc , ES , MatchOrRequireSize ),
41
- expand (BitstrMeta , Fun , T , EAcc , {SS , OriginalS }, ES , alignment (Alignment , EAlignment ), RequireSize );
36
+ case {ELeft , Right } of
37
+ {{'^' , _ , [{var , _ , _ }]}, {Type , _ , _ }} when Type == binary ; Type == bitstring ->
38
+ SizeFun = case Type of
39
+ binary -> byte_size ;
40
+ bitstring -> bit_size
41
+ end ,
42
+ ERight = {'-' , Meta , [Right , {size , Meta , [{{'.' , Meta , [erlang , SizeFun ]}, Meta , [ELeft ]}]}]},
43
+ EAcc = concat_or_prepend_bitstring (Meta , ELeft , ERight , Acc , EL , RequireSize ),
44
+ expand (BitstrMeta , Fun , T , EAcc , {SL , OriginalS }, EL , unknown , RequireSize );
45
+ _ ->
46
+ MatchOrRequireSize = RequireSize or is_match_size (T , EL ),
47
+ EType = expr_type (ELeft ),
48
+ {ERight , EAlignment , SS , ES } = expand_specs (EType , Meta , Right , SL , OriginalS , EL , MatchOrRequireSize ),
49
+ EAcc = concat_or_prepend_bitstring (Meta , ELeft , ERight , Acc , ES , MatchOrRequireSize ),
50
+ expand (BitstrMeta , Fun , T , EAcc , {SS , OriginalS }, ES , alignment (Alignment , EAlignment ), RequireSize )
51
+ end ;
42
52
expand (BitstrMeta , Fun , [H | T ], Acc , S , E , Alignment , RequireSize ) ->
43
53
Meta = extract_meta (H , BitstrMeta ),
44
54
{ELeft , {SS , OriginalS }, ES } = expand_expr (Meta , H , Fun , S , E ),
0 commit comments