about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2023-10-28 09:21:59 +0000
committerbors <bors@rust-lang.org>2023-10-28 09:21:59 +0000
commitfb028cbb992f64df392107a220efce34b58c99aa (patch)
tree1f557315ba3b44d6342100d254f79a239a78ef45 /src
parent6212cc690762057f630c20806926432fc4978bac (diff)
parentd17690065a7f4691926404a72c11c0694f020c66 (diff)
downloadrust-fb028cbb992f64df392107a220efce34b58c99aa.tar.gz
rust-fb028cbb992f64df392107a220efce34b58c99aa.zip
Auto merge of #3148 - RalfJung:underscore-patterns, r=RalfJung
Underscore pattern tests
Diffstat (limited to 'src')
-rw-r--r--src/tools/miri/tests/fail/validity/match_binder_checks_validity1.rs (renamed from src/tools/miri/tests/pass/union-uninhabited-match-underscore.rs)4
-rw-r--r--src/tools/miri/tests/fail/validity/match_binder_checks_validity1.stderr15
-rw-r--r--src/tools/miri/tests/fail/validity/match_binder_checks_validity2.rs14
-rw-r--r--src/tools/miri/tests/fail/validity/match_binder_checks_validity2.stderr15
-rw-r--r--src/tools/miri/tests/pass/dangling_pointer_deref_match_underscore.rs14
-rw-r--r--src/tools/miri/tests/pass/underscore_pattern.rs76
-rw-r--r--src/tools/miri/tests/pass/underscore_pattern.stdout (renamed from src/tools/miri/tests/pass/union-uninhabited-match-underscore.stdout)0
7 files changed, 121 insertions, 17 deletions
diff --git a/src/tools/miri/tests/pass/union-uninhabited-match-underscore.rs b/src/tools/miri/tests/fail/validity/match_binder_checks_validity1.rs
index 33db9c2d347..6c1df45ac0e 100644
--- a/src/tools/miri/tests/pass/union-uninhabited-match-underscore.rs
+++ b/src/tools/miri/tests/fail/validity/match_binder_checks_validity1.rs
@@ -8,10 +8,8 @@ fn main() {
     unsafe {
         let x: Uninit<Void> = Uninit { uninit: () };
         match x.value {
-            // rustc warns about un unreachable pattern,
-            // but is wrong in unsafe code.
             #[allow(unreachable_patterns)]
-            _ => println!("hi from the void!"),
+            _x => println!("hi from the void!"), //~ERROR: invalid value
         }
     }
 }
diff --git a/src/tools/miri/tests/fail/validity/match_binder_checks_validity1.stderr b/src/tools/miri/tests/fail/validity/match_binder_checks_validity1.stderr
new file mode 100644
index 00000000000..c234467bddc
--- /dev/null
+++ b/src/tools/miri/tests/fail/validity/match_binder_checks_validity1.stderr
@@ -0,0 +1,15 @@
+error: Undefined Behavior: constructing invalid value: encountered a value of uninhabited type `main::Void`
+  --> $DIR/match_binder_checks_validity1.rs:LL:CC
+   |
+LL |             _x => println!("hi from the void!"),
+   |             ^^ constructing invalid value: encountered a value of uninhabited type `main::Void`
+   |
+   = help: this indicates a bug in the program: it performed an invalid operation, and caused Undefined Behavior
+   = help: see https://doc.rust-lang.org/nightly/reference/behavior-considered-undefined.html for further information
+   = note: BACKTRACE:
+   = note: inside `main` at $DIR/match_binder_checks_validity1.rs:LL:CC
+
+note: some details are omitted, run with `MIRIFLAGS=-Zmiri-backtrace=full` for a verbose backtrace
+
+error: aborting due to previous error
+
diff --git a/src/tools/miri/tests/fail/validity/match_binder_checks_validity2.rs b/src/tools/miri/tests/fail/validity/match_binder_checks_validity2.rs
new file mode 100644
index 00000000000..0517263a8f5
--- /dev/null
+++ b/src/tools/miri/tests/fail/validity/match_binder_checks_validity2.rs
@@ -0,0 +1,14 @@
+fn main() {
+    #[derive(Copy, Clone)]
+    union Uninit<T: Copy> {
+        value: T,
+        uninit: u8,
+    }
+    unsafe {
+        let x: Uninit<bool> = Uninit { uninit: 3 };
+        match x.value {
+            #[allow(unreachable_patterns)]
+            _x => println!("hi from the void!"), //~ERROR: invalid value
+        }
+    }
+}
diff --git a/src/tools/miri/tests/fail/validity/match_binder_checks_validity2.stderr b/src/tools/miri/tests/fail/validity/match_binder_checks_validity2.stderr
new file mode 100644
index 00000000000..8af2d37d74a
--- /dev/null
+++ b/src/tools/miri/tests/fail/validity/match_binder_checks_validity2.stderr
@@ -0,0 +1,15 @@
+error: Undefined Behavior: constructing invalid value: encountered 0x03, but expected a boolean
+  --> $DIR/match_binder_checks_validity2.rs:LL:CC
+   |
+LL |             _x => println!("hi from the void!"),
+   |             ^^ constructing invalid value: encountered 0x03, but expected a boolean
+   |
+   = help: this indicates a bug in the program: it performed an invalid operation, and caused Undefined Behavior
+   = help: see https://doc.rust-lang.org/nightly/reference/behavior-considered-undefined.html for further information
+   = note: BACKTRACE:
+   = note: inside `main` at $DIR/match_binder_checks_validity2.rs:LL:CC
+
+note: some details are omitted, run with `MIRIFLAGS=-Zmiri-backtrace=full` for a verbose backtrace
+
+error: aborting due to previous error
+
diff --git a/src/tools/miri/tests/pass/dangling_pointer_deref_match_underscore.rs b/src/tools/miri/tests/pass/dangling_pointer_deref_match_underscore.rs
deleted file mode 100644
index c3cff1f4280..00000000000
--- a/src/tools/miri/tests/pass/dangling_pointer_deref_match_underscore.rs
+++ /dev/null
@@ -1,14 +0,0 @@
-// A `_` binding in a match is a nop, so we do not detect that the pointer is dangling.
-//@compile-flags: -Zmiri-disable-alignment-check -Zmiri-disable-stacked-borrows -Zmiri-disable-validation
-
-fn main() {
-    let p = {
-        let b = Box::new(42);
-        &*b as *const i32
-    };
-    unsafe {
-        match *p {
-            _ => {}
-        }
-    }
-}
diff --git a/src/tools/miri/tests/pass/underscore_pattern.rs b/src/tools/miri/tests/pass/underscore_pattern.rs
new file mode 100644
index 00000000000..f9b42c5bc8e
--- /dev/null
+++ b/src/tools/miri/tests/pass/underscore_pattern.rs
@@ -0,0 +1,76 @@
+// Various tests ensuring that underscore patterns really just construct the place, but don't check its contents.
+#![feature(strict_provenance)]
+use std::ptr;
+
+fn main() {
+    dangling_deref_match();
+    union_uninhabited_match();
+    dangling_let();
+    invalid_let();
+    dangling_let_type_annotation();
+    invalid_let_type_annotation();
+}
+
+fn dangling_deref_match() {
+    let p = {
+        let b = Box::new(42);
+        &*b as *const i32
+    };
+    unsafe {
+        match *p {
+            _ => {}
+        }
+    }
+}
+
+fn union_uninhabited_match() {
+    #[derive(Copy, Clone)]
+    enum Void {}
+    union Uninit<T: Copy> {
+        value: T,
+        uninit: (),
+    }
+    unsafe {
+        let x: Uninit<Void> = Uninit { uninit: () };
+        match x.value {
+            // rustc warns about un unreachable pattern,
+            // but is wrong in unsafe code.
+            #[allow(unreachable_patterns)]
+            _ => println!("hi from the void!"),
+        }
+    }
+}
+
+fn dangling_let() {
+    unsafe {
+        let ptr = ptr::invalid::<bool>(0x40);
+        let _ = *ptr;
+    }
+}
+
+fn invalid_let() {
+    unsafe {
+        let val = 3u8;
+        let ptr = ptr::addr_of!(val).cast::<bool>();
+        let _ = *ptr;
+    }
+}
+
+// Adding a type annotation used to change how MIR is generated, make sure we cover both cases.
+fn dangling_let_type_annotation() {
+    unsafe {
+        let ptr = ptr::invalid::<bool>(0x40);
+        let _: bool = *ptr;
+    }
+}
+
+fn invalid_let_type_annotation() {
+    unsafe {
+        let val = 3u8;
+        let ptr = ptr::addr_of!(val).cast::<bool>();
+        let _: bool = *ptr;
+    }
+}
+
+// FIXME: we should also test `!`, not just `bool` -- but that s currently buggy:
+// https://github.com/rust-lang/rust/issues/117288
diff --git a/src/tools/miri/tests/pass/union-uninhabited-match-underscore.stdout b/src/tools/miri/tests/pass/underscore_pattern.stdout
index ff731696f01..ff731696f01 100644
--- a/src/tools/miri/tests/pass/union-uninhabited-match-underscore.stdout
+++ b/src/tools/miri/tests/pass/underscore_pattern.stdout