diff options
| author | Levente Kurusa <lkurusa@acm.org> | 2018-10-15 00:00:53 +0200 |
|---|---|---|
| committer | Levente Kurusa <lkurusa@acm.org> | 2018-10-17 07:40:44 +0200 |
| commit | 4d7f08b1702840a4d8ade9cd9e9f83743e3241fd (patch) | |
| tree | 0d806e1cba57888518f95bcac5903bb328bf8f31 | |
| parent | 567557f630693d47fd21151ff1fdbc430e330a13 (diff) | |
rustc: improve E0669 span
E0669 refers to a constraint that cannot be coerced into a single LLVM value, unfortunately right now this uses the Span for the entire inline assembly statement, which is less than ideal. This commit preserves the Span from HIR, which lets us emit the error using the Span for the operand itself in MIR. Signed-off-by: Levente Kurusa <lkurusa@acm.org>
| -rw-r--r-- | src/librustc/mir/mod.rs | 2 | ||||
| -rw-r--r-- | src/librustc/mir/visit.rs | 3 | ||||
| -rw-r--r-- | src/librustc_codegen_llvm/mir/statement.rs | 8 | ||||
| -rw-r--r-- | src/librustc_mir/borrow_check/mod.rs | 2 | ||||
| -rw-r--r-- | src/librustc_mir/borrow_check/nll/invalidation.rs | 2 | ||||
| -rw-r--r-- | src/librustc_mir/build/expr/stmt.rs | 8 | ||||
| -rw-r--r-- | src/librustc_mir/dataflow/move_paths/builder.rs | 2 | ||||
| -rw-r--r-- | src/test/ui/inline-asm-bad-operand.stderr | 20 |
8 files changed, 26 insertions, 21 deletions
diff --git a/src/librustc/mir/mod.rs b/src/librustc/mir/mod.rs index ea4eb761964..7f6c5b1a9ce 100644 --- a/src/librustc/mir/mod.rs +++ b/src/librustc/mir/mod.rs @@ -1713,7 +1713,7 @@ pub enum StatementKind<'tcx> { InlineAsm { asm: Box<InlineAsm>, outputs: Box<[Place<'tcx>]>, - inputs: Box<[Operand<'tcx>]>, + inputs: Box<[(Span, Operand<'tcx>)]>, }, /// Assert the given places to be valid inhabitants of their type. These statements are diff --git a/src/librustc/mir/visit.rs b/src/librustc/mir/visit.rs index d2b0a6a37a7..b9d23caf71c 100644 --- a/src/librustc/mir/visit.rs +++ b/src/librustc/mir/visit.rs @@ -383,7 +383,8 @@ macro_rules! make_mir_visitor { for output in & $($mutability)* outputs[..] { self.visit_place(output, PlaceContext::AsmOutput, location); } - for input in & $($mutability)* inputs[..] { + for (span, input) in & $($mutability)* inputs[..] { + self.visit_span(span); self.visit_operand(input, location); } } diff --git a/src/librustc_codegen_llvm/mir/statement.rs b/src/librustc_codegen_llvm/mir/statement.rs index 93be0074f6e..2a873fb4cbb 100644 --- a/src/librustc_codegen_llvm/mir/statement.rs +++ b/src/librustc_codegen_llvm/mir/statement.rs @@ -84,18 +84,18 @@ impl FunctionCx<'a, 'll, 'tcx> { }).collect(); let input_vals = inputs.iter() - .try_fold(Vec::with_capacity(inputs.len()), |mut acc, input| { + .try_fold(Vec::with_capacity(inputs.len()), |mut acc, (span, input)| { let op = self.codegen_operand(&bx, input); if let OperandValue::Immediate(_) = op.val { acc.push(op.immediate()); Ok(acc) } else { - Err(op) + Err(span) } }); - if input_vals.is_err() { - span_err!(bx.sess(), statement.source_info.span, E0669, + if let Err(span) = input_vals { + span_err!(bx.sess(), span.to_owned(), E0669, "invalid value for constraint in inline assembly"); } else { let input_vals = input_vals.unwrap(); diff --git a/src/librustc_mir/borrow_check/mod.rs b/src/librustc_mir/borrow_check/mod.rs index 0943b36440a..ec05f9be1fc 100644 --- a/src/librustc_mir/borrow_check/mod.rs +++ b/src/librustc_mir/borrow_check/mod.rs @@ -565,7 +565,7 @@ impl<'cx, 'gcx, 'tcx> DataflowResultsConsumer<'cx, 'tcx> for MirBorrowckCtxt<'cx ); } } - for input in inputs.iter() { + for (_, input) in inputs.iter() { self.consume_operand(context, (input, span), flow_state); } } diff --git a/src/librustc_mir/borrow_check/nll/invalidation.rs b/src/librustc_mir/borrow_check/nll/invalidation.rs index a9b5531bae5..5c2d4788a4c 100644 --- a/src/librustc_mir/borrow_check/nll/invalidation.rs +++ b/src/librustc_mir/borrow_check/nll/invalidation.rs @@ -128,7 +128,7 @@ impl<'cx, 'tcx, 'gcx> Visitor<'tcx> for InvalidationGenerator<'cx, 'tcx, 'gcx> { ); } } - for input in inputs.iter() { + for (_, input) in inputs.iter() { self.consume_operand(context, input); } } diff --git a/src/librustc_mir/build/expr/stmt.rs b/src/librustc_mir/build/expr/stmt.rs index d2b39f088b6..8f52499124a 100644 --- a/src/librustc_mir/build/expr/stmt.rs +++ b/src/librustc_mir/build/expr/stmt.rs @@ -167,8 +167,12 @@ impl<'a, 'gcx, 'tcx> Builder<'a, 'gcx, 'tcx> { .into_boxed_slice(); let inputs = inputs .into_iter() - .map(|input| unpack!(block = this.as_local_operand(block, input))) - .collect::<Vec<_>>() + .map(|input| { + ( + input.span(), + unpack!(block = this.as_local_operand(block, input)), + ) + }).collect::<Vec<_>>() .into_boxed_slice(); this.cfg.push( block, diff --git a/src/librustc_mir/dataflow/move_paths/builder.rs b/src/librustc_mir/dataflow/move_paths/builder.rs index 32b11870116..c64ebb0771f 100644 --- a/src/librustc_mir/dataflow/move_paths/builder.rs +++ b/src/librustc_mir/dataflow/move_paths/builder.rs @@ -290,7 +290,7 @@ impl<'b, 'a, 'gcx, 'tcx> Gatherer<'b, 'a, 'gcx, 'tcx> { self.gather_init(output, InitKind::Deep); } } - for input in inputs.iter() { + for (_, input) in inputs.iter() { self.gather_operand(input); } } diff --git a/src/test/ui/inline-asm-bad-operand.stderr b/src/test/ui/inline-asm-bad-operand.stderr index 6971215a95f..ceef990d181 100644 --- a/src/test/ui/inline-asm-bad-operand.stderr +++ b/src/test/ui/inline-asm-bad-operand.stderr @@ -1,32 +1,32 @@ error[E0669]: invalid value for constraint in inline assembly - --> $DIR/inline-asm-bad-operand.rs:28:9 + --> $DIR/inline-asm-bad-operand.rs:28:24 | LL | asm!("" :: "r"("")); //~ ERROR E0669 - | ^^^^^^^^^^^^^^^^^^^^ + | ^^ error[E0669]: invalid value for constraint in inline assembly - --> $DIR/inline-asm-bad-operand.rs:33:9 + --> $DIR/inline-asm-bad-operand.rs:33:32 | LL | asm!("ret" : : "{rdi}"(target)); //~ ERROR E0669 - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | ^^^^^^ error[E0669]: invalid value for constraint in inline assembly - --> $DIR/inline-asm-bad-operand.rs:40:14 + --> $DIR/inline-asm-bad-operand.rs:40:29 | LL | unsafe { asm!("" :: "i"(hello)) }; //~ ERROR E0669 - | ^^^^^^^^^^^^^^^^^^^^^^ + | ^^^^^ error[E0669]: invalid value for constraint in inline assembly - --> $DIR/inline-asm-bad-operand.rs:48:9 + --> $DIR/inline-asm-bad-operand.rs:48:38 | LL | asm!("movups $1, %xmm0"::"m"(arr)); //~ ERROR E0669 - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | ^^^ error[E0669]: invalid value for constraint in inline assembly - --> $DIR/inline-asm-bad-operand.rs:55:9 + --> $DIR/inline-asm-bad-operand.rs:55:32 | LL | asm!("mov sp, $0"::"r"(addr)); //~ ERROR E0669 - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | ^^^^ error: aborting due to 5 previous errors |
