about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorYuki Okushi <huyuumi.dev@gmail.com>2020-06-02 13:07:27 +0900
committerGitHub <noreply@github.com>2020-06-02 13:07:27 +0900
commitb7ec7bd5b78ca950fa343aa1bbaa3d3dd86df9b1 (patch)
treebe3cc1f5d71eef69295c572f6b66c9eb3def256a /src
parentf38800724906ef7cf879a8b242f1df4f031a4217 (diff)
parent4f30c6893700647a11db84818011603199dc248f (diff)
downloadrust-b7ec7bd5b78ca950fa343aa1bbaa3d3dd86df9b1.tar.gz
rust-b7ec7bd5b78ca950fa343aa1bbaa3d3dd86df9b1.zip
Rollup merge of #72893 - RalfJung:unleash-tls, r=ecstatic-morse
test miri-unleash TLS accesses

Finally gets rid of `IS_SUPPORTED_IN_MIRI`. :-)

I also added a test for the new `asm!` while I am at it.

r? @ecstatic-morse Cc @rust-lang/wg-const-eval
Diffstat (limited to 'src')
-rw-r--r--src/librustc_middle/mir/interpret/error.rs4
-rw-r--r--src/librustc_mir/transform/check_consts/ops.rs5
-rw-r--r--src/librustc_mir/transform/check_consts/validation.rs6
-rw-r--r--src/test/ui/consts/miri_unleashed/inline_asm.rs11
-rw-r--r--src/test/ui/consts/miri_unleashed/inline_asm.stderr13
-rw-r--r--src/test/ui/consts/miri_unleashed/tls.rs17
-rw-r--r--src/test/ui/consts/miri_unleashed/tls.stderr17
7 files changed, 58 insertions, 15 deletions
diff --git a/src/librustc_middle/mir/interpret/error.rs b/src/librustc_middle/mir/interpret/error.rs
index 7600bf96e1b..1b3ede40f02 100644
--- a/src/librustc_middle/mir/interpret/error.rs
+++ b/src/librustc_middle/mir/interpret/error.rs
@@ -523,12 +523,12 @@ impl fmt::Display for UnsupportedOpInfo {
         match self {
             Unsupported(ref msg) => write!(f, "{}", msg),
             ReadForeignStatic(did) => {
-                write!(f, "cannot read from foreign (extern) static {:?}", did)
+                write!(f, "cannot read from foreign (extern) static ({:?})", did)
             }
             NoMirFor(did) => write!(f, "no MIR body is available for {:?}", did),
             ReadPointerAsBytes => write!(f, "unable to turn pointer into raw bytes",),
             ReadBytesAsPointer => write!(f, "unable to turn bytes into a pointer"),
-            ThreadLocalStatic(did) => write!(f, "accessing thread local static {:?}", did),
+            ThreadLocalStatic(did) => write!(f, "cannot access thread local static ({:?})", did),
         }
     }
 }
diff --git a/src/librustc_mir/transform/check_consts/ops.rs b/src/librustc_mir/transform/check_consts/ops.rs
index 28743ee8e36..92bd740e27a 100644
--- a/src/librustc_mir/transform/check_consts/ops.rs
+++ b/src/librustc_mir/transform/check_consts/ops.rs
@@ -12,9 +12,6 @@ use super::ConstCx;
 
 /// An operation that is not *always* allowed in a const context.
 pub trait NonConstOp: std::fmt::Debug {
-    /// Whether this operation can be evaluated by miri.
-    const IS_SUPPORTED_IN_MIRI: bool = true;
-
     /// Returns the `Symbol` corresponding to the feature gate that would enable this operation,
     /// or `None` if such a feature gate does not exist.
     fn feature_gate() -> Option<Symbol> {
@@ -356,8 +353,6 @@ impl NonConstOp for StaticAccess {
 #[derive(Debug)]
 pub struct ThreadLocalAccess;
 impl NonConstOp for ThreadLocalAccess {
-    const IS_SUPPORTED_IN_MIRI: bool = false;
-
     fn emit_error(&self, ccx: &ConstCx<'_, '_>, span: Span) {
         struct_span_err!(
             ccx.tcx.sess,
diff --git a/src/librustc_mir/transform/check_consts/validation.rs b/src/librustc_mir/transform/check_consts/validation.rs
index 354fd200fc5..1137c813470 100644
--- a/src/librustc_mir/transform/check_consts/validation.rs
+++ b/src/librustc_mir/transform/check_consts/validation.rs
@@ -244,11 +244,7 @@ impl Validator<'mir, 'tcx> {
             return;
         }
 
-        // If an operation is supported in miri it can be turned on with
-        // `-Zunleash-the-miri-inside-of-you`.
-        let is_unleashable = O::IS_SUPPORTED_IN_MIRI;
-
-        if is_unleashable && self.tcx.sess.opts.debugging_opts.unleash_the_miri_inside_of_you {
+        if self.tcx.sess.opts.debugging_opts.unleash_the_miri_inside_of_you {
             self.tcx.sess.miri_unleashed_feature(span, O::feature_gate());
             return;
         }
diff --git a/src/test/ui/consts/miri_unleashed/inline_asm.rs b/src/test/ui/consts/miri_unleashed/inline_asm.rs
index 7b2b1ed4965..aa9b3144f40 100644
--- a/src/test/ui/consts/miri_unleashed/inline_asm.rs
+++ b/src/test/ui/consts/miri_unleashed/inline_asm.rs
@@ -1,15 +1,22 @@
 // compile-flags: -Zunleash-the-miri-inside-of-you
 // only-x86_64
-#![feature(llvm_asm)]
+#![feature(asm,llvm_asm)]
 #![allow(const_err)]
 
 fn main() {}
 
 // Make sure we catch executing inline assembly.
-static TEST_BAD: () = {
+static TEST_BAD1: () = {
     unsafe { llvm_asm!("xor %eax, %eax" ::: "eax"); }
     //~^ ERROR could not evaluate static initializer
     //~| NOTE inline assembly is not supported
     //~| NOTE in this expansion of llvm_asm!
     //~| NOTE in this expansion of llvm_asm!
 };
+
+// Make sure we catch executing inline assembly.
+static TEST_BAD2: () = {
+    unsafe { asm!("nop"); }
+    //~^ ERROR could not evaluate static initializer
+    //~| NOTE inline assembly is not supported
+};
diff --git a/src/test/ui/consts/miri_unleashed/inline_asm.stderr b/src/test/ui/consts/miri_unleashed/inline_asm.stderr
index 0f5ee5de396..d372b4a5d25 100644
--- a/src/test/ui/consts/miri_unleashed/inline_asm.stderr
+++ b/src/test/ui/consts/miri_unleashed/inline_asm.stderr
@@ -6,6 +6,12 @@ LL |     unsafe { llvm_asm!("xor %eax, %eax" ::: "eax"); }
    |
    = note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
 
+error[E0080]: could not evaluate static initializer
+  --> $DIR/inline_asm.rs:19:14
+   |
+LL |     unsafe { asm!("nop"); }
+   |              ^^^^^^^^^^^^ inline assembly is not supported
+
 warning: skipping const checks
    |
 help: skipping check that does not even have a feature gate
@@ -13,8 +19,13 @@ help: skipping check that does not even have a feature gate
    |
 LL |     unsafe { llvm_asm!("xor %eax, %eax" ::: "eax"); }
    |              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+help: skipping check that does not even have a feature gate
+  --> $DIR/inline_asm.rs:19:14
+   |
+LL |     unsafe { asm!("nop"); }
+   |              ^^^^^^^^^^^^
    = note: this warning originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
 
-error: aborting due to previous error; 1 warning emitted
+error: aborting due to 2 previous errors; 1 warning emitted
 
 For more information about this error, try `rustc --explain E0080`.
diff --git a/src/test/ui/consts/miri_unleashed/tls.rs b/src/test/ui/consts/miri_unleashed/tls.rs
new file mode 100644
index 00000000000..ba86a554bbb
--- /dev/null
+++ b/src/test/ui/consts/miri_unleashed/tls.rs
@@ -0,0 +1,17 @@
+// compile-flags: -Zunleash-the-miri-inside-of-you
+#![feature(thread_local)]
+#![allow(const_err)]
+
+use std::thread;
+
+#[thread_local]
+static A: u8 = 0;
+
+// Make sure we catch accessing thread-local storage.
+static TEST_BAD: () = {
+    unsafe { let _val = A; }
+    //~^ ERROR could not evaluate static initializer
+    //~| NOTE cannot access thread local static
+};
+
+fn main() {}
diff --git a/src/test/ui/consts/miri_unleashed/tls.stderr b/src/test/ui/consts/miri_unleashed/tls.stderr
new file mode 100644
index 00000000000..d3e87f319ac
--- /dev/null
+++ b/src/test/ui/consts/miri_unleashed/tls.stderr
@@ -0,0 +1,17 @@
+error[E0080]: could not evaluate static initializer
+  --> $DIR/tls.rs:12:25
+   |
+LL |     unsafe { let _val = A; }
+   |                         ^ cannot access thread local static (DefId(0:4 ~ tls[317d]::A[0]))
+
+warning: skipping const checks
+   |
+help: skipping check that does not even have a feature gate
+  --> $DIR/tls.rs:12:25
+   |
+LL |     unsafe { let _val = A; }
+   |                         ^
+
+error: aborting due to previous error; 1 warning emitted
+
+For more information about this error, try `rustc --explain E0080`.