about summary refs log tree commit diff
diff options
context:
space:
mode:
authorLevente Kurusa <lkurusa@acm.org>2018-10-15 00:00:53 +0200
committerLevente Kurusa <lkurusa@acm.org>2018-10-17 07:40:44 +0200
commit4d7f08b1702840a4d8ade9cd9e9f83743e3241fd (patch)
tree0d806e1cba57888518f95bcac5903bb328bf8f31
parent567557f630693d47fd21151ff1fdbc430e330a13 (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.rs2
-rw-r--r--src/librustc/mir/visit.rs3
-rw-r--r--src/librustc_codegen_llvm/mir/statement.rs8
-rw-r--r--src/librustc_mir/borrow_check/mod.rs2
-rw-r--r--src/librustc_mir/borrow_check/nll/invalidation.rs2
-rw-r--r--src/librustc_mir/build/expr/stmt.rs8
-rw-r--r--src/librustc_mir/dataflow/move_paths/builder.rs2
-rw-r--r--src/test/ui/inline-asm-bad-operand.stderr20
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