| //@ run-pass | |
| #![feature(test)] | |
| extern crate test; | |
| use test::black_box; | |
| #[allow(dead_code)] | |
| #[repr(u8)] | |
| enum Enum { | |
| Unit = 3, | |
| Tuple(u16) = 2, | |
| Struct { | |
| a: u8, | |
| b: u16, | |
| } = 1, | |
| } | |
| impl Enum { | |
| const unsafe fn tag(&self) -> u8 { | |
| *(self as *const Self as *const u8) | |
| } | |
| } | |
| fn main() { | |
| const UNIT: Enum = Enum::Unit; | |
| const TUPLE: Enum = Enum::Tuple(5); | |
| const STRUCT: Enum = Enum::Struct{a: 7, b: 11}; | |
| // Ensure discriminants are correct during runtime execution | |
| assert_eq!(3, unsafe { black_box(UNIT).tag() }); | |
| assert_eq!(2, unsafe { black_box(TUPLE).tag() }); | |
| assert_eq!(1, unsafe { black_box(STRUCT).tag() }); | |
| // Ensure discriminants are correct during CTFE | |
| const UNIT_TAG: u8 = unsafe { UNIT.tag() }; | |
| const TUPLE_TAG: u8 = unsafe { TUPLE.tag() }; | |
| const STRUCT_TAG: u8 = unsafe { STRUCT.tag() }; | |
| assert_eq!(3, UNIT_TAG); | |
| assert_eq!(2, TUPLE_TAG); | |
| assert_eq!(1, STRUCT_TAG); | |
| } |