1const builtin = @import("builtin");
2
3const undef_10_u8: [10]u8 = @splat(undefined);
4const ff_10_u8: [10]u8 = @splat(0xFF);
5
6test "comptime slice-sentinel in bounds (unterminated)" {
7 // array
8 comptime {
9 var target = [_]u8{ 'a', 'b', 'c', 'd' } ++ undef_10_u8;
10 const slice = target[0..3 :'d'];
11 _ = slice;
12 }
13
14 // ptr_array
15 comptime {
16 var buf = [_]u8{ 'a', 'b', 'c', 'd' } ++ undef_10_u8;
17 var target = &buf;
18 const slice = target[0..3 :'d'];
19 _ = slice;
20 }
21
22 // vector_ConstPtrSpecialBaseArray
23 comptime {
24 var buf = [_]u8{ 'a', 'b', 'c', 'd' } ++ undef_10_u8;
25 var target: [*]u8 = &buf;
26 const slice = target[0..3 :'d'];
27 _ = slice;
28 }
29
30 // vector_ConstPtrSpecialRef
31 comptime {
32 var buf = [_]u8{ 'a', 'b', 'c', 'd' } ++ undef_10_u8;
33 var target: [*]u8 = @as([*]u8, @ptrCast(&buf));
34 const slice = target[0..3 :'d'];
35 _ = slice;
36 }
37
38 // cvector_ConstPtrSpecialBaseArray
39 comptime {
40 var buf = [_]u8{ 'a', 'b', 'c', 'd' } ++ undef_10_u8;
41 var target: [*c]u8 = &buf;
42 const slice = target[0..3 :'d'];
43 _ = slice;
44 }
45
46 // cvector_ConstPtrSpecialRef
47 comptime {
48 var buf = [_]u8{ 'a', 'b', 'c', 'd' } ++ undef_10_u8;
49 var target: [*c]u8 = @as([*c]u8, @ptrCast(&buf));
50 const slice = target[0..3 :'d'];
51 _ = slice;
52 }
53
54 // slice
55 comptime {
56 var buf = [_]u8{ 'a', 'b', 'c', 'd' } ++ undef_10_u8;
57 var target: []u8 = &buf;
58 const slice = target[0..3 :'d'];
59 _ = slice;
60 }
61}
62
63test "comptime slice-sentinel in bounds (end,unterminated)" {
64 // array
65 comptime {
66 var target = [_]u8{ 'a', 'b', 'c', 'd' } ++ ff_10_u8;
67 const slice = target[0..13 :0xff];
68 _ = slice;
69 }
70
71 // ptr_array
72 comptime {
73 var buf = [_]u8{ 'a', 'b', 'c', 'd' } ++ ff_10_u8;
74 var target = &buf;
75 const slice = target[0..13 :0xff];
76 _ = slice;
77 }
78
79 // vector_ConstPtrSpecialBaseArray
80 comptime {
81 var buf = [_]u8{ 'a', 'b', 'c', 'd' } ++ ff_10_u8;
82 var target: [*]u8 = &buf;
83 const slice = target[0..13 :0xff];
84 _ = slice;
85 }
86
87 // vector_ConstPtrSpecialRef
88 comptime {
89 var buf = [_]u8{ 'a', 'b', 'c', 'd' } ++ ff_10_u8;
90 var target: [*]u8 = @as([*]u8, @ptrCast(&buf));
91 const slice = target[0..13 :0xff];
92 _ = slice;
93 }
94
95 // cvector_ConstPtrSpecialBaseArray
96 comptime {
97 var buf = [_]u8{ 'a', 'b', 'c', 'd' } ++ ff_10_u8;
98 var target: [*c]u8 = &buf;
99 const slice = target[0..13 :0xff];
100 _ = slice;
101 }
102
103 // cvector_ConstPtrSpecialRef
104 comptime {
105 var buf = [_]u8{ 'a', 'b', 'c', 'd' } ++ ff_10_u8;
106 var target: [*c]u8 = @as([*c]u8, @ptrCast(&buf));
107 const slice = target[0..13 :0xff];
108 _ = slice;
109 }
110
111 // slice
112 comptime {
113 var buf = [_]u8{ 'a', 'b', 'c', 'd' } ++ ff_10_u8;
114 var target: []u8 = &buf;
115 const slice = target[0..13 :0xff];
116 _ = slice;
117 }
118}
119
120test "comptime slice-sentinel in bounds (terminated)" {
121 // array
122 comptime {
123 var target = [_:0]u8{ 'a', 'b', 'c', 'd' } ++ undef_10_u8;
124 const slice = target[0..3 :'d'];
125 _ = slice;
126 }
127
128 // ptr_array
129 comptime {
130 var buf = [_:0]u8{ 'a', 'b', 'c', 'd' } ++ undef_10_u8;
131 var target = &buf;
132 const slice = target[0..3 :'d'];
133 _ = slice;
134 }
135
136 // vector_ConstPtrSpecialBaseArray
137 comptime {
138 var buf = [_:0]u8{ 'a', 'b', 'c', 'd' } ++ undef_10_u8;
139 var target: [*]u8 = &buf;
140 const slice = target[0..3 :'d'];
141 _ = slice;
142 }
143
144 // vector_ConstPtrSpecialRef
145 comptime {
146 var buf = [_:0]u8{ 'a', 'b', 'c', 'd' } ++ undef_10_u8;
147 var target: [*]u8 = @as([*]u8, @ptrCast(&buf));
148 const slice = target[0..3 :'d'];
149 _ = slice;
150 }
151
152 // cvector_ConstPtrSpecialBaseArray
153 comptime {
154 var buf = [_:0]u8{ 'a', 'b', 'c', 'd' } ++ undef_10_u8;
155 var target: [*c]u8 = &buf;
156 const slice = target[0..3 :'d'];
157 _ = slice;
158 }
159
160 // cvector_ConstPtrSpecialRef
161 comptime {
162 var buf = [_:0]u8{ 'a', 'b', 'c', 'd' } ++ undef_10_u8;
163 var target: [*c]u8 = @as([*c]u8, @ptrCast(&buf));
164 const slice = target[0..3 :'d'];
165 _ = slice;
166 }
167
168 // slice
169 comptime {
170 var buf = [_:0]u8{ 'a', 'b', 'c', 'd' } ++ undef_10_u8;
171 var target: []u8 = &buf;
172 const slice = target[0..3 :'d'];
173 _ = slice;
174 }
175}
176
177test "comptime slice-sentinel in bounds (on target sentinel)" {
178 // array
179 comptime {
180 var target = [_:0]u8{ 'a', 'b', 'c', 'd' } ++ undef_10_u8;
181 const slice = target[0..14 :0];
182 _ = slice;
183 }
184
185 // ptr_array
186 comptime {
187 var buf = [_:0]u8{ 'a', 'b', 'c', 'd' } ++ undef_10_u8;
188 var target = &buf;
189 const slice = target[0..14 :0];
190 _ = slice;
191 }
192
193 // vector_ConstPtrSpecialBaseArray
194 comptime {
195 var buf = [_:0]u8{ 'a', 'b', 'c', 'd' } ++ undef_10_u8;
196 var target: [*]u8 = &buf;
197 const slice = target[0..14 :0];
198 _ = slice;
199 }
200
201 // vector_ConstPtrSpecialRef
202 comptime {
203 var buf = [_:0]u8{ 'a', 'b', 'c', 'd' } ++ undef_10_u8;
204 var target: [*]u8 = @as([*]u8, @ptrCast(&buf));
205 const slice = target[0..14 :0];
206 _ = slice;
207 }
208
209 // cvector_ConstPtrSpecialBaseArray
210 comptime {
211 var buf = [_:0]u8{ 'a', 'b', 'c', 'd' } ++ undef_10_u8;
212 var target: [*c]u8 = &buf;
213 const slice = target[0..14 :0];
214 _ = slice;
215 }
216
217 // cvector_ConstPtrSpecialRef
218 comptime {
219 var buf = [_:0]u8{ 'a', 'b', 'c', 'd' } ++ undef_10_u8;
220 var target: [*c]u8 = @as([*c]u8, @ptrCast(&buf));
221 const slice = target[0..14 :0];
222 _ = slice;
223 }
224
225 // slice
226 comptime {
227 var buf = [_:0]u8{ 'a', 'b', 'c', 'd' } ++ undef_10_u8;
228 var target: []u8 = &buf;
229 const slice = target[0..14 :0];
230 _ = slice;
231 }
232}