about summary refs log tree commit diff
diff options
context:
space:
mode:
authorDylan MacKenzie <ecstaticmorse@gmail.com>2020-04-19 16:03:35 -0700
committerDylan MacKenzie <ecstaticmorse@gmail.com>2020-04-19 17:50:56 -0700
commit65a985e81e05bef484589fbb45dcee8e8048cda5 (patch)
tree506a3d22cb3b9383ccf2725d6b360af3be7e6778
parentdbf8b6bf116c7bece2987ff4bd2792f008a6ee77 (diff)
downloadrust-65a985e81e05bef484589fbb45dcee8e8048cda5.tar.gz
rust-65a985e81e05bef484589fbb45dcee8e8048cda5.zip
Check for `llvm_asm` in a const context
-rw-r--r--src/librustc_mir/transform/check_consts/ops.rs4
-rw-r--r--src/librustc_mir/transform/check_consts/validation.rs5
-rw-r--r--src/test/ui/consts/inline_asm.rs6
-rw-r--r--src/test/ui/consts/inline_asm.stderr9
4 files changed, 23 insertions, 1 deletions
diff --git a/src/librustc_mir/transform/check_consts/ops.rs b/src/librustc_mir/transform/check_consts/ops.rs
index b5e62aa2013..c4b94b70938 100644
--- a/src/librustc_mir/transform/check_consts/ops.rs
+++ b/src/librustc_mir/transform/check_consts/ops.rs
@@ -148,6 +148,10 @@ impl NonConstOp for IfOrMatch {
 }
 
 #[derive(Debug)]
+pub struct InlineAsm;
+impl NonConstOp for InlineAsm {}
+
+#[derive(Debug)]
 pub struct LiveDrop;
 impl NonConstOp for LiveDrop {
     fn emit_error(&self, item: &Item<'_, '_>, span: Span) {
diff --git a/src/librustc_mir/transform/check_consts/validation.rs b/src/librustc_mir/transform/check_consts/validation.rs
index cee98e9b299..19df6e39e4c 100644
--- a/src/librustc_mir/transform/check_consts/validation.rs
+++ b/src/librustc_mir/transform/check_consts/validation.rs
@@ -481,11 +481,14 @@ impl Visitor<'tcx> for Validator<'_, 'mir, 'tcx> {
             StatementKind::FakeRead(FakeReadCause::ForMatchedPlace, _) => {
                 self.check_op(ops::IfOrMatch);
             }
+            StatementKind::LlvmInlineAsm { .. } => {
+                self.check_op(ops::InlineAsm);
+            }
+
             // FIXME(eddyb) should these really do nothing?
             StatementKind::FakeRead(..)
             | StatementKind::StorageLive(_)
             | StatementKind::StorageDead(_)
-            | StatementKind::LlvmInlineAsm { .. }
             | StatementKind::Retag { .. }
             | StatementKind::AscribeUserType(..)
             | StatementKind::Nop => {}
diff --git a/src/test/ui/consts/inline_asm.rs b/src/test/ui/consts/inline_asm.rs
new file mode 100644
index 00000000000..c2ab97e54f0
--- /dev/null
+++ b/src/test/ui/consts/inline_asm.rs
@@ -0,0 +1,6 @@
+#![feature(llvm_asm)]
+
+const _: () = unsafe { llvm_asm!("nop") };
+//~^ ERROR contains unimplemented expression type
+
+fn main() {}
diff --git a/src/test/ui/consts/inline_asm.stderr b/src/test/ui/consts/inline_asm.stderr
new file mode 100644
index 00000000000..68a78d6175f
--- /dev/null
+++ b/src/test/ui/consts/inline_asm.stderr
@@ -0,0 +1,9 @@
+error[E0019]: constant contains unimplemented expression type
+  --> $DIR/inline_asm.rs:3:1
+   |
+LL | const _: () = unsafe { llvm_asm!("nop") };
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0019`.