]> git.proxmox.com Git - rustc.git/blame - src/test/ui/enum-discriminant/arbitrary_enum_discriminant.rs
New upstream version 1.56.0+dfsg1
[rustc.git] / src / test / ui / enum-discriminant / arbitrary_enum_discriminant.rs
CommitLineData
dc9dc135 1// run-pass
dc3f5686 2#![feature(arbitrary_enum_discriminant, const_raw_ptr_deref, test)]
dc9dc135
XL
3
4extern crate test;
5
6use test::black_box;
7
8#[allow(dead_code)]
9#[repr(u8)]
10enum Enum {
11 Unit = 3,
12 Tuple(u16) = 2,
13 Struct {
14 a: u8,
15 b: u16,
16 } = 1,
17}
18
19impl Enum {
20 const unsafe fn tag(&self) -> u8 {
21 *(self as *const Self as *const u8)
22 }
23}
24
25#[allow(dead_code)]
26#[repr(u8)]
27enum FieldlessEnum {
28 Unit = 3,
29 Tuple() = 2,
30 Struct {} = 1,
31}
32
33fn main() {
34 const UNIT: Enum = Enum::Unit;
35 const TUPLE: Enum = Enum::Tuple(5);
36 const STRUCT: Enum = Enum::Struct{a: 7, b: 11};
37
38 // Ensure discriminants are correct during runtime execution
39 assert_eq!(3, unsafe { black_box(UNIT).tag() });
40 assert_eq!(2, unsafe { black_box(TUPLE).tag() });
41 assert_eq!(1, unsafe { black_box(STRUCT).tag() });
42
43 // Ensure discriminants are correct during CTFE
44 const UNIT_TAG: u8 = unsafe { UNIT.tag() };
45 const TUPLE_TAG: u8 = unsafe { TUPLE.tag() };
46 const STRUCT_TAG: u8 = unsafe { STRUCT.tag() };
47
48 assert_eq!(3, UNIT_TAG);
49 assert_eq!(2, TUPLE_TAG);
50 assert_eq!(1, STRUCT_TAG);
51
52 // Ensure `as` conversions are correct
53 assert_eq!(3, FieldlessEnum::Unit as u8);
54 assert_eq!(2, FieldlessEnum::Tuple() as u8);
55 assert_eq!(1, FieldlessEnum::Struct{} as u8);
56}