summaryrefslogtreecommitdiff
path: root/erts/emulator/test/bs_match_int_SUITE.erl
diff options
context:
space:
mode:
Diffstat (limited to 'erts/emulator/test/bs_match_int_SUITE.erl')
-rw-r--r--erts/emulator/test/bs_match_int_SUITE.erl729
1 files changed, 671 insertions, 58 deletions
diff --git a/erts/emulator/test/bs_match_int_SUITE.erl b/erts/emulator/test/bs_match_int_SUITE.erl
index 08b0a72785..5d7d5f97f0 100644
--- a/erts/emulator/test/bs_match_int_SUITE.erl
+++ b/erts/emulator/test/bs_match_int_SUITE.erl
@@ -19,10 +19,10 @@
-module(bs_match_int_SUITE).
--export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
init_per_group/2,end_per_group/2,
- integer/1,signed_integer/1,dynamic/1,more_dynamic/1,mml/1,
- match_huge_int/1,bignum/1,unaligned_32_bit/1]).
+ integer/1,mixed_sizes/1,signed_integer/1,dynamic/1,more_dynamic/1,
+ mml/1,match_huge_int/1,bignum/1,unaligned_32_bit/1,unit/1]).
-include_lib("common_test/include/ct.hrl").
@@ -30,11 +30,11 @@
suite() -> [{ct_hooks,[ts_install_cth]}].
-all() ->
- [integer, signed_integer, dynamic, more_dynamic, mml,
- match_huge_int, bignum, unaligned_32_bit].
+all() ->
+ [integer, mixed_sizes, signed_integer, dynamic, more_dynamic, mml,
+ match_huge_int, bignum, unaligned_32_bit, unit].
-groups() ->
+groups() ->
[].
init_per_suite(Config) ->
@@ -51,6 +51,9 @@ end_per_group(_GroupName, Config) ->
integer(Config) when is_list(Config) ->
+ _ = rand:uniform(), %Seed generator
+ io:format("Seed: ~p", [rand:export_seed()]),
+
0 = get_int(mkbin([])),
0 = get_int(mkbin([0])),
42 = get_int(mkbin([42])),
@@ -58,36 +61,628 @@ integer(Config) when is_list(Config) ->
256 = get_int(mkbin([1,0])),
257 = get_int(mkbin([1,1])),
258 = get_int(mkbin([1,2])),
- 258 = get_int(mkbin([1,2])),
65534 = get_int(mkbin([255,254])),
16776455 = get_int(mkbin([255,253,7])),
4245492555 = get_int(mkbin([253,13,19,75])),
4294967294 = get_int(mkbin([255,255,255,254])),
4294967295 = get_int(mkbin([255,255,255,255])),
+
+ 16#cafebeef = get_int(<<16#cafebeef:32>>),
+ 16#cafebeef42 = get_int(<<16#cafebeef42:40>>),
+ 16#cafebeeffeed = get_int(<<16#cafebeeffeed:48>>),
+ 16#cafebeeffeed42 = get_int(<<16#cafebeeffeed42:56>>),
+ 16#1cafebeeffeed42 = get_int(<<16#1cafebeeffeed42:57>>),
+ 16#2cafebeeffeed42 = get_int(<<16#2cafebeeffeed42:58>>),
+ 16#7cafebeeffeed42 = get_int(<<16#7cafebeeffeed42:59>>),
+
+ 16#beefcafefeed = get_int(<<16#beefcafefeed:60>>),
+ 16#beefcafefeed = get_int(<<16#beefcafefeed:61>>),
+ 16#beefcafefeed = get_int(<<16#beefcafefeed:62>>),
+ 16#beefcafefeed = get_int(<<16#beefcafefeed:63>>),
+
+ 16#cafebeeffeed42 = get_int(<<16#cafebeeffeed42:60>>),
+ 16#cafebeeffeed42 = get_int(<<16#cafebeeffeed42:61>>),
+ 16#cafebeeffeed42 = get_int(<<16#cafebeeffeed42:62>>),
+ 16#cafebeeffeed42 = get_int(<<16#cafebeeffeed42:63>>),
+
+ 16#acafebeeffeed42 = get_int(<<16#acafebeeffeed42:60>>),
+ 16#acafebeeffeed42 = get_int(<<16#acafebeeffeed42:61>>),
+ 16#acafebeeffeed42 = get_int(<<16#acafebeeffeed42:62>>),
+ 16#acafebeeffeed42 = get_int(<<16#acafebeeffeed42:63>>),
+
+ 16#cafebeeffeed = get_int(<<16#cafebeeffeed:64>>),
+ 16#cafebeeffeedface = get_int(<<16#cafebeeffeedface:64>>),
+
+ get_int_roundtrip(rand:bytes(12), 0),
+ get_int_roundtrip(rand:bytes(12), 0),
+
Eight = [200,1,19,128,222,42,97,111],
cmp128(Eight, uint(Eight)),
- fun_clause(catch get_int(mkbin(seq(1,5)))),
+ fun_clause(catch get_int(mkbin(seq(1, 20)))),
ok.
-get_int(Bin) ->
- I = get_int1(Bin),
- get_int(Bin, I).
+get_int_roundtrip(Bin0, Size) when Size =< 8*byte_size(Bin0) ->
+ <<Bin:Size/bits,_/bits>> = Bin0,
+ <<I:Size>> = Bin,
+ I = get_int(Bin),
+ get_int_roundtrip(Bin0, Size+1);
+get_int_roundtrip(_, _) -> ok.
+
+get_int(Bin0) ->
+ %% Note that it has become impossible to create a byte-sized sub
+ %% binary (see erts_extract_sub_binary() in erl_bits.c) of size 64
+ %% or less. Therefore, to be able to create an unaligned binary,
+ %% we'll need to base it on on a binary with more than 64 bytes.
+ Size = bit_size(Bin0),
+ Filler = rand:bytes(65),
+ UnsignedBigBin = id(<<Filler/binary,Bin0/bits>>),
+ I = get_unsigned_big(UnsignedBigBin),
+
+ %% io:format("~p ~p\n", [Size,I]),
+ if
+ Size =< 10*8 ->
+ OversizedUnsignedBig = id(<<Filler/binary,0:16,Bin0/bits>>),
+ I = get_unsigned_big(OversizedUnsignedBig);
+ true ->
+ ok
+ end,
+
+ test_unaligned(UnsignedBigBin, I, fun get_unsigned_big/1),
+
+ %% Test unsigned little-endian integers.
+
+ UnsignedLittleBin = id(<<Filler/binary,I:Size/little>>),
+ I = get_unsigned_little(UnsignedLittleBin),
+
+ test_unaligned(UnsignedLittleBin, I, fun get_unsigned_little/1),
+
+ %% Test signed big-endian integers.
+
+ SignedBigBin1 = id(<<Filler/binary,(-I):(Size+1)/big>>),
+ I = -get_signed_big(SignedBigBin1),
+
+ SignedBigBin2 = id(<<Filler/binary,I:(Size+1)/big>>),
+ I = get_signed_big(SignedBigBin2),
+
+ %% test_unaligned(SignedBigBin1, -I, fun get_signed_big/1),
+ test_unaligned(SignedBigBin2, I, fun get_signed_big/1),
+
+ %% Test signed little-endian integers.
+
+ SignedLittleBin1 = id(<<Filler/binary,(-I):(Size+1)/little>>),
+ I = -get_signed_little(SignedLittleBin1),
+
+ SignedLittleBin2 = id(<<Filler/binary,I:(Size+1)/little>>),
+ I = get_signed_little(SignedLittleBin2),
-get_int(Bin0, I) when size(Bin0) < 4 ->
- Bin = <<0,Bin0/binary>>,
- I = get_int1(Bin),
- get_int(Bin, I);
-get_int(_, I) -> I.
+ test_unaligned(SignedLittleBin1, -I, fun get_signed_little/1),
+ test_unaligned(SignedLittleBin2, I, fun get_signed_little/1),
-get_int1(<<I:0>>) -> I;
-get_int1(<<I:8>>) -> I;
-get_int1(<<I:16>>) -> I;
-get_int1(<<I:24>>) -> I;
-get_int1(<<I:32>>) -> I.
+ I.
+
+test_unaligned(Bin, I, Matcher) ->
+ <<RandBytes1:8/binary,RandBytes2:8/binary>> = rand:bytes(16),
+ Size = bit_size(Bin),
+ _ = [begin
+ <<_:(Offset+32),UnalignedBin:Size/bits,_/bits>> =
+ id(<<RandBytes1:(Offset+32)/bits,
+ Bin:Size/bits,
+ RandBytes2/binary>>),
+ I = Matcher(UnalignedBin)
+ end || Offset <- [1,2,3,4,5,6,7]],
+ ok.
+
+
+
+get_unsigned_big(Bin) ->
+ Res = get_unsigned_big_plain(Bin),
+ [A,B,C,D,E] = id([1,2,3,4,5]),
+ {Res,_} = get_unsigned_big_memory_ctx(A, B, C, D, E, Res, Bin),
+ Res.
+
+get_unsigned_big_memory_ctx(A, B, C, D, E, Res0, Bin) ->
+ %% The match context will be in {x,6}, which is not
+ %% a X register backed by a CPU register on any platform.
+ Res = case Bin of
+ <<_:65/unit:8,I:7>> -> I;
+ <<_:65/unit:8,I:8>> -> I;
+ <<_:65/unit:8,I:36>> -> I;
+ <<_:65/unit:8,I:59>> -> I;
+ <<_:65/unit:8,I:60>> -> I;
+ <<_:65/unit:8,I:61>> -> I;
+ <<_:65/unit:8,I:62>> -> I;
+ <<_:65/unit:8,I:63>> -> I;
+ <<_:65/unit:8,I:64>> -> I;
+ <<_:65/unit:8,I:65>> -> I;
+ <<_:65/unit:8,I:70>> -> I;
+ <<_:65/unit:8,I:80>> -> I;
+ <<_:65/unit:8,I:95>> -> I;
+ _ -> Res0
+ end,
+ {Res,{A,B,C,D,E}}.
+
+get_unsigned_big_plain(<<_:65/unit:8,I:0>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:1>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:2>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:3>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:4>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:5>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:6>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:7>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:8>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:9>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:10>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:11>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:12>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:13>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:14>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:15>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:16>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:17>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:18>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:19>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:20>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:21>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:22>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:23>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:24>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:25>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:26>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:27>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:28>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:29>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:30>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:31>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:32>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:33>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:34>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:35>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:36>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:37>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:38>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:39>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:40>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:41>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:42>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:43>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:44>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:45>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:46>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:47>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:48>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:49>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:50>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:51>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:52>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:53>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:54>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:55>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:56>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:57>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:58>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:59>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:60>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:61>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:62>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:63>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:64>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:65>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:66>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:67>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:68>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:69>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:70>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:71>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:72>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:73>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:74>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:75>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:76>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:77>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:78>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:79>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:80>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:81>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:82>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:83>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:84>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:85>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:86>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:87>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:88>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:89>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:90>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:91>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:92>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:93>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:94>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:95>>) -> I;
+get_unsigned_big_plain(<<_:65/unit:8,I:96>>) -> I.
+
+get_unsigned_little(<<_:65/unit:8,I:0/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:1/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:2/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:3/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:4/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:5/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:6/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:7/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:8/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:9/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:10/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:11/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:12/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:13/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:14/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:15/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:16/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:17/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:18/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:19/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:20/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:21/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:22/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:23/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:24/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:25/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:26/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:27/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:28/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:29/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:30/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:31/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:32/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:33/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:34/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:35/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:36/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:37/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:38/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:39/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:40/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:41/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:42/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:43/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:44/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:45/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:46/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:47/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:48/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:49/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:50/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:51/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:52/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:53/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:54/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:55/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:56/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:57/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:58/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:59/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:60/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:61/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:62/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:63/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:64/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:65/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:66/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:67/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:68/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:69/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:70/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:71/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:72/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:73/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:74/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:75/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:76/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:77/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:78/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:79/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:80/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:81/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:82/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:83/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:84/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:85/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:86/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:87/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:88/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:89/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:90/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:91/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:92/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:93/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:94/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:95/little>>) -> I;
+get_unsigned_little(<<_:65/unit:8,I:96/little>>) -> I.
+
+get_signed_big(<<_:65/unit:8,I:0/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:1/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:2/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:3/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:4/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:5/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:6/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:7/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:8/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:9/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:10/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:11/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:12/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:13/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:14/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:15/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:16/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:17/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:18/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:19/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:20/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:21/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:22/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:23/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:24/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:25/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:26/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:27/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:28/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:29/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:30/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:31/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:32/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:33/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:34/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:35/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:36/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:37/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:38/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:39/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:40/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:41/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:42/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:43/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:44/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:45/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:46/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:47/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:48/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:49/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:50/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:51/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:52/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:53/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:54/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:55/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:56/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:57/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:58/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:59/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:60/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:61/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:62/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:63/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:64/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:65/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:66/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:67/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:68/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:69/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:70/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:71/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:72/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:73/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:74/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:75/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:76/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:77/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:78/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:79/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:80/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:81/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:82/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:83/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:84/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:85/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:86/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:87/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:88/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:89/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:90/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:91/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:92/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:93/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:94/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:95/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:96/signed-big>>) -> I;
+get_signed_big(<<_:65/unit:8,I:97/signed-big>>) -> I.
+
+get_signed_little(<<_:65/unit:8,I:0/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:1/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:2/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:3/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:4/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:5/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:6/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:7/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:8/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:9/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:10/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:11/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:12/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:13/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:14/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:15/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:16/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:17/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:18/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:19/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:20/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:21/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:22/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:23/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:24/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:25/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:26/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:27/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:28/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:29/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:30/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:31/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:32/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:33/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:34/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:35/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:36/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:37/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:38/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:39/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:40/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:41/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:42/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:43/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:44/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:45/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:46/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:47/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:48/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:49/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:50/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:51/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:52/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:53/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:54/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:55/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:56/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:57/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:58/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:59/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:60/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:61/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:62/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:63/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:64/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:65/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:66/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:67/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:68/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:69/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:70/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:71/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:72/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:73/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:74/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:75/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:76/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:77/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:78/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:79/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:80/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:81/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:82/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:83/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:84/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:85/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:86/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:87/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:88/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:89/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:90/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:91/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:92/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:93/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:94/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:95/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:96/signed-little>>) -> I;
+get_signed_little(<<_:65/unit:8,I:97/signed-little>>) -> I.
cmp128(<<I:128>>, I) -> equal;
cmp128(_, _) -> not_equal.
-
+
+mixed_sizes(_Config) ->
+ mixed({345,42},
+ fun({A,B}) ->
+ <<A:9,1:1,B:6>>;
+ (<<A:9,_:1,B:6>>) ->
+ {A,B}
+ end),
+
+ mixed({27033,59991,16#c001cafe,12345,2},
+ fun({A,B,C,D,E}) ->
+ <<A:16,B:16,C:32,D:22,E:2>>;
+ (<<A:16,B:16,C:32,D:22,E:2>>) ->
+ {A,B,C,D,E}
+ end),
+
+ mixed({79,153,17555,50_000,777_000,36#hugebignumber,2222},
+ fun({A,B,C,D,E,F,G}) ->
+ <<A:7,B:8,C:15,0:3,D:17,E:23,F:88,G:13>>;
+ (<<A:7,B:8,C:15,_:3,D:17,E:23,F:88,G:13>>) ->
+ {A,B,C,D,E,F,G}
+ end),
+
+ mixed({16#123456789ABCDEF,13,36#hugenum,979},
+ fun({A,B,C,D}) ->
+ <<A:60,B:4,C:50,D:10>>;
+ (<<A:60,B:4,C:50,D:10>>) ->
+ {A,B,C,D}
+ end),
+
+ mixed({16#123456789ABCDEF,13,36#hugenum,979},
+ fun({A,B,C,D}) ->
+ <<A:60/little,B:4/little,C:50/little,D:10/little>>;
+ (<<A:60/little,B:4/little,C:50/little,D:10/little>>) ->
+ {A,B,C,D}
+ end),
+
+ mixed({15692284513449131826, 17798, 33798},
+ fun({A,B,C}) ->
+ <<A:64,B:15/little,C:16/little>>;
+ (<<A:64,B:15/little,C:16/little>>) ->
+ {A,B,C}
+ end),
+
+ mixed({15692344284519131826, 1779863, 13556268},
+ fun({A,B,C}) ->
+ <<A:64,B:23/little,C:24/little>>;
+ (<<A:64,B:23/little,C:24/little>>) ->
+ {A,B,C}
+ end),
+
+ mixed({15519169234428431825, 194086885, 2813274043},
+ fun({A,B,C}) ->
+ <<A:64,B:29/little,C:32/little>>;
+ (<<A:64,B:29/little,C:32/little>>) ->
+ {A,B,C}
+ end),
+
+ mixed({5,9,38759385,93},
+ fun({A,B,C,D}) ->
+ <<1:3,A:4,B:5,C:47,D:7>>;
+ (<<1:3,A:4,B:5,C:47,D:7>>) ->
+ {A,B,C,D}
+ end),
+
+ mixed({2022,8,22},
+ fun({A,B,C}) ->
+ <<A:16/little,B,C>>;
+ (<<A:16/little,B,C>>) ->
+ {A,B,C}
+ end),
+
+ mixed({2022,8,22},
+ fun({A,B,C}) ->
+ <<A:16/little,B,C>>;
+ (<<A:16/little,B,C>>) ->
+ _ = id(0),
+ {A,B,C}
+ end),
+ ok.
+
+mixed(Data, F) ->
+ Bin = F(Data),
+ Data = F(Bin),
+ true = is_bitstring(Bin).
+
signed_integer(Config) when is_list(Config) ->
{no_match,_} = sint(mkbin([])),
{no_match,_} = sint(mkbin([1,2,3])),
@@ -133,7 +728,7 @@ dynamic(Bin, S1, S2, A, B) ->
%% Extract integers at different alignments and of different sizes.
more_dynamic(Config) when is_list(Config) ->
- % Unsigned big-endian numbers.
+ %% Unsigned big-endian numbers.
Unsigned = fun(Bin, List, SkipBef, N) ->
SkipAft = 8*size(Bin) - N - SkipBef,
<<_:SkipBef,Int:N,_:SkipAft>> = Bin,
@@ -249,41 +844,46 @@ match_huge_int(Config) when is_list(Config) ->
%% because of insufficient memory.
{skip, "unoptimized code would use too much memory"};
bs_match_int_SUITE ->
- Sz = 1 bsl 27,
- Bin = <<0:Sz,13:8>>,
- skip_huge_int_1(Sz, Bin),
- 0 = match_huge_int_1(Sz, Bin),
-
- %% Test overflowing the size of an integer field.
- nomatch = overflow_huge_int_skip_32(Bin),
- case erlang:system_info(wordsize) of
- 4 ->
- nomatch = overflow_huge_int_32(Bin);
- 8 ->
- %% An attempt will be made to allocate heap space for
- %% the bignum (which will probably fail); only if the
- %% allocation succeeds will the matching fail because
- %% the binary is too small.
- ok
- end,
- nomatch = overflow_huge_int_skip_64(Bin),
- nomatch = overflow_huge_int_64(Bin),
-
- %% Test overflowing the size of an integer field using
- %% variables as sizes.
- Sizes = case erlang:system_info(wordsize) of
- 4 -> lists:seq(25, 32);
- 8 -> []
- end ++ lists:seq(50, 64),
- ok = overflow_huge_int_unit128(Bin, Sizes),
-
- %% GH-6701: [vm] crash with -emu_flavor emu:
- %% "no next heap size found: 18446744072702918678, offset 0"
- {'EXIT',{function_clause,_}} =
- (catch fun(<<X:2147483647/unit:98>>) -> X end(<<>>)),
- ok
+ do_match_huge_int();
+ bs_match_int_r25_SUITE ->
+ do_match_huge_int()
end.
+do_match_huge_int() ->
+ Sz = 1 bsl 27,
+ Bin = <<0:Sz,13:8>>,
+ skip_huge_int_1(Sz, Bin),
+ 0 = match_huge_int_1(Sz, Bin),
+
+ %% Test overflowing the size of an integer field.
+ nomatch = overflow_huge_int_skip_32(Bin),
+ case erlang:system_info(wordsize) of
+ 4 ->
+ nomatch = overflow_huge_int_32(Bin);
+ 8 ->
+ %% An attempt will be made to allocate heap space for
+ %% the bignum (which will probably fail); only if the
+ %% allocation succeeds will the matching fail because
+ %% the binary is too small.
+ ok
+ end,
+ nomatch = overflow_huge_int_skip_64(Bin),
+ nomatch = overflow_huge_int_64(Bin),
+
+ %% Test overflowing the size of an integer field using
+ %% variables as sizes.
+ Sizes = case erlang:system_info(wordsize) of
+ 4 -> lists:seq(25, 32);
+ 8 -> []
+ end ++ lists:seq(50, 64),
+ ok = overflow_huge_int_unit128(Bin, Sizes),
+
+ %% GH-6701: [vm] crash with -emu_flavor emu:
+ %% "no next heap size found: 18446744072702918678, offset 0"
+ {'EXIT',{function_clause,_}} =
+ (catch fun(<<X:2147483647/unit:98>>) -> X end(<<>>)),
+ ok.
+
overflow_huge_int_unit128(Bin, [Sz0|Sizes]) ->
Sz = id(1 bsl Sz0),
case Bin of
@@ -381,5 +981,18 @@ unaligned_32_bit_1(_) ->
unaligned_32_bit_verify([], 0) -> ok;
unaligned_32_bit_verify([4294967295|T], N) when N > 0 ->
unaligned_32_bit_verify(T, N-1).
-
+
+unit(_Config) ->
+ %% GH-6732. Would fail to match with no_ssa_opt or r25.
+ <<V1:5/integer-unit:8>> = id(<<16#cafebeef:5/integer-unit:8>>),
+ 16#cafebeef = id(V1),
+ <<V2:8/integer-unit:5>> = id(<<16#cafebeef:8/integer-unit:5>>),
+ 16#cafebeef = id(V2),
+
+ ok.
+
+%%%
+%%% Common utilities.
+%%%
+
id(I) -> I.