]> git.lizzy.rs Git - rust.git/blob - src/test/ui/repr/repr-no-niche.rs
Rollup merge of #94577 - RalfJung:simd-miri, r=scottmcm
[rust.git] / src / test / ui / repr / repr-no-niche.rs
1 // run-pass
2
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.
6
7 // Here are the axes this test is seeking to cover:
8 //
9 // repr annotation:
10 // visible: (); cloaked: (no_niche); transparent: (transparent); shadowy: (transparent, no_niche)
11 //
12 // enum vs struct
13 //
14 // niche-type via type-parameter vs inline declaration
15
16 #![feature(decl_macro)]
17 #![feature(no_niche)]
18
19 use std::mem::size_of;
20 use std::num::{NonZeroU8, NonZeroU16};
21
22 mod struct_inline {
23     use std::num::NonZeroU16 as N16;
24
25     #[derive(Debug)] pub struct Visible(N16);
26
27     #[repr(no_niche)]
28     #[derive(Debug)] pub struct Cloaked(N16);
29
30     #[repr(transparent)]
31     #[derive(Debug)] pub struct Transparent(N16);
32
33     #[repr(transparent, no_niche)]
34     #[derive(Debug)] pub struct Shadowy(N16);
35 }
36
37 mod struct_param {
38     #[derive(Debug)] pub struct Visible<T>(T);
39
40     #[repr(no_niche)]
41     #[derive(Debug)] pub struct Cloaked<T>(T);
42
43     #[repr(transparent)]
44     #[derive(Debug)] pub struct Transparent<T>(T);
45
46     #[repr(transparent, no_niche)]
47     #[derive(Debug)] pub struct Shadowy<T>(T);
48 }
49
50 mod enum_inline {
51     use crate::two_fifty_six_variant_enum;
52     use std::num::{NonZeroU8 as N8, NonZeroU16 as N16};
53
54     #[derive(Debug)] pub enum Visible1 { _A(N16), }
55
56     #[repr(no_niche)]
57     #[derive(Debug)] pub enum Cloaked1 { _A(N16), }
58
59     // (N.B.: transparent enums must be univariant)
60     #[repr(transparent)]
61     #[derive(Debug)] pub enum Transparent { _A(N16), }
62
63     #[repr(transparent, no_niche)]
64     #[derive(Debug)] pub enum Shadowy { _A(N16), }
65
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
70     // context.
71     //
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);
75
76     two_fifty_six_variant_enum!(#[repr(no_niche)] Cloaked2, N8);
77 }
78
79 mod enum_param {
80     use super::two_fifty_six_variant_enum;
81
82     #[derive(Debug)] pub enum Visible1<T> { _A(T), }
83
84     #[repr(no_niche)]
85     #[derive(Debug)] pub enum Cloaked1<T> { _A(T), }
86
87     // (N.B.: transparent enums must be univariant)
88     #[repr(transparent)]
89     #[derive(Debug)] pub enum Transparent<T> { _A(T), }
90
91     #[repr(transparent, no_niche)]
92     #[derive(Debug)] pub enum Shadowy<T> { _A(T), }
93
94     // including multivariant enums for completeness. Same notes apply
95     // here as above (assuming `T` is instantiated with `NonZeroU8`).
96     two_fifty_six_variant_enum!(Visible2<T>);
97
98     two_fifty_six_variant_enum!(#[repr(no_niche)] Cloaked2<T>);
99 }
100
101 fn main() {
102     // sanity-checks
103     assert_eq!(size_of::<struct_inline::Visible>(),               2);
104     assert_eq!(size_of::<struct_inline::Cloaked>(),               2);
105     assert_eq!(size_of::<struct_inline::Transparent>(),           2);
106     assert_eq!(size_of::<struct_inline::Shadowy>(),               2);
107
108     assert_eq!(size_of::<struct_param::Visible<NonZeroU16>>(), 2);
109     assert_eq!(size_of::<struct_param::Cloaked<NonZeroU16>>(), 2);
110     assert_eq!(size_of::<struct_param::Transparent<NonZeroU16>>(), 2);
111     assert_eq!(size_of::<struct_param::Shadowy<NonZeroU16>>(), 2);
112
113     assert_eq!(size_of::<enum_inline::Visible1>(),    2);
114     assert_eq!(size_of::<enum_inline::Cloaked1>(),    2);
115     assert_eq!(size_of::<enum_inline::Transparent>(), 2); // transparent enums are univariant
116     assert_eq!(size_of::<enum_inline::Shadowy>(),     2);
117     assert_eq!(size_of::<enum_inline::Visible2>(),    4);
118     assert_eq!(size_of::<enum_inline::Cloaked2>(),    4);
119
120     assert_eq!(size_of::<enum_param::Visible1<NonZeroU16>>(),    2);
121     assert_eq!(size_of::<enum_param::Cloaked1<NonZeroU16>>(),    2);
122     assert_eq!(size_of::<enum_param::Transparent<NonZeroU16>>(), 2);
123     assert_eq!(size_of::<enum_param::Shadowy<NonZeroU16>>(),     2);
124     assert_eq!(size_of::<enum_param::Visible2<NonZeroU8>>(),     4);
125     assert_eq!(size_of::<enum_param::Cloaked2<NonZeroU8>>(),     4);
126
127     // now the actual tests of no_niche: how do inputs above compose
128     // with `Option` type constructor. The cases with a `_+2` are the
129     // ones where no_niche fires.
130     assert_eq!(size_of::<Option<struct_inline::Visible>>(),       2);
131     assert_eq!(size_of::<Option<struct_inline::Cloaked>>(),       2+2);
132     assert_eq!(size_of::<Option<struct_inline::Transparent>>(),   2);
133     assert_eq!(size_of::<Option<struct_inline::Shadowy>>(),       2+2);
134
135     assert_eq!(size_of::<Option<struct_param::Visible<NonZeroU16>>>(),     2);
136     assert_eq!(size_of::<Option<struct_param::Cloaked<NonZeroU16>>>(),     2+2);
137     assert_eq!(size_of::<Option<struct_param::Transparent<NonZeroU16>>>(), 2);
138     assert_eq!(size_of::<Option<struct_param::Shadowy<NonZeroU16>>>(),     2+2);
139
140     assert_eq!(size_of::<Option<enum_inline::Visible1>>(),    2);
141     assert_eq!(size_of::<Option<enum_inline::Cloaked1>>(),    2+2);
142     assert_eq!(size_of::<Option<enum_inline::Transparent>>(), 2);
143     assert_eq!(size_of::<Option<enum_inline::Shadowy>>(),     2+2);
144     // cannot use niche of multivariant payload
145     assert_eq!(size_of::<Option<enum_inline::Visible2>>(),    4+2);
146     assert_eq!(size_of::<Option<enum_inline::Cloaked2>>(),    4+2);
147
148     assert_eq!(size_of::<Option<enum_param::Visible1<NonZeroU16>>>(),    2);
149     assert_eq!(size_of::<Option<enum_param::Cloaked1<NonZeroU16>>>(),    2+2);
150     assert_eq!(size_of::<Option<enum_param::Transparent<NonZeroU16>>>(), 2);
151     assert_eq!(size_of::<Option<enum_param::Shadowy<NonZeroU16>>>(),     2+2);
152     // cannot use niche of multivariant payload
153     assert_eq!(size_of::<Option<enum_param::Visible2<NonZeroU8>>>(),    4+2);
154     assert_eq!(size_of::<Option<enum_param::Cloaked2<NonZeroU8>>>(),    4+2);
155 }
156
157 macro two_fifty_six_variant_enum {
158     ($(#[$attr:meta])* $name:ident<$param:ident>) => {
159         #[derive(Debug)] $(#[$attr])*
160         pub enum $name<$param> {
161             _V00($param, u16), _V01(u16, $param), _V02($param, u16), _V03(u16, $param),
162             _V04($param, u16), _V05(u16, $param), _V06($param, u16), _V07(u16, $param),
163             _V08($param, u16), _V09(u16, $param), _V0a($param, u16), _V0b(u16, $param),
164             _V0c($param, u16), _V0d(u16, $param), _V0e($param, u16), _V0f(u16, $param),
165
166             _V10($param, u16), _V11(u16, $param), _V12($param, u16), _V13(u16, $param),
167             _V14($param, u16), _V15(u16, $param), _V16($param, u16), _V17(u16, $param),
168             _V18($param, u16), _V19(u16, $param), _V1a($param, u16), _V1b(u16, $param),
169             _V1c($param, u16), _V1d(u16, $param), _V1e($param, u16), _V1f(u16, $param),
170
171             _V20($param, u16), _V21(u16, $param), _V22($param, u16), _V23(u16, $param),
172             _V24($param, u16), _V25(u16, $param), _V26($param, u16), _V27(u16, $param),
173             _V28($param, u16), _V29(u16, $param), _V2a($param, u16), _V2b(u16, $param),
174             _V2c($param, u16), _V2d(u16, $param), _V2e($param, u16), _V2f(u16, $param),
175
176             _V30($param, u16), _V31(u16, $param), _V32($param, u16), _V33(u16, $param),
177             _V34($param, u16), _V35(u16, $param), _V36($param, u16), _V37(u16, $param),
178             _V38($param, u16), _V39(u16, $param), _V3a($param, u16), _V3b(u16, $param),
179             _V3c($param, u16), _V3d(u16, $param), _V3e($param, u16), _V3f(u16, $param),
180
181             _V40($param, u16), _V41(u16, $param), _V42($param, u16), _V43(u16, $param),
182             _V44($param, u16), _V45(u16, $param), _V46($param, u16), _V47(u16, $param),
183             _V48($param, u16), _V49(u16, $param), _V4a($param, u16), _V4b(u16, $param),
184             _V4c($param, u16), _V4d(u16, $param), _V4e($param, u16), _V4f(u16, $param),
185
186             _V50($param, u16), _V51(u16, $param), _V52($param, u16), _V53(u16, $param),
187             _V54($param, u16), _V55(u16, $param), _V56($param, u16), _V57(u16, $param),
188             _V58($param, u16), _V59(u16, $param), _V5a($param, u16), _V5b(u16, $param),
189             _V5c($param, u16), _V5d(u16, $param), _V5e($param, u16), _V5f(u16, $param),
190
191             _V60($param, u16), _V61(u16, $param), _V62($param, u16), _V63(u16, $param),
192             _V64($param, u16), _V65(u16, $param), _V66($param, u16), _V67(u16, $param),
193             _V68($param, u16), _V69(u16, $param), _V6a($param, u16), _V6b(u16, $param),
194             _V6c($param, u16), _V6d(u16, $param), _V6e($param, u16), _V6f(u16, $param),
195
196             _V70($param, u16), _V71(u16, $param), _V72($param, u16), _V73(u16, $param),
197             _V74($param, u16), _V75(u16, $param), _V76($param, u16), _V77(u16, $param),
198             _V78($param, u16), _V79(u16, $param), _V7a($param, u16), _V7b(u16, $param),
199             _V7c($param, u16), _V7d(u16, $param), _V7e($param, u16), _V7f(u16, $param),
200
201             _V80($param, u16), _V81(u16, $param), _V82($param, u16), _V83(u16, $param),
202             _V84($param, u16), _V85(u16, $param), _V86($param, u16), _V87(u16, $param),
203             _V88($param, u16), _V89(u16, $param), _V8a($param, u16), _V8b(u16, $param),
204             _V8c($param, u16), _V8d(u16, $param), _V8e($param, u16), _V8f(u16, $param),
205
206             _V90($param, u16), _V91(u16, $param), _V92($param, u16), _V93(u16, $param),
207             _V94($param, u16), _V95(u16, $param), _V96($param, u16), _V97(u16, $param),
208             _V98($param, u16), _V99(u16, $param), _V9a($param, u16), _V9b(u16, $param),
209             _V9c($param, u16), _V9d(u16, $param), _V9e($param, u16), _V9f(u16, $param),
210
211             _Va0($param, u16), _Va1(u16, $param), _Va2($param, u16), _Va3(u16, $param),
212             _Va4($param, u16), _Va5(u16, $param), _Va6($param, u16), _Va7(u16, $param),
213             _Va8($param, u16), _Va9(u16, $param), _Vaa($param, u16), _Vab(u16, $param),
214             _Vac($param, u16), _Vad(u16, $param), _Vae($param, u16), _Vaf(u16, $param),
215
216             _Vb0($param, u16), _Vb1(u16, $param), _Vb2($param, u16), _Vb3(u16, $param),
217             _Vb4($param, u16), _Vb5(u16, $param), _Vb6($param, u16), _Vb7(u16, $param),
218             _Vb8($param, u16), _Vb9(u16, $param), _Vba($param, u16), _Vbb(u16, $param),
219             _Vbc($param, u16), _Vbd(u16, $param), _Vbe($param, u16), _Vbf(u16, $param),
220
221             _Vc0($param, u16), _Vc1(u16, $param), _Vc2($param, u16), _Vc3(u16, $param),
222             _Vc4($param, u16), _Vc5(u16, $param), _Vc6($param, u16), _Vc7(u16, $param),
223             _Vc8($param, u16), _Vc9(u16, $param), _Vca($param, u16), _Vcb(u16, $param),
224             _Vcc($param, u16), _Vcd(u16, $param), _Vce($param, u16), _Vcf(u16, $param),
225
226             _Vd0($param, u16), _Vd1(u16, $param), _Vd2($param, u16), _Vd3(u16, $param),
227             _Vd4($param, u16), _Vd5(u16, $param), _Vd6($param, u16), _Vd7(u16, $param),
228             _Vd8($param, u16), _Vd9(u16, $param), _Vda($param, u16), _Vdb(u16, $param),
229             _Vdc($param, u16), _Vdd(u16, $param), _Vde($param, u16), _Vdf(u16, $param),
230
231             _Ve0($param, u16), _Ve1(u16, $param), _Ve2($param, u16), _Ve3(u16, $param),
232             _Ve4($param, u16), _Ve5(u16, $param), _Ve6($param, u16), _Ve7(u16, $param),
233             _Ve8($param, u16), _Ve9(u16, $param), _Vea($param, u16), _Veb(u16, $param),
234             _Vec($param, u16), _Ved(u16, $param), _Vee($param, u16), _Vef(u16, $param),
235
236             _Vf0($param, u16), _Vf1(u16, $param), _Vf2($param, u16), _Vf3(u16, $param),
237             _Vf4($param, u16), _Vf5(u16, $param), _Vf6($param, u16), _Vf7(u16, $param),
238             _Vf8($param, u16), _Vf9(u16, $param), _Vfa($param, u16), _Vfb(u16, $param),
239             _Vfc($param, u16), _Vfd(u16, $param), _Vfe($param, u16), _Vff(u16, $param),
240         }
241     },
242
243     ($(#[$attr:meta])* $name:ident, $param:ty) => {
244         #[derive(Debug)] $(#[$attr])*
245         pub enum $name {
246             _V00($param, u16), _V01(u16, $param), _V02($param, u16), _V03(u16, $param),
247             _V04($param, u16), _V05(u16, $param), _V06($param, u16), _V07(u16, $param),
248             _V08($param, u16), _V09(u16, $param), _V0a($param, u16), _V0b(u16, $param),
249             _V0c($param, u16), _V0d(u16, $param), _V0e($param, u16), _V0f(u16, $param),
250
251             _V10($param, u16), _V11(u16, $param), _V12($param, u16), _V13(u16, $param),
252             _V14($param, u16), _V15(u16, $param), _V16($param, u16), _V17(u16, $param),
253             _V18($param, u16), _V19(u16, $param), _V1a($param, u16), _V1b(u16, $param),
254             _V1c($param, u16), _V1d(u16, $param), _V1e($param, u16), _V1f(u16, $param),
255
256             _V20($param, u16), _V21(u16, $param), _V22($param, u16), _V23(u16, $param),
257             _V24($param, u16), _V25(u16, $param), _V26($param, u16), _V27(u16, $param),
258             _V28($param, u16), _V29(u16, $param), _V2a($param, u16), _V2b(u16, $param),
259             _V2c($param, u16), _V2d(u16, $param), _V2e($param, u16), _V2f(u16, $param),
260
261             _V30($param, u16), _V31(u16, $param), _V32($param, u16), _V33(u16, $param),
262             _V34($param, u16), _V35(u16, $param), _V36($param, u16), _V37(u16, $param),
263             _V38($param, u16), _V39(u16, $param), _V3a($param, u16), _V3b(u16, $param),
264             _V3c($param, u16), _V3d(u16, $param), _V3e($param, u16), _V3f(u16, $param),
265
266             _V40($param, u16), _V41(u16, $param), _V42($param, u16), _V43(u16, $param),
267             _V44($param, u16), _V45(u16, $param), _V46($param, u16), _V47(u16, $param),
268             _V48($param, u16), _V49(u16, $param), _V4a($param, u16), _V4b(u16, $param),
269             _V4c($param, u16), _V4d(u16, $param), _V4e($param, u16), _V4f(u16, $param),
270
271             _V50($param, u16), _V51(u16, $param), _V52($param, u16), _V53(u16, $param),
272             _V54($param, u16), _V55(u16, $param), _V56($param, u16), _V57(u16, $param),
273             _V58($param, u16), _V59(u16, $param), _V5a($param, u16), _V5b(u16, $param),
274             _V5c($param, u16), _V5d(u16, $param), _V5e($param, u16), _V5f(u16, $param),
275
276             _V60($param, u16), _V61(u16, $param), _V62($param, u16), _V63(u16, $param),
277             _V64($param, u16), _V65(u16, $param), _V66($param, u16), _V67(u16, $param),
278             _V68($param, u16), _V69(u16, $param), _V6a($param, u16), _V6b(u16, $param),
279             _V6c($param, u16), _V6d(u16, $param), _V6e($param, u16), _V6f(u16, $param),
280
281             _V70($param, u16), _V71(u16, $param), _V72($param, u16), _V73(u16, $param),
282             _V74($param, u16), _V75(u16, $param), _V76($param, u16), _V77(u16, $param),
283             _V78($param, u16), _V79(u16, $param), _V7a($param, u16), _V7b(u16, $param),
284             _V7c($param, u16), _V7d(u16, $param), _V7e($param, u16), _V7f(u16, $param),
285
286             _V80($param, u16), _V81(u16, $param), _V82($param, u16), _V83(u16, $param),
287             _V84($param, u16), _V85(u16, $param), _V86($param, u16), _V87(u16, $param),
288             _V88($param, u16), _V89(u16, $param), _V8a($param, u16), _V8b(u16, $param),
289             _V8c($param, u16), _V8d(u16, $param), _V8e($param, u16), _V8f(u16, $param),
290
291             _V90($param, u16), _V91(u16, $param), _V92($param, u16), _V93(u16, $param),
292             _V94($param, u16), _V95(u16, $param), _V96($param, u16), _V97(u16, $param),
293             _V98($param, u16), _V99(u16, $param), _V9a($param, u16), _V9b(u16, $param),
294             _V9c($param, u16), _V9d(u16, $param), _V9e($param, u16), _V9f(u16, $param),
295
296             _Va0($param, u16), _Va1(u16, $param), _Va2($param, u16), _Va3(u16, $param),
297             _Va4($param, u16), _Va5(u16, $param), _Va6($param, u16), _Va7(u16, $param),
298             _Va8($param, u16), _Va9(u16, $param), _Vaa($param, u16), _Vab(u16, $param),
299             _Vac($param, u16), _Vad(u16, $param), _Vae($param, u16), _Vaf(u16, $param),
300
301             _Vb0($param, u16), _Vb1(u16, $param), _Vb2($param, u16), _Vb3(u16, $param),
302             _Vb4($param, u16), _Vb5(u16, $param), _Vb6($param, u16), _Vb7(u16, $param),
303             _Vb8($param, u16), _Vb9(u16, $param), _Vba($param, u16), _Vbb(u16, $param),
304             _Vbc($param, u16), _Vbd(u16, $param), _Vbe($param, u16), _Vbf(u16, $param),
305
306             _Vc0($param, u16), _Vc1(u16, $param), _Vc2($param, u16), _Vc3(u16, $param),
307             _Vc4($param, u16), _Vc5(u16, $param), _Vc6($param, u16), _Vc7(u16, $param),
308             _Vc8($param, u16), _Vc9(u16, $param), _Vca($param, u16), _Vcb(u16, $param),
309             _Vcc($param, u16), _Vcd(u16, $param), _Vce($param, u16), _Vcf(u16, $param),
310
311             _Vd0($param, u16), _Vd1(u16, $param), _Vd2($param, u16), _Vd3(u16, $param),
312             _Vd4($param, u16), _Vd5(u16, $param), _Vd6($param, u16), _Vd7(u16, $param),
313             _Vd8($param, u16), _Vd9(u16, $param), _Vda($param, u16), _Vdb(u16, $param),
314             _Vdc($param, u16), _Vdd(u16, $param), _Vde($param, u16), _Vdf(u16, $param),
315
316             _Ve0($param, u16), _Ve1(u16, $param), _Ve2($param, u16), _Ve3(u16, $param),
317             _Ve4($param, u16), _Ve5(u16, $param), _Ve6($param, u16), _Ve7(u16, $param),
318             _Ve8($param, u16), _Ve9(u16, $param), _Vea($param, u16), _Veb(u16, $param),
319             _Vec($param, u16), _Ved(u16, $param), _Vee($param, u16), _Vef(u16, $param),
320
321             _Vf0($param, u16), _Vf1(u16, $param), _Vf2($param, u16), _Vf3(u16, $param),
322             _Vf4($param, u16), _Vf5(u16, $param), _Vf6($param, u16), _Vf7(u16, $param),
323             _Vf8($param, u16), _Vf9(u16, $param), _Vfa($param, u16), _Vfb(u16, $param),
324             _Vfc($param, u16), _Vfd(u16, $param), _Vfe($param, u16), _Vff(u16, $param),
325         }
326     }
327 }