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