3 // This file tests repr(no_niche), which causes an struct/enum to hide
4 // any niche space that may exist in its internal state from the
5 // context it appears in.
7 // Here are the axes this test is seeking to cover:
10 // visible: (); cloaked: (no_niche); transparent: (transparent); shadowy: (transparent, no_niche)
14 // niche-type via type-parameter vs inline declaration
16 #![feature(decl_macro)]
19 use std
::mem
::size_of
;
20 use std
::num
::{NonZeroU8, NonZeroU16}
;
23 use std
::num
::NonZeroU16
as N16
;
25 #[derive(Debug)] pub struct Visible(N16);
28 #[derive(Debug)] pub struct Cloaked(N16);
31 #[derive(Debug)] pub struct Transparent(N16);
33 #[repr(transparent, no_niche)]
34 #[derive(Debug)] pub struct Shadowy(N16);
38 #[derive(Debug)] pub struct Visible<T>(T);
41 #[derive(Debug)] pub struct Cloaked<T>(T);
44 #[derive(Debug)] pub struct Transparent<T>(T);
46 #[repr(transparent, no_niche)]
47 #[derive(Debug)] pub struct Shadowy<T>(T);
51 use crate::two_fifty_six_variant_enum
;
52 use std
::num
::{NonZeroU8 as N8, NonZeroU16 as N16}
;
54 #[derive(Debug)] pub enum Visible1 { _A(N16), }
57 #[derive(Debug)] pub enum Cloaked1 { _A(N16), }
59 // (N.B.: transparent enums must be univariant)
61 #[derive(Debug)] pub enum Transparent { _A(N16), }
63 #[repr(transparent, no_niche)]
64 #[derive(Debug)] pub enum Shadowy { _A(N16), }
66 // including multivariant enums for completeness. Payload and
67 // number of variants (i.e. discriminant size) have been chosen so
68 // that layout including discriminant is 4 bytes, with no space in
69 // padding to hide another discrimnant from the surrounding
72 // (Note that multivariant enums cannot usefully expose a niche in
73 // general; this test is relying on that.)
74 two_fifty_six_variant_enum
!(Visible2
, N8
);
77 two_fifty_six_variant_enum
!(Cloaked2
, N8
);
81 use super::two_fifty_six_variant_enum
;
83 #[derive(Debug)] pub enum Visible1<T> { _A(T), }
86 #[derive(Debug)] pub enum Cloaked1<T> { _A(T), }
88 // (N.B.: transparent enums must be univariant)
90 #[derive(Debug)] pub enum Transparent<T> { _A(T), }
92 #[repr(transparent, no_niche)]
93 #[derive(Debug)] pub enum Shadowy<T> { _A(T), }
95 // including multivariant enums for completeness. Same notes apply
96 // here as above (assuming `T` is instantiated with `NonZeroU8`).
97 two_fifty_six_variant_enum
!(Visible2
<T
>);
100 two_fifty_six_variant_enum
!(Cloaked2
<T
>);
105 assert_eq
!(size_of
::<struct_inline
::Visible
>(), 2);
106 assert_eq
!(size_of
::<struct_inline
::Cloaked
>(), 2);
107 assert_eq
!(size_of
::<struct_inline
::Transparent
>(), 2);
108 assert_eq
!(size_of
::<struct_inline
::Shadowy
>(), 2);
110 assert_eq
!(size_of
::<struct_param
::Visible
<NonZeroU16
>>(), 2);
111 assert_eq
!(size_of
::<struct_param
::Cloaked
<NonZeroU16
>>(), 2);
112 assert_eq
!(size_of
::<struct_param
::Transparent
<NonZeroU16
>>(), 2);
113 assert_eq
!(size_of
::<struct_param
::Shadowy
<NonZeroU16
>>(), 2);
115 assert_eq
!(size_of
::<enum_inline
::Visible1
>(), 2);
116 assert_eq
!(size_of
::<enum_inline
::Cloaked1
>(), 2);
117 assert_eq
!(size_of
::<enum_inline
::Transparent
>(), 2); // transparent enums are univariant
118 assert_eq
!(size_of
::<enum_inline
::Shadowy
>(), 2);
119 assert_eq
!(size_of
::<enum_inline
::Visible2
>(), 4);
120 assert_eq
!(size_of
::<enum_inline
::Cloaked2
>(), 4);
122 assert_eq
!(size_of
::<enum_param
::Visible1
<NonZeroU16
>>(), 2);
123 assert_eq
!(size_of
::<enum_param
::Cloaked1
<NonZeroU16
>>(), 2);
124 assert_eq
!(size_of
::<enum_param
::Transparent
<NonZeroU16
>>(), 2);
125 assert_eq
!(size_of
::<enum_param
::Shadowy
<NonZeroU16
>>(), 2);
126 assert_eq
!(size_of
::<enum_param
::Visible2
<NonZeroU8
>>(), 4);
127 assert_eq
!(size_of
::<enum_param
::Cloaked2
<NonZeroU8
>>(), 4);
129 // now the actual tests of no_niche: how do inputs above compose
130 // with `Option` type constructor. The cases with a `_+2` are the
131 // ones where no_niche fires.
132 assert_eq
!(size_of
::<Option
<struct_inline
::Visible
>>(), 2);
133 assert_eq
!(size_of
::<Option
<struct_inline
::Cloaked
>>(), 2+2);
134 assert_eq
!(size_of
::<Option
<struct_inline
::Transparent
>>(), 2);
135 assert_eq
!(size_of
::<Option
<struct_inline
::Shadowy
>>(), 2+2);
137 assert_eq
!(size_of
::<Option
<struct_param
::Visible
<NonZeroU16
>>>(), 2);
138 assert_eq
!(size_of
::<Option
<struct_param
::Cloaked
<NonZeroU16
>>>(), 2+2);
139 assert_eq
!(size_of
::<Option
<struct_param
::Transparent
<NonZeroU16
>>>(), 2);
140 assert_eq
!(size_of
::<Option
<struct_param
::Shadowy
<NonZeroU16
>>>(), 2+2);
142 assert_eq
!(size_of
::<Option
<enum_inline
::Visible1
>>(), 2);
143 assert_eq
!(size_of
::<Option
<enum_inline
::Cloaked1
>>(), 2+2);
144 assert_eq
!(size_of
::<Option
<enum_inline
::Transparent
>>(), 2);
145 assert_eq
!(size_of
::<Option
<enum_inline
::Shadowy
>>(), 2+2);
146 // cannot use niche of multivariant payload
147 assert_eq
!(size_of
::<Option
<enum_inline
::Visible2
>>(), 4+2);
148 assert_eq
!(size_of
::<Option
<enum_inline
::Cloaked2
>>(), 4+2);
150 assert_eq
!(size_of
::<Option
<enum_param
::Visible1
<NonZeroU16
>>>(), 2);
151 assert_eq
!(size_of
::<Option
<enum_param
::Cloaked1
<NonZeroU16
>>>(), 2+2);
152 assert_eq
!(size_of
::<Option
<enum_param
::Transparent
<NonZeroU16
>>>(), 2);
153 assert_eq
!(size_of
::<Option
<enum_param
::Shadowy
<NonZeroU16
>>>(), 2+2);
154 // cannot use niche of multivariant payload
155 assert_eq
!(size_of
::<Option
<enum_param
::Visible2
<NonZeroU8
>>>(), 4+2);
156 assert_eq
!(size_of
::<Option
<enum_param
::Cloaked2
<NonZeroU8
>>>(), 4+2);
159 macro two_fifty_six_variant_enum
{
160 ($name
:ident
<$param
:ident
>) => {
162 pub enum $name
<$param
> {
163 _V00($param
, u16), _V01(u16, $param
), _V02($param
, u16), _V03(u16, $param
),
164 _V04($param
, u16), _V05(u16, $param
), _V06($param
, u16), _V07(u16, $param
),
165 _V08($param
, u16), _V09(u16, $param
), _V0a($param
, u16), _V0b(u16, $param
),
166 _V0c($param
, u16), _V0d(u16, $param
), _V0e($param
, u16), _V0f(u16, $param
),
168 _V10($param
, u16), _V11(u16, $param
), _V12($param
, u16), _V13(u16, $param
),
169 _V14($param
, u16), _V15(u16, $param
), _V16($param
, u16), _V17(u16, $param
),
170 _V18($param
, u16), _V19(u16, $param
), _V1a($param
, u16), _V1b(u16, $param
),
171 _V1c($param
, u16), _V1d(u16, $param
), _V1e($param
, u16), _V1f(u16, $param
),
173 _V20($param
, u16), _V21(u16, $param
), _V22($param
, u16), _V23(u16, $param
),
174 _V24($param
, u16), _V25(u16, $param
), _V26($param
, u16), _V27(u16, $param
),
175 _V28($param
, u16), _V29(u16, $param
), _V2a($param
, u16), _V2b(u16, $param
),
176 _V2c($param
, u16), _V2d(u16, $param
), _V2e($param
, u16), _V2f(u16, $param
),
178 _V30($param
, u16), _V31(u16, $param
), _V32($param
, u16), _V33(u16, $param
),
179 _V34($param
, u16), _V35(u16, $param
), _V36($param
, u16), _V37(u16, $param
),
180 _V38($param
, u16), _V39(u16, $param
), _V3a($param
, u16), _V3b(u16, $param
),
181 _V3c($param
, u16), _V3d(u16, $param
), _V3e($param
, u16), _V3f(u16, $param
),
183 _V40($param
, u16), _V41(u16, $param
), _V42($param
, u16), _V43(u16, $param
),
184 _V44($param
, u16), _V45(u16, $param
), _V46($param
, u16), _V47(u16, $param
),
185 _V48($param
, u16), _V49(u16, $param
), _V4a($param
, u16), _V4b(u16, $param
),
186 _V4c($param
, u16), _V4d(u16, $param
), _V4e($param
, u16), _V4f(u16, $param
),
188 _V50($param
, u16), _V51(u16, $param
), _V52($param
, u16), _V53(u16, $param
),
189 _V54($param
, u16), _V55(u16, $param
), _V56($param
, u16), _V57(u16, $param
),
190 _V58($param
, u16), _V59(u16, $param
), _V5a($param
, u16), _V5b(u16, $param
),
191 _V5c($param
, u16), _V5d(u16, $param
), _V5e($param
, u16), _V5f(u16, $param
),
193 _V60($param
, u16), _V61(u16, $param
), _V62($param
, u16), _V63(u16, $param
),
194 _V64($param
, u16), _V65(u16, $param
), _V66($param
, u16), _V67(u16, $param
),
195 _V68($param
, u16), _V69(u16, $param
), _V6a($param
, u16), _V6b(u16, $param
),
196 _V6c($param
, u16), _V6d(u16, $param
), _V6e($param
, u16), _V6f(u16, $param
),
198 _V70($param
, u16), _V71(u16, $param
), _V72($param
, u16), _V73(u16, $param
),
199 _V74($param
, u16), _V75(u16, $param
), _V76($param
, u16), _V77(u16, $param
),
200 _V78($param
, u16), _V79(u16, $param
), _V7a($param
, u16), _V7b(u16, $param
),
201 _V7c($param
, u16), _V7d(u16, $param
), _V7e($param
, u16), _V7f(u16, $param
),
203 _V80($param
, u16), _V81(u16, $param
), _V82($param
, u16), _V83(u16, $param
),
204 _V84($param
, u16), _V85(u16, $param
), _V86($param
, u16), _V87(u16, $param
),
205 _V88($param
, u16), _V89(u16, $param
), _V8a($param
, u16), _V8b(u16, $param
),
206 _V8c($param
, u16), _V8d(u16, $param
), _V8e($param
, u16), _V8f(u16, $param
),
208 _V90($param
, u16), _V91(u16, $param
), _V92($param
, u16), _V93(u16, $param
),
209 _V94($param
, u16), _V95(u16, $param
), _V96($param
, u16), _V97(u16, $param
),
210 _V98($param
, u16), _V99(u16, $param
), _V9a($param
, u16), _V9b(u16, $param
),
211 _V9c($param
, u16), _V9d(u16, $param
), _V9e($param
, u16), _V9f(u16, $param
),
213 _Va0($param
, u16), _Va1(u16, $param
), _Va2($param
, u16), _Va3(u16, $param
),
214 _Va4($param
, u16), _Va5(u16, $param
), _Va6($param
, u16), _Va7(u16, $param
),
215 _Va8($param
, u16), _Va9(u16, $param
), _Vaa($param
, u16), _Vab(u16, $param
),
216 _Vac($param
, u16), _Vad(u16, $param
), _Vae($param
, u16), _Vaf(u16, $param
),
218 _Vb0($param
, u16), _Vb1(u16, $param
), _Vb2($param
, u16), _Vb3(u16, $param
),
219 _Vb4($param
, u16), _Vb5(u16, $param
), _Vb6($param
, u16), _Vb7(u16, $param
),
220 _Vb8($param
, u16), _Vb9(u16, $param
), _Vba($param
, u16), _Vbb(u16, $param
),
221 _Vbc($param
, u16), _Vbd(u16, $param
), _Vbe($param
, u16), _Vbf(u16, $param
),
223 _Vc0($param
, u16), _Vc1(u16, $param
), _Vc2($param
, u16), _Vc3(u16, $param
),
224 _Vc4($param
, u16), _Vc5(u16, $param
), _Vc6($param
, u16), _Vc7(u16, $param
),
225 _Vc8($param
, u16), _Vc9(u16, $param
), _Vca($param
, u16), _Vcb(u16, $param
),
226 _Vcc($param
, u16), _Vcd(u16, $param
), _Vce($param
, u16), _Vcf(u16, $param
),
228 _Vd0($param
, u16), _Vd1(u16, $param
), _Vd2($param
, u16), _Vd3(u16, $param
),
229 _Vd4($param
, u16), _Vd5(u16, $param
), _Vd6($param
, u16), _Vd7(u16, $param
),
230 _Vd8($param
, u16), _Vd9(u16, $param
), _Vda($param
, u16), _Vdb(u16, $param
),
231 _Vdc($param
, u16), _Vdd(u16, $param
), _Vde($param
, u16), _Vdf(u16, $param
),
233 _Ve0($param
, u16), _Ve1(u16, $param
), _Ve2($param
, u16), _Ve3(u16, $param
),
234 _Ve4($param
, u16), _Ve5(u16, $param
), _Ve6($param
, u16), _Ve7(u16, $param
),
235 _Ve8($param
, u16), _Ve9(u16, $param
), _Vea($param
, u16), _Veb(u16, $param
),
236 _Vec($param
, u16), _Ved(u16, $param
), _Vee($param
, u16), _Vef(u16, $param
),
238 _Vf0($param
, u16), _Vf1(u16, $param
), _Vf2($param
, u16), _Vf3(u16, $param
),
239 _Vf4($param
, u16), _Vf5(u16, $param
), _Vf6($param
, u16), _Vf7(u16, $param
),
240 _Vf8($param
, u16), _Vf9(u16, $param
), _Vfa($param
, u16), _Vfb(u16, $param
),
241 _Vfc($param
, u16), _Vfd(u16, $param
), _Vfe($param
, u16), _Vff(u16, $param
),
245 ($name
:ident
, $param
:ty
) => {
248 _V00($param
, u16), _V01(u16, $param
), _V02($param
, u16), _V03(u16, $param
),
249 _V04($param
, u16), _V05(u16, $param
), _V06($param
, u16), _V07(u16, $param
),
250 _V08($param
, u16), _V09(u16, $param
), _V0a($param
, u16), _V0b(u16, $param
),
251 _V0c($param
, u16), _V0d(u16, $param
), _V0e($param
, u16), _V0f(u16, $param
),
253 _V10($param
, u16), _V11(u16, $param
), _V12($param
, u16), _V13(u16, $param
),
254 _V14($param
, u16), _V15(u16, $param
), _V16($param
, u16), _V17(u16, $param
),
255 _V18($param
, u16), _V19(u16, $param
), _V1a($param
, u16), _V1b(u16, $param
),
256 _V1c($param
, u16), _V1d(u16, $param
), _V1e($param
, u16), _V1f(u16, $param
),
258 _V20($param
, u16), _V21(u16, $param
), _V22($param
, u16), _V23(u16, $param
),
259 _V24($param
, u16), _V25(u16, $param
), _V26($param
, u16), _V27(u16, $param
),
260 _V28($param
, u16), _V29(u16, $param
), _V2a($param
, u16), _V2b(u16, $param
),
261 _V2c($param
, u16), _V2d(u16, $param
), _V2e($param
, u16), _V2f(u16, $param
),
263 _V30($param
, u16), _V31(u16, $param
), _V32($param
, u16), _V33(u16, $param
),
264 _V34($param
, u16), _V35(u16, $param
), _V36($param
, u16), _V37(u16, $param
),
265 _V38($param
, u16), _V39(u16, $param
), _V3a($param
, u16), _V3b(u16, $param
),
266 _V3c($param
, u16), _V3d(u16, $param
), _V3e($param
, u16), _V3f(u16, $param
),
268 _V40($param
, u16), _V41(u16, $param
), _V42($param
, u16), _V43(u16, $param
),
269 _V44($param
, u16), _V45(u16, $param
), _V46($param
, u16), _V47(u16, $param
),
270 _V48($param
, u16), _V49(u16, $param
), _V4a($param
, u16), _V4b(u16, $param
),
271 _V4c($param
, u16), _V4d(u16, $param
), _V4e($param
, u16), _V4f(u16, $param
),
273 _V50($param
, u16), _V51(u16, $param
), _V52($param
, u16), _V53(u16, $param
),
274 _V54($param
, u16), _V55(u16, $param
), _V56($param
, u16), _V57(u16, $param
),
275 _V58($param
, u16), _V59(u16, $param
), _V5a($param
, u16), _V5b(u16, $param
),
276 _V5c($param
, u16), _V5d(u16, $param
), _V5e($param
, u16), _V5f(u16, $param
),
278 _V60($param
, u16), _V61(u16, $param
), _V62($param
, u16), _V63(u16, $param
),
279 _V64($param
, u16), _V65(u16, $param
), _V66($param
, u16), _V67(u16, $param
),
280 _V68($param
, u16), _V69(u16, $param
), _V6a($param
, u16), _V6b(u16, $param
),
281 _V6c($param
, u16), _V6d(u16, $param
), _V6e($param
, u16), _V6f(u16, $param
),
283 _V70($param
, u16), _V71(u16, $param
), _V72($param
, u16), _V73(u16, $param
),
284 _V74($param
, u16), _V75(u16, $param
), _V76($param
, u16), _V77(u16, $param
),
285 _V78($param
, u16), _V79(u16, $param
), _V7a($param
, u16), _V7b(u16, $param
),
286 _V7c($param
, u16), _V7d(u16, $param
), _V7e($param
, u16), _V7f(u16, $param
),
288 _V80($param
, u16), _V81(u16, $param
), _V82($param
, u16), _V83(u16, $param
),
289 _V84($param
, u16), _V85(u16, $param
), _V86($param
, u16), _V87(u16, $param
),
290 _V88($param
, u16), _V89(u16, $param
), _V8a($param
, u16), _V8b(u16, $param
),
291 _V8c($param
, u16), _V8d(u16, $param
), _V8e($param
, u16), _V8f(u16, $param
),
293 _V90($param
, u16), _V91(u16, $param
), _V92($param
, u16), _V93(u16, $param
),
294 _V94($param
, u16), _V95(u16, $param
), _V96($param
, u16), _V97(u16, $param
),
295 _V98($param
, u16), _V99(u16, $param
), _V9a($param
, u16), _V9b(u16, $param
),
296 _V9c($param
, u16), _V9d(u16, $param
), _V9e($param
, u16), _V9f(u16, $param
),
298 _Va0($param
, u16), _Va1(u16, $param
), _Va2($param
, u16), _Va3(u16, $param
),
299 _Va4($param
, u16), _Va5(u16, $param
), _Va6($param
, u16), _Va7(u16, $param
),
300 _Va8($param
, u16), _Va9(u16, $param
), _Vaa($param
, u16), _Vab(u16, $param
),
301 _Vac($param
, u16), _Vad(u16, $param
), _Vae($param
, u16), _Vaf(u16, $param
),
303 _Vb0($param
, u16), _Vb1(u16, $param
), _Vb2($param
, u16), _Vb3(u16, $param
),
304 _Vb4($param
, u16), _Vb5(u16, $param
), _Vb6($param
, u16), _Vb7(u16, $param
),
305 _Vb8($param
, u16), _Vb9(u16, $param
), _Vba($param
, u16), _Vbb(u16, $param
),
306 _Vbc($param
, u16), _Vbd(u16, $param
), _Vbe($param
, u16), _Vbf(u16, $param
),
308 _Vc0($param
, u16), _Vc1(u16, $param
), _Vc2($param
, u16), _Vc3(u16, $param
),
309 _Vc4($param
, u16), _Vc5(u16, $param
), _Vc6($param
, u16), _Vc7(u16, $param
),
310 _Vc8($param
, u16), _Vc9(u16, $param
), _Vca($param
, u16), _Vcb(u16, $param
),
311 _Vcc($param
, u16), _Vcd(u16, $param
), _Vce($param
, u16), _Vcf(u16, $param
),
313 _Vd0($param
, u16), _Vd1(u16, $param
), _Vd2($param
, u16), _Vd3(u16, $param
),
314 _Vd4($param
, u16), _Vd5(u16, $param
), _Vd6($param
, u16), _Vd7(u16, $param
),
315 _Vd8($param
, u16), _Vd9(u16, $param
), _Vda($param
, u16), _Vdb(u16, $param
),
316 _Vdc($param
, u16), _Vdd(u16, $param
), _Vde($param
, u16), _Vdf(u16, $param
),
318 _Ve0($param
, u16), _Ve1(u16, $param
), _Ve2($param
, u16), _Ve3(u16, $param
),
319 _Ve4($param
, u16), _Ve5(u16, $param
), _Ve6($param
, u16), _Ve7(u16, $param
),
320 _Ve8($param
, u16), _Ve9(u16, $param
), _Vea($param
, u16), _Veb(u16, $param
),
321 _Vec($param
, u16), _Ved(u16, $param
), _Vee($param
, u16), _Vef(u16, $param
),
323 _Vf0($param
, u16), _Vf1(u16, $param
), _Vf2($param
, u16), _Vf3(u16, $param
),
324 _Vf4($param
, u16), _Vf5(u16, $param
), _Vf6($param
, u16), _Vf7(u16, $param
),
325 _Vf8($param
, u16), _Vf9(u16, $param
), _Vfa($param
, u16), _Vfb(u16, $param
),
326 _Vfc($param
, u16), _Vfd(u16, $param
), _Vfe($param
, u16), _Vff(u16, $param
),