]>
Commit | Line | Data |
---|---|---|
60c5eb7d XL |
1 | An `enum` with a discriminant must specify a `#[repr(inttype)]`. |
2 | ||
f9f354fc XL |
3 | Erroneous code example: |
4 | ||
5 | ```compile_fail,E0732 | |
6 | #![feature(arbitrary_enum_discriminant)] | |
7 | ||
8 | enum Enum { // error! | |
9 | Unit = 1, | |
10 | Tuple() = 2, | |
11 | Struct{} = 3, | |
12 | } | |
13 | # fn main() {} | |
14 | ``` | |
15 | ||
60c5eb7d XL |
16 | A `#[repr(inttype)]` must be provided on an `enum` if it has a non-unit |
17 | variant with a discriminant, or where there are both unit variants with | |
18 | discriminants and non-unit variants. This restriction ensures that there | |
19 | is a well-defined way to extract a variant's discriminant from a value; | |
20 | for instance: | |
21 | ||
22 | ``` | |
23 | #![feature(arbitrary_enum_discriminant)] | |
24 | ||
25 | #[repr(u8)] | |
26 | enum Enum { | |
27 | Unit = 3, | |
28 | Tuple(u16) = 2, | |
29 | Struct { | |
30 | a: u8, | |
31 | b: u16, | |
32 | } = 1, | |
33 | } | |
34 | ||
35 | fn discriminant(v : &Enum) -> u8 { | |
36 | unsafe { *(v as *const Enum as *const u8) } | |
37 | } | |
38 | ||
f9f354fc XL |
39 | fn main() { |
40 | assert_eq!(3, discriminant(&Enum::Unit)); | |
41 | assert_eq!(2, discriminant(&Enum::Tuple(5))); | |
42 | assert_eq!(1, discriminant(&Enum::Struct{a: 7, b: 11})); | |
43 | } | |
60c5eb7d | 44 | ``` |