Skip to content

Latest commit

 

History

History
40 lines (34 loc) · 891 Bytes

File metadata and controls

40 lines (34 loc) · 891 Bytes

An enum with a discriminant must specify a #[repr(inttype)].

Erroneous code example:

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}));
}