]> git.lizzy.rs Git - rust.git/blob - src/test/run-pass/discriminant_value.rs
Auto merge of #28816 - petrochenkov:unistruct, r=nrc
[rust.git] / src / test / run-pass / discriminant_value.rs
1 // Copyright 2014 The Rust Project Developers. See the COPYRIGHT
2 // file at the top-level directory of this distribution and at
3 // http://rust-lang.org/COPYRIGHT.
4 //
5 // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6 // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8 // option. This file may not be copied, modified, or distributed
9 // except according to those terms.
10
11 #![feature(core, core_intrinsics)]
12
13 extern crate core;
14 use core::intrinsics::discriminant_value;
15
16 enum CLike1 {
17     A,
18     B,
19     C,
20     D
21 }
22
23 enum CLike2 {
24     A = 5,
25     B = 2,
26     C = 19,
27     D
28 }
29
30 #[repr(i8)]
31 enum CLike3 {
32     A = 5,
33     B,
34     C = -1,
35     D
36 }
37
38 enum ADT {
39     First(u32, u32),
40     Second(u64)
41 }
42
43 enum NullablePointer {
44     Something(&'static u32),
45     Nothing
46 }
47
48 static CONST : u32 = 0xBEEF;
49
50 pub fn main() {
51     unsafe {
52
53         assert_eq!(discriminant_value(&CLike1::A), 0);
54         assert_eq!(discriminant_value(&CLike1::B), 1);
55         assert_eq!(discriminant_value(&CLike1::C), 2);
56         assert_eq!(discriminant_value(&CLike1::D), 3);
57
58         assert_eq!(discriminant_value(&CLike2::A), 5);
59         assert_eq!(discriminant_value(&CLike2::B), 2);
60         assert_eq!(discriminant_value(&CLike2::C), 19);
61         assert_eq!(discriminant_value(&CLike2::D), 20);
62
63         assert_eq!(discriminant_value(&CLike3::A), 5);
64         assert_eq!(discriminant_value(&CLike3::B), 6);
65         assert_eq!(discriminant_value(&CLike3::C), -1_i8 as u64);
66         assert_eq!(discriminant_value(&CLike3::D), 0);
67
68         assert_eq!(discriminant_value(&ADT::First(0,0)), 0);
69         assert_eq!(discriminant_value(&ADT::Second(5)), 1);
70
71         assert_eq!(discriminant_value(&NullablePointer::Nothing), 1);
72         assert_eq!(discriminant_value(&NullablePointer::Something(&CONST)), 0);
73
74         assert_eq!(discriminant_value(&10), 0);
75         assert_eq!(discriminant_value(&"test"), 0);
76     }
77 }