]>
Commit | Line | Data |
---|---|---|
dc9dc135 | 1 | // run-pass |
dc3f5686 | 2 | #![feature(arbitrary_enum_discriminant, const_raw_ptr_deref, test)] |
dc9dc135 XL |
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 | } |