summaryrefslogtreecommitdiffstats
path: root/src/test/ui/consts/const-eval/validate_uninhabited_zsts.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/ui/consts/const-eval/validate_uninhabited_zsts.rs')
-rw-r--r--src/test/ui/consts/const-eval/validate_uninhabited_zsts.rs30
1 files changed, 30 insertions, 0 deletions
diff --git a/src/test/ui/consts/const-eval/validate_uninhabited_zsts.rs b/src/test/ui/consts/const-eval/validate_uninhabited_zsts.rs
new file mode 100644
index 000000000..96f331275
--- /dev/null
+++ b/src/test/ui/consts/const-eval/validate_uninhabited_zsts.rs
@@ -0,0 +1,30 @@
+// stderr-per-bitwidth
+
+const fn foo() -> ! {
+ unsafe { std::mem::transmute(()) }
+ //~^ ERROR evaluation of constant value failed
+ //~| WARN the type `!` does not permit zero-initialization [invalid_value]
+}
+
+// Type defined in a submodule, so that it is not "visibly"
+// uninhabited (which would change interpreter behavior).
+pub mod empty {
+ #[derive(Clone, Copy)]
+ enum Void {}
+
+ #[derive(Clone, Copy)]
+ pub struct Empty(Void);
+}
+
+#[warn(const_err)]
+const FOO: [empty::Empty; 3] = [foo(); 3];
+
+#[warn(const_err)]
+const BAR: [empty::Empty; 3] = [unsafe { std::mem::transmute(()) }; 3];
+//~^ ERROR it is undefined behavior to use this value
+//~| WARN the type `empty::Empty` does not permit zero-initialization
+
+fn main() {
+ FOO;
+ BAR;
+}