about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/test/ui/consts/miri_unleashed/nrvo.rs23
-rw-r--r--src/test/ui/consts/miri_unleashed/nrvo.stderr27
2 files changed, 50 insertions, 0 deletions
diff --git a/src/test/ui/consts/miri_unleashed/nrvo.rs b/src/test/ui/consts/miri_unleashed/nrvo.rs
new file mode 100644
index 00000000000..b7f11024805
--- /dev/null
+++ b/src/test/ui/consts/miri_unleashed/nrvo.rs
@@ -0,0 +1,23 @@
+// compile-flags: -Zunleash-the-miri-inside-of-you
+// run-pass
+
+const fn init(buf: &mut [u8; 1024]) {
+    buf[33] = 3;
+    buf[444] = 4;
+}
+
+const fn nrvo(init: fn(&mut [u8; 1024])) -> [u8; 1024] {
+    let mut buf = [0; 1024];
+    init(&mut buf);
+    buf
+}
+
+// When the NRVO is applied, the return place (`_0`) gets treated like a normal local. For example,
+// its address may be taken and it may be written to indirectly. Ensure that MIRI can handle this.
+const BUF: [u8; 1024] = nrvo(init);
+
+fn main() {
+    assert_eq!(BUF[33], 3);
+    assert_eq!(BUF[19], 0);
+    assert_eq!(BUF[444], 4);
+}
diff --git a/src/test/ui/consts/miri_unleashed/nrvo.stderr b/src/test/ui/consts/miri_unleashed/nrvo.stderr
new file mode 100644
index 00000000000..d38f869181b
--- /dev/null
+++ b/src/test/ui/consts/miri_unleashed/nrvo.stderr
@@ -0,0 +1,27 @@
+warning: skipping const checks
+   |
+help: skipping check for `const_mut_refs` feature
+  --> $DIR/nrvo.rs:5:5
+   |
+LL |     buf[33] = 3;
+   |     ^^^^^^^^^^^
+help: skipping check for `const_mut_refs` feature
+  --> $DIR/nrvo.rs:6:5
+   |
+LL |     buf[444] = 4;
+   |     ^^^^^^^^^^^^
+help: skipping check for `const_mut_refs` feature
+  --> $DIR/nrvo.rs:11:10
+   |
+LL |     init(&mut buf);
+   |          ^^^^^^^^
+help: skipping check that does not even have a feature gate
+  --> $DIR/nrvo.rs:11:5
+   |
+LL |     init(&mut buf);
+   |     ^^^^^^^^^^^^^^
+
+error: `-Zunleash-the-miri-inside-of-you` may not be used to circumvent feature gates, except when testing error paths in the CTFE engine
+
+error: aborting due to previous error; 1 warning emitted
+