]>
Commit | Line | Data |
---|---|---|
ba9703b0 XL |
1 | // run-pass |
2 | #![feature(const_discriminant)] | |
cdc7bbd5 | 3 | #![feature(bench_black_box)] |
ba9703b0 XL |
4 | #![allow(dead_code)] |
5 | ||
6 | use std::mem::{discriminant, Discriminant}; | |
1b1a35ee | 7 | use std::hint::black_box; |
ba9703b0 XL |
8 | |
9 | enum Test { | |
10 | A(u8), | |
11 | B, | |
12 | C { a: u8, b: u8 }, | |
13 | } | |
14 | ||
15 | const TEST_A: Discriminant<Test> = discriminant(&Test::A(5)); | |
16 | const TEST_A_OTHER: Discriminant<Test> = discriminant(&Test::A(17)); | |
17 | const TEST_B: Discriminant<Test> = discriminant(&Test::B); | |
18 | ||
19 | enum Void {} | |
20 | ||
21 | enum SingleVariant { | |
22 | V, | |
23 | Never(Void), | |
24 | } | |
25 | ||
26 | const TEST_V: Discriminant<SingleVariant> = discriminant(&SingleVariant::V); | |
27 | ||
3c0e092e XL |
28 | pub const TEST_VOID: () = { |
29 | // This is UB, but CTFE does not check validity so it does not detect this. | |
30 | // This is a regression test for https://github.com/rust-lang/rust/issues/89765. | |
31 | unsafe { std::mem::discriminant(&*(&() as *const () as *const Void)); }; | |
32 | }; | |
33 | ||
34 | ||
ba9703b0 XL |
35 | fn main() { |
36 | assert_eq!(TEST_A, TEST_A_OTHER); | |
1b1a35ee XL |
37 | assert_eq!(TEST_A, discriminant(black_box(&Test::A(17)))); |
38 | assert_eq!(TEST_B, discriminant(black_box(&Test::B))); | |
ba9703b0 | 39 | assert_ne!(TEST_A, TEST_B); |
1b1a35ee | 40 | assert_ne!(TEST_B, discriminant(black_box(&Test::C { a: 42, b: 7 }))); |
ba9703b0 | 41 | |
1b1a35ee | 42 | assert_eq!(TEST_V, discriminant(black_box(&SingleVariant::V))); |
ba9703b0 | 43 | } |