From 116bc6dd76924d5769f88a7a9674caa872c1dbaf Mon Sep 17 00:00:00 2001 From: Smitty Date: Thu, 13 May 2021 10:20:51 -0400 Subject: [PATCH] Check for inline assembly in THIR unsafeck --- .../rustc_mir_build/src/check_unsafety.rs | 4 +++- src/test/ui/unsafe/inline_asm.mir.stderr | 20 +++++++++++++++++++ src/test/ui/unsafe/inline_asm.rs | 10 ++++++++++ src/test/ui/unsafe/inline_asm.thir.stderr | 20 +++++++++++++++++++ 4 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 src/test/ui/unsafe/inline_asm.mir.stderr create mode 100644 src/test/ui/unsafe/inline_asm.rs create mode 100644 src/test/ui/unsafe/inline_asm.thir.stderr diff --git a/compiler/rustc_mir_build/src/check_unsafety.rs b/compiler/rustc_mir_build/src/check_unsafety.rs index 933362578f9..83288fa541e 100644 --- a/compiler/rustc_mir_build/src/check_unsafety.rs +++ b/compiler/rustc_mir_build/src/check_unsafety.rs @@ -153,6 +153,9 @@ impl<'thir, 'tcx> Visitor<'thir, 'tcx> for UnsafetyVisitor<'tcx> { self.requires_unsafe(expr.span, CallToUnsafeFunction); } } + ExprKind::InlineAsm { .. } | ExprKind::LlvmInlineAsm { .. } => { + self.requires_unsafe(expr.span, UseOfInlineAssembly); + } _ => {} } @@ -194,7 +197,6 @@ impl BodyUnsafety { #[derive(Clone, Copy, PartialEq)] enum UnsafeOpKind { CallToUnsafeFunction, - #[allow(dead_code)] // FIXME UseOfInlineAssembly, #[allow(dead_code)] // FIXME InitializingTypeWith, diff --git a/src/test/ui/unsafe/inline_asm.mir.stderr b/src/test/ui/unsafe/inline_asm.mir.stderr new file mode 100644 index 00000000000..daacd234eb4 --- /dev/null +++ b/src/test/ui/unsafe/inline_asm.mir.stderr @@ -0,0 +1,20 @@ +error[E0133]: use of inline assembly is unsafe and requires unsafe function or block + --> $DIR/inline_asm.rs:8:5 + | +LL | asm!("nop"); + | ^^^^^^^^^^^^ use of inline assembly + | + = note: inline assembly is entirely unchecked and can cause undefined behavior + +error[E0133]: use of inline assembly is unsafe and requires unsafe function or block + --> $DIR/inline_asm.rs:9:5 + | +LL | llvm_asm!("nop"); + | ^^^^^^^^^^^^^^^^^ use of inline assembly + | + = note: inline assembly is entirely unchecked and can cause undefined behavior + = note: this error originates in the macro `llvm_asm` (in Nightly builds, run with -Z macro-backtrace for more info) + +error: aborting due to 2 previous errors + +For more information about this error, try `rustc --explain E0133`. diff --git a/src/test/ui/unsafe/inline_asm.rs b/src/test/ui/unsafe/inline_asm.rs new file mode 100644 index 00000000000..d002d0e701a --- /dev/null +++ b/src/test/ui/unsafe/inline_asm.rs @@ -0,0 +1,10 @@ +// revisions: mir thir +// [thir]compile-flags: -Z thir-unsafeck + +#![feature(llvm_asm)] +#![feature(asm)] + +fn main() { + asm!("nop"); //~ ERROR use of inline assembly is unsafe and requires unsafe function or block + llvm_asm!("nop"); //~ ERROR use of inline assembly is unsafe and requires unsafe function or block +} diff --git a/src/test/ui/unsafe/inline_asm.thir.stderr b/src/test/ui/unsafe/inline_asm.thir.stderr new file mode 100644 index 00000000000..daacd234eb4 --- /dev/null +++ b/src/test/ui/unsafe/inline_asm.thir.stderr @@ -0,0 +1,20 @@ +error[E0133]: use of inline assembly is unsafe and requires unsafe function or block + --> $DIR/inline_asm.rs:8:5 + | +LL | asm!("nop"); + | ^^^^^^^^^^^^ use of inline assembly + | + = note: inline assembly is entirely unchecked and can cause undefined behavior + +error[E0133]: use of inline assembly is unsafe and requires unsafe function or block + --> $DIR/inline_asm.rs:9:5 + | +LL | llvm_asm!("nop"); + | ^^^^^^^^^^^^^^^^^ use of inline assembly + | + = note: inline assembly is entirely unchecked and can cause undefined behavior + = note: this error originates in the macro `llvm_asm` (in Nightly builds, run with -Z macro-backtrace for more info) + +error: aborting due to 2 previous errors + +For more information about this error, try `rustc --explain E0133`.