about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorDylan MacKenzie <ecstaticmorse@gmail.com>2020-04-10 11:00:48 -0700
committerDylan MacKenzie <ecstaticmorse@gmail.com>2020-05-03 11:36:11 -0700
commitc530b2d8ef33f4c7fe6c9341aad8f5b6a3c3f033 (patch)
treefa72f3c4e37021a1c1cc251ecdc7995a32933832 /src
parenta6a87e8bfc3e10df7eb09ad0e03997191b9936b6 (diff)
Add `rustc_peek` test for liveness with borrows
Diffstat (limited to 'src')
-rw-r--r--src/test/ui/mir-dataflow/liveness-ptr.rs28
-rw-r--r--src/test/ui/mir-dataflow/liveness-ptr.stderr10
2 files changed, 38 insertions, 0 deletions
diff --git a/src/test/ui/mir-dataflow/liveness-ptr.rs b/src/test/ui/mir-dataflow/liveness-ptr.rs
new file mode 100644
index 00000000000..34097d7526a
--- /dev/null
+++ b/src/test/ui/mir-dataflow/liveness-ptr.rs
@@ -0,0 +1,28 @@
+#![feature(core_intrinsics, rustc_attrs)]
+
+use std::intrinsics::rustc_peek;
+
+#[rustc_mir(rustc_peek_liveness, stop_after_dataflow)]
+fn foo() -> i32 {
+    let mut x: i32;
+    let mut p: *const i32;
+
+    x = 0;
+
+    // `x` is live here since it is used in the next statement...
+    unsafe { rustc_peek(x); }
+
+    p = &x;
+
+    // ... but not here, even while it can be accessed through `p`.
+    unsafe { rustc_peek(x); } //~ ERROR rustc_peek: bit not set
+    let tmp = unsafe { *p };
+
+    x = tmp + 1;
+
+    unsafe { rustc_peek(x); }
+
+    x
+}
+
+fn main() {}
diff --git a/src/test/ui/mir-dataflow/liveness-ptr.stderr b/src/test/ui/mir-dataflow/liveness-ptr.stderr
new file mode 100644
index 00000000000..3397d0c5a12
--- /dev/null
+++ b/src/test/ui/mir-dataflow/liveness-ptr.stderr
@@ -0,0 +1,10 @@
+error: rustc_peek: bit not set
+  --> $DIR/liveness-ptr.rs:18:14
+   |
+LL |     unsafe { rustc_peek(x); }
+   |              ^^^^^^^^^^^^^
+
+error: stop_after_dataflow ended compilation
+
+error: aborting due to 2 previous errors
+