]> git.lizzy.rs Git - rust.git/blob - src/test/ui/consts/const_discriminant.rs
Rollup merge of #72279 - RalfJung:raw-ref-macros, r=nikomatsakis
[rust.git] / src / test / ui / consts / const_discriminant.rs
1 // run-pass
2 #![feature(const_discriminant)]
3 #![allow(dead_code)]
4
5 use std::mem::{discriminant, Discriminant};
6
7 // `discriminant(const_expr)` may get const-propagated.
8 // As we want to check that const-eval is equal to ordinary exection,
9 // we wrap `const_expr` with a function which is not const to prevent this.
10 #[inline(never)]
11 fn identity<T>(x: T) -> T { x }
12
13 enum Test {
14     A(u8),
15     B,
16     C { a: u8, b: u8 },
17 }
18
19 const TEST_A: Discriminant<Test> = discriminant(&Test::A(5));
20 const TEST_A_OTHER: Discriminant<Test> = discriminant(&Test::A(17));
21 const TEST_B: Discriminant<Test> = discriminant(&Test::B);
22
23 enum Void {}
24
25 enum SingleVariant {
26     V,
27     Never(Void),
28 }
29
30 const TEST_V: Discriminant<SingleVariant> = discriminant(&SingleVariant::V);
31
32 fn main() {
33     assert_eq!(TEST_A, TEST_A_OTHER);
34     assert_eq!(TEST_A, discriminant(identity(&Test::A(17))));
35     assert_eq!(TEST_B, discriminant(identity(&Test::B)));
36     assert_ne!(TEST_A, TEST_B);
37     assert_ne!(TEST_B, discriminant(identity(&Test::C { a: 42, b: 7 })));
38
39     assert_eq!(TEST_V, discriminant(identity(&SingleVariant::V)));
40 }