From d32924f89d1324386588bd23b0437cdeca1e0fc8 Mon Sep 17 00:00:00 2001 From: Yuki Okushi Date: Mon, 9 Mar 2020 05:00:03 +0900 Subject: [PATCH] Check if output is immediate value --- src/librustc_codegen_llvm/asm.rs | 10 ++++++++-- src/test/ui/asm/issue-62046.rs | 11 +++++++++++ src/test/ui/asm/issue-62046.stderr | 11 +++++++++++ 3 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 src/test/ui/asm/issue-62046.rs create mode 100644 src/test/ui/asm/issue-62046.stderr diff --git a/src/librustc_codegen_llvm/asm.rs b/src/librustc_codegen_llvm/asm.rs index c8f0fe8c72395..7975a70ab269c 100644 --- a/src/librustc_codegen_llvm/asm.rs +++ b/src/librustc_codegen_llvm/asm.rs @@ -29,11 +29,17 @@ impl AsmBuilderMethods<'tcx> for Builder<'a, 'll, 'tcx> { let mut indirect_outputs = vec![]; for (i, (out, &place)) in ia.outputs.iter().zip(&outputs).enumerate() { if out.is_rw { - inputs.push(self.load_operand(place).immediate()); + let operand = self.load_operand(place); + if let OperandValue::Immediate(_) = operand.val { + inputs.push(operand.immediate()); + } ext_constraints.push(i.to_string()); } if out.is_indirect { - indirect_outputs.push(self.load_operand(place).immediate()); + let operand = self.load_operand(place); + if let OperandValue::Immediate(_) = operand.val { + indirect_outputs.push(operand.immediate()); + } } else { output_types.push(place.layout.llvm_type(self.cx())); } diff --git a/src/test/ui/asm/issue-62046.rs b/src/test/ui/asm/issue-62046.rs new file mode 100644 index 0000000000000..105dadd5fd373 --- /dev/null +++ b/src/test/ui/asm/issue-62046.rs @@ -0,0 +1,11 @@ +// build-fail +// ignore-emscripten no asm! support + +#![feature(asm)] + +fn main() { + unsafe { + asm!("nop" : "+r"("r15")); + //~^ malformed inline assembly + } +} diff --git a/src/test/ui/asm/issue-62046.stderr b/src/test/ui/asm/issue-62046.stderr new file mode 100644 index 0000000000000..a38a300548d48 --- /dev/null +++ b/src/test/ui/asm/issue-62046.stderr @@ -0,0 +1,11 @@ +error[E0668]: malformed inline assembly + --> $DIR/issue-62046.rs:8:9 + | +LL | asm!("nop" : "+r"("r15")); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info) + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0668`.