2 #![feature(arbitrary_enum_discriminant, test)]
20 const unsafe fn tag(&self) -> u8 {
21 *(self as *const Self as *const u8)
34 const UNIT: Enum = Enum::Unit;
35 const TUPLE: Enum = Enum::Tuple(5);
36 const STRUCT: Enum = Enum::Struct{a: 7, b: 11};
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() });
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() };
48 assert_eq!(3, UNIT_TAG);
49 assert_eq!(2, TUPLE_TAG);
50 assert_eq!(1, STRUCT_TAG);
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);