]> git.lizzy.rs Git - rust.git/blob - src/test/ui/enum-discriminant/arbitrary_enum_discriminant.rs
Rollup merge of #85766 - workingjubilee:file-options, r=yaahc
[rust.git] / src / test / ui / enum-discriminant / arbitrary_enum_discriminant.rs
1 // run-pass
2 #![feature(arbitrary_enum_discriminant, test)]
3
4 extern crate test;
5
6 use test::black_box;
7
8 #[allow(dead_code)]
9 #[repr(u8)]
10 enum Enum {
11     Unit = 3,
12     Tuple(u16) = 2,
13     Struct {
14         a: u8,
15         b: u16,
16     } = 1,
17 }
18
19 impl Enum {
20     const unsafe fn tag(&self) -> u8 {
21         *(self as *const Self as *const u8)
22     }
23 }
24
25 #[allow(dead_code)]
26 #[repr(u8)]
27 enum FieldlessEnum {
28     Unit = 3,
29     Tuple() = 2,
30     Struct {} = 1,
31 }
32
33 fn main() {
34     const UNIT: Enum = Enum::Unit;
35     const TUPLE: Enum = Enum::Tuple(5);
36     const STRUCT: Enum = Enum::Struct{a: 7, b: 11};
37
38     // Ensure discriminants are correct during runtime execution
39     assert_eq!(3, unsafe { black_box(UNIT).tag() });
40     assert_eq!(2, unsafe { black_box(TUPLE).tag() });
41     assert_eq!(1, unsafe { black_box(STRUCT).tag() });
42
43     // Ensure discriminants are correct during CTFE
44     const UNIT_TAG: u8 = unsafe { UNIT.tag() };
45     const TUPLE_TAG: u8 = unsafe { TUPLE.tag() };
46     const STRUCT_TAG: u8 = unsafe { STRUCT.tag() };
47
48     assert_eq!(3, UNIT_TAG);
49     assert_eq!(2, TUPLE_TAG);
50     assert_eq!(1, STRUCT_TAG);
51
52     // Ensure `as` conversions are correct
53     assert_eq!(3, FieldlessEnum::Unit as u8);
54     assert_eq!(2, FieldlessEnum::Tuple() as u8);
55     assert_eq!(1, FieldlessEnum::Struct{} as u8);
56 }