summaryrefslogtreecommitdiffstats
path: root/src/test/ui/consts/const_discriminant.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/ui/consts/const_discriminant.rs')
-rw-r--r--src/test/ui/consts/const_discriminant.rs43
1 files changed, 43 insertions, 0 deletions
diff --git a/src/test/ui/consts/const_discriminant.rs b/src/test/ui/consts/const_discriminant.rs
new file mode 100644
index 000000000..f623c5101
--- /dev/null
+++ b/src/test/ui/consts/const_discriminant.rs
@@ -0,0 +1,43 @@
+// run-pass
+#![feature(const_discriminant)]
+#![feature(bench_black_box)]
+#![allow(dead_code)]
+
+use std::mem::{discriminant, Discriminant};
+use std::hint::black_box;
+
+enum Test {
+ A(u8),
+ B,
+ C { a: u8, b: u8 },
+}
+
+const TEST_A: Discriminant<Test> = discriminant(&Test::A(5));
+const TEST_A_OTHER: Discriminant<Test> = discriminant(&Test::A(17));
+const TEST_B: Discriminant<Test> = discriminant(&Test::B);
+
+enum Void {}
+
+enum SingleVariant {
+ V,
+ Never(Void),
+}
+
+const TEST_V: Discriminant<SingleVariant> = discriminant(&SingleVariant::V);
+
+pub const TEST_VOID: () = {
+ // This is UB, but CTFE does not check validity so it does not detect this.
+ // This is a regression test for https://github.com/rust-lang/rust/issues/89765.
+ unsafe { std::mem::discriminant(&*(&() as *const () as *const Void)); };
+};
+
+
+fn main() {
+ assert_eq!(TEST_A, TEST_A_OTHER);
+ assert_eq!(TEST_A, discriminant(black_box(&Test::A(17))));
+ assert_eq!(TEST_B, discriminant(black_box(&Test::B)));
+ assert_ne!(TEST_A, TEST_B);
+ assert_ne!(TEST_B, discriminant(black_box(&Test::C { a: 42, b: 7 })));
+
+ assert_eq!(TEST_V, discriminant(black_box(&SingleVariant::V)));
+}