| An `enum` with a discriminant must specify a `#[repr(inttype)]`. |
| |
| Erroneous code example: |
| |
| ```compile_fail,E0732 |
| enum Enum { // error! |
| Unit = 1, |
| Tuple() = 2, |
| Struct{} = 3, |
| } |
| # fn main() {} |
| ``` |
| |
| A `#[repr(inttype)]` must be provided on an `enum` if it has a non-unit |
| variant with a discriminant, or where there are both unit variants with |
| discriminants and non-unit variants. This restriction ensures that there |
| is a well-defined way to extract a variant's discriminant from a value; |
| for instance: |
| |
| ``` |
| #[repr(u8)] |
| enum Enum { |
| Unit = 3, |
| Tuple(u16) = 2, |
| Struct { |
| a: u8, |
| b: u16, |
| } = 1, |
| } |
| |
| fn discriminant(v : &Enum) -> u8 { |
| unsafe { *(v as *const Enum as *const u8) } |
| } |
| |
| fn main() { |
| assert_eq!(3, discriminant(&Enum::Unit)); |
| assert_eq!(2, discriminant(&Enum::Tuple(5))); |
| assert_eq!(1, discriminant(&Enum::Struct{a: 7, b: 11})); |
| } |
| ``` |