]> git.lizzy.rs Git - rust.git/blob - src/test/ui/enum-discriminant/arbitrary_enum_discriminant.rs
Auto merge of #106349 - LeSeulArtichaut:dyn-star-tracking-issue, r=jackh726
[rust.git] / src / test / ui / enum-discriminant / arbitrary_enum_discriminant.rs
1 // run-pass
2 #![feature(test)]
3
4 extern crate test;
5
6 use test::black_box;
7
8 #[allow(dead_code)]
9 #[repr(u8)]
10 enum Enum {
11     Unit = 3,
12     Tuple(u16) = 2,
13     Struct {
14         a: u8,
15         b: u16,
16     } = 1,
17 }
18
19 impl Enum {
20     const unsafe fn tag(&self) -> u8 {
21         *(self as *const Self as *const u8)
22     }
23 }
24
25 fn main() {
26     const UNIT: Enum = Enum::Unit;
27     const TUPLE: Enum = Enum::Tuple(5);
28     const STRUCT: Enum = Enum::Struct{a: 7, b: 11};
29
30     // Ensure discriminants are correct during runtime execution
31     assert_eq!(3, unsafe { black_box(UNIT).tag() });
32     assert_eq!(2, unsafe { black_box(TUPLE).tag() });
33     assert_eq!(1, unsafe { black_box(STRUCT).tag() });
34
35     // Ensure discriminants are correct during CTFE
36     const UNIT_TAG: u8 = unsafe { UNIT.tag() };
37     const TUPLE_TAG: u8 = unsafe { TUPLE.tag() };
38     const STRUCT_TAG: u8 = unsafe { STRUCT.tag() };
39
40     assert_eq!(3, UNIT_TAG);
41     assert_eq!(2, TUPLE_TAG);
42     assert_eq!(1, STRUCT_TAG);
43 }