// run-pass #![allow(stable_features)] #![feature(core, core_intrinsics)] extern crate core; use core::intrinsics::discriminant_value; enum CLike1 { A, B, C, D } enum CLike2 { A = 5, B = 2, C = 19, D } #[repr(i8)] enum CLike3 { A = 5, B, C = -1, D } #[allow(dead_code)] enum ADT { First(u32, u32), Second(u64) } enum NullablePointer { Something(#[allow(dead_code)] &'static u32), Nothing } static CONST : u32 = 0xBEEF; #[allow(dead_code)] #[repr(isize)] enum Mixed { Unit = 3, Tuple(u16) = 2, Struct { a: u8, b: u16, } = 1, } pub fn main() { assert_eq!(discriminant_value(&CLike1::A), 0isize); assert_eq!(discriminant_value(&CLike1::B), 1); assert_eq!(discriminant_value(&CLike1::C), 2); assert_eq!(discriminant_value(&CLike1::D), 3); assert_eq!(discriminant_value(&CLike2::A), 5isize); assert_eq!(discriminant_value(&CLike2::B), 2); assert_eq!(discriminant_value(&CLike2::C), 19); assert_eq!(discriminant_value(&CLike2::D), 20); assert_eq!(discriminant_value(&CLike3::A), 5i8); assert_eq!(discriminant_value(&CLike3::B), 6); assert_eq!(discriminant_value(&CLike3::C), -1); assert_eq!(discriminant_value(&CLike3::D), 0); assert_eq!(discriminant_value(&ADT::First(0,0)), 0isize); assert_eq!(discriminant_value(&ADT::Second(5)), 1); assert_eq!(discriminant_value(&NullablePointer::Nothing), 1isize); assert_eq!(discriminant_value(&NullablePointer::Something(&CONST)), 0); assert_eq!(discriminant_value(&10), 0u8); assert_eq!(discriminant_value(&"test"), 0u8); assert_eq!(discriminant_value(&Mixed::Unit), 3isize); assert_eq!(discriminant_value(&Mixed::Tuple(5)), 2); assert_eq!(discriminant_value(&Mixed::Struct{a: 7, b: 11}), 1); }