From b7bfdbe68147f2ea8ca4870270643180bef76e02 Mon Sep 17 00:00:00 2001 From: varkor Date: Sun, 22 Dec 2019 18:42:15 +0000 Subject: [PATCH] Improve invalid assignment error --- src/librustc_typeck/check/expr.rs | 9 ++++-- src/librustc_typeck/check/op.rs | 8 ++--- src/test/ui/bad/bad-expr-lhs.rs | 10 +++--- src/test/ui/bad/bad-expr-lhs.stderr | 32 ++++++++++++------- src/test/ui/error-codes/E0067.stderr | 8 +++-- src/test/ui/error-codes/E0070.stderr | 18 +++++++---- src/test/ui/issues/issue-13407.rs | 2 +- src/test/ui/issues/issue-13407.stderr | 6 ++-- src/test/ui/issues/issue-26093.rs | 4 ++- src/test/ui/issues/issue-26093.stderr | 26 ++++++++++++--- src/test/ui/issues/issue-34334.rs | 2 +- src/test/ui/issues/issue-34334.stderr | 6 ++-- .../type-check/assignment-expected-bool.rs | 2 +- .../assignment-expected-bool.stderr | 6 ++-- .../ui/type/type-check/assignment-in-if.rs | 2 +- 15 files changed, 92 insertions(+), 49 deletions(-) diff --git a/src/librustc_typeck/check/expr.rs b/src/librustc_typeck/check/expr.rs index 6ecf3ccd6e7e..27f6b3cb45f4 100644 --- a/src/librustc_typeck/check/expr.rs +++ b/src/librustc_typeck/check/expr.rs @@ -753,9 +753,12 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { } err.emit(); } else if !lhs.is_syntactic_place_expr() { - struct_span_err!(self.tcx.sess, expr.span, E0070, "invalid left-hand side expression") - .span_label(expr.span, "left-hand of expression not valid") - .emit(); + struct_span_err!( + self.tcx.sess, + expr.span, + E0070, + "invalid left-hand side of assignment", + ).span_label(lhs.span, "cannot assign to this expression").emit(); } self.require_type_is_sized(lhs_ty, lhs.span, traits::AssignmentLhsSized); diff --git a/src/librustc_typeck/check/op.rs b/src/librustc_typeck/check/op.rs index 53475569b2c3..eeee7dea4d1c 100644 --- a/src/librustc_typeck/check/op.rs +++ b/src/librustc_typeck/check/op.rs @@ -36,12 +36,10 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { if !lhs_expr.is_syntactic_place_expr() { struct_span_err!( self.tcx.sess, - lhs_expr.span, + op.span, E0067, - "invalid left-hand side expression" - ) - .span_label(lhs_expr.span, "invalid expression for left-hand side") - .emit(); + "invalid left-hand side of assignment", + ).span_label(lhs_expr.span, "cannot assign to this expression").emit(); } ty } diff --git a/src/test/ui/bad/bad-expr-lhs.rs b/src/test/ui/bad/bad-expr-lhs.rs index 2cd8bc9d4733..d7cf1b770051 100644 --- a/src/test/ui/bad/bad-expr-lhs.rs +++ b/src/test/ui/bad/bad-expr-lhs.rs @@ -1,10 +1,10 @@ fn main() { - 1 = 2; //~ ERROR invalid left-hand side expression - 1 += 2; //~ ERROR invalid left-hand side expression - (1, 2) = (3, 4); //~ ERROR invalid left-hand side expression + 1 = 2; //~ ERROR invalid left-hand side of assignment + 1 += 2; //~ ERROR invalid left-hand side of assignment + (1, 2) = (3, 4); //~ ERROR invalid left-hand side of assignment let (a, b) = (1, 2); - (a, b) = (3, 4); //~ ERROR invalid left-hand side expression + (a, b) = (3, 4); //~ ERROR invalid left-hand side of assignment - None = Some(3); //~ ERROR invalid left-hand side expression + None = Some(3); //~ ERROR invalid left-hand side of assignment } diff --git a/src/test/ui/bad/bad-expr-lhs.stderr b/src/test/ui/bad/bad-expr-lhs.stderr index a0de6a73797e..07cffbe97a8d 100644 --- a/src/test/ui/bad/bad-expr-lhs.stderr +++ b/src/test/ui/bad/bad-expr-lhs.stderr @@ -1,32 +1,42 @@ -error[E0070]: invalid left-hand side expression +error[E0070]: invalid left-hand side of assignment --> $DIR/bad-expr-lhs.rs:2:5 | LL | 1 = 2; - | ^^^^^ left-hand of expression not valid + | -^^^^ + | | + | cannot assign to this expression -error[E0067]: invalid left-hand side expression - --> $DIR/bad-expr-lhs.rs:3:5 +error[E0067]: invalid left-hand side of assignment + --> $DIR/bad-expr-lhs.rs:3:7 | LL | 1 += 2; - | ^ invalid expression for left-hand side + | - ^^ + | | + | cannot assign to this expression -error[E0070]: invalid left-hand side expression +error[E0070]: invalid left-hand side of assignment --> $DIR/bad-expr-lhs.rs:4:5 | LL | (1, 2) = (3, 4); - | ^^^^^^^^^^^^^^^ left-hand of expression not valid + | ------^^^^^^^^^ + | | + | cannot assign to this expression -error[E0070]: invalid left-hand side expression +error[E0070]: invalid left-hand side of assignment --> $DIR/bad-expr-lhs.rs:7:5 | LL | (a, b) = (3, 4); - | ^^^^^^^^^^^^^^^ left-hand of expression not valid + | ------^^^^^^^^^ + | | + | cannot assign to this expression -error[E0070]: invalid left-hand side expression +error[E0070]: invalid left-hand side of assignment --> $DIR/bad-expr-lhs.rs:9:5 | LL | None = Some(3); - | ^^^^^^^^^^^^^^ left-hand of expression not valid + | ----^^^^^^^^^^ + | | + | cannot assign to this expression error: aborting due to 5 previous errors diff --git a/src/test/ui/error-codes/E0067.stderr b/src/test/ui/error-codes/E0067.stderr index 0334565840f8..526503798b3d 100644 --- a/src/test/ui/error-codes/E0067.stderr +++ b/src/test/ui/error-codes/E0067.stderr @@ -8,11 +8,13 @@ LL | LinkedList::new() += 1; | = note: an implementation of `std::ops::AddAssign` might be missing for `std::collections::LinkedList<_>` -error[E0067]: invalid left-hand side expression - --> $DIR/E0067.rs:4:5 +error[E0067]: invalid left-hand side of assignment + --> $DIR/E0067.rs:4:23 | LL | LinkedList::new() += 1; - | ^^^^^^^^^^^^^^^^^ invalid expression for left-hand side + | ----------------- ^^ + | | + | cannot assign to this expression error: aborting due to 2 previous errors diff --git a/src/test/ui/error-codes/E0070.stderr b/src/test/ui/error-codes/E0070.stderr index 845833bc82f7..1fb812d94672 100644 --- a/src/test/ui/error-codes/E0070.stderr +++ b/src/test/ui/error-codes/E0070.stderr @@ -1,14 +1,18 @@ -error[E0070]: invalid left-hand side expression +error[E0070]: invalid left-hand side of assignment --> $DIR/E0070.rs:6:5 | LL | SOME_CONST = 14; - | ^^^^^^^^^^^^^^^ left-hand of expression not valid + | ----------^^^^^ + | | + | cannot assign to this expression -error[E0070]: invalid left-hand side expression +error[E0070]: invalid left-hand side of assignment --> $DIR/E0070.rs:7:5 | LL | 1 = 3; - | ^^^^^ left-hand of expression not valid + | -^^^^ + | | + | cannot assign to this expression error[E0308]: mismatched types --> $DIR/E0070.rs:8:25 @@ -16,11 +20,13 @@ error[E0308]: mismatched types LL | some_other_func() = 4; | ^ expected `()`, found integer -error[E0070]: invalid left-hand side expression +error[E0070]: invalid left-hand side of assignment --> $DIR/E0070.rs:8:5 | LL | some_other_func() = 4; - | ^^^^^^^^^^^^^^^^^^^^^ left-hand of expression not valid + | -----------------^^^^ + | | + | cannot assign to this expression error: aborting due to 4 previous errors diff --git a/src/test/ui/issues/issue-13407.rs b/src/test/ui/issues/issue-13407.rs index 322e67cc1318..fa53d55f5b3d 100644 --- a/src/test/ui/issues/issue-13407.rs +++ b/src/test/ui/issues/issue-13407.rs @@ -4,7 +4,7 @@ mod A { fn main() { A::C = 1; - //~^ ERROR: invalid left-hand side expression + //~^ ERROR: invalid left-hand side of assignment //~| ERROR: mismatched types //~| ERROR: struct `C` is private } diff --git a/src/test/ui/issues/issue-13407.stderr b/src/test/ui/issues/issue-13407.stderr index 5a465cc533bb..05fd97b025f6 100644 --- a/src/test/ui/issues/issue-13407.stderr +++ b/src/test/ui/issues/issue-13407.stderr @@ -10,11 +10,13 @@ error[E0308]: mismatched types LL | A::C = 1; | ^ expected struct `A::C`, found integer -error[E0070]: invalid left-hand side expression +error[E0070]: invalid left-hand side of assignment --> $DIR/issue-13407.rs:6:5 | LL | A::C = 1; - | ^^^^^^^^ left-hand of expression not valid + | ----^^^^ + | | + | cannot assign to this expression error: aborting due to 3 previous errors diff --git a/src/test/ui/issues/issue-26093.rs b/src/test/ui/issues/issue-26093.rs index 7895c90068fe..c838515caf99 100644 --- a/src/test/ui/issues/issue-26093.rs +++ b/src/test/ui/issues/issue-26093.rs @@ -1,7 +1,9 @@ macro_rules! not_a_place { ($thing:expr) => { $thing = 42; - //~^ ERROR invalid left-hand side expression + //~^ ERROR invalid left-hand side of assignment + $thing += 42; + //~^ ERROR invalid left-hand side of assignment } } diff --git a/src/test/ui/issues/issue-26093.stderr b/src/test/ui/issues/issue-26093.stderr index 947c52f08d2e..48f72cef0a85 100644 --- a/src/test/ui/issues/issue-26093.stderr +++ b/src/test/ui/issues/issue-26093.stderr @@ -1,12 +1,28 @@ -error[E0070]: invalid left-hand side expression +error[E0070]: invalid left-hand side of assignment --> $DIR/issue-26093.rs:3:9 | LL | $thing = 42; - | ^^^^^^^^^^^ left-hand of expression not valid + | ^^^^^^^^^^^ ... LL | not_a_place!(99); - | ----------------- in this macro invocation + | ----------------- + | | | + | | cannot assign to this expression + | in this macro invocation -error: aborting due to previous error +error[E0067]: invalid left-hand side of assignment + --> $DIR/issue-26093.rs:5:16 + | +LL | $thing += 42; + | ^^ +... +LL | not_a_place!(99); + | ----------------- + | | | + | | cannot assign to this expression + | in this macro invocation -For more information about this error, try `rustc --explain E0070`. +error: aborting due to 2 previous errors + +Some errors have detailed explanations: E0067, E0070. +For more information about an error, try `rustc --explain E0067`. diff --git a/src/test/ui/issues/issue-34334.rs b/src/test/ui/issues/issue-34334.rs index 4457d71cbb4a..e34b5c9a0f47 100644 --- a/src/test/ui/issues/issue-34334.rs +++ b/src/test/ui/issues/issue-34334.rs @@ -3,7 +3,7 @@ fn main () { //~^ ERROR expected one of `,` or `>`, found `=` //~| ERROR expected value, found struct `Vec` //~| ERROR mismatched types - //~| ERROR invalid left-hand side expression + //~| ERROR invalid left-hand side of assignment //~| ERROR expected expression, found reserved identifier `_` //~| ERROR expected expression, found reserved identifier `_` let sr2: Vec<(u32, _, _)> = sr.iter().map(|(faction, th_sender, th_receiver)| {}).collect(); diff --git a/src/test/ui/issues/issue-34334.stderr b/src/test/ui/issues/issue-34334.stderr index fc90e0674cf5..e54f0c77cd97 100644 --- a/src/test/ui/issues/issue-34334.stderr +++ b/src/test/ui/issues/issue-34334.stderr @@ -35,11 +35,13 @@ LL | let sr: Vec<(u32, _, _) = vec![]; found struct `std::vec::Vec<_>` = note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info) -error[E0070]: invalid left-hand side expression +error[E0070]: invalid left-hand side of assignment --> $DIR/issue-34334.rs:2:13 | LL | let sr: Vec<(u32, _, _) = vec![]; - | ^^^^^^^^^^^^^^^^^^^^^^^^ left-hand of expression not valid + | ---------------^^^^^^^^^ + | | + | cannot assign to this expression error[E0599]: no method named `iter` found for type `()` in the current scope --> $DIR/issue-34334.rs:9:36 diff --git a/src/test/ui/type/type-check/assignment-expected-bool.rs b/src/test/ui/type/type-check/assignment-expected-bool.rs index 03830fea062c..191939bdb705 100644 --- a/src/test/ui/type/type-check/assignment-expected-bool.rs +++ b/src/test/ui/type/type-check/assignment-expected-bool.rs @@ -30,5 +30,5 @@ fn main() { // A test to check that not expecting `bool` behaves well: let _: usize = 0 = 0; //~^ ERROR mismatched types [E0308] - //~| ERROR invalid left-hand side expression [E0070] + //~| ERROR invalid left-hand side of assignment [E0070] } diff --git a/src/test/ui/type/type-check/assignment-expected-bool.stderr b/src/test/ui/type/type-check/assignment-expected-bool.stderr index 9a1cf5b25625..bbd961f84501 100644 --- a/src/test/ui/type/type-check/assignment-expected-bool.stderr +++ b/src/test/ui/type/type-check/assignment-expected-bool.stderr @@ -97,11 +97,13 @@ LL | || (0 = 0); | expected `bool`, found `()` | help: try comparing for equality: `0 == 0` -error[E0070]: invalid left-hand side expression +error[E0070]: invalid left-hand side of assignment --> $DIR/assignment-expected-bool.rs:31:20 | LL | let _: usize = 0 = 0; - | ^^^^^ left-hand of expression not valid + | -^^^^ + | | + | cannot assign to this expression error[E0308]: mismatched types --> $DIR/assignment-expected-bool.rs:31:20 diff --git a/src/test/ui/type/type-check/assignment-in-if.rs b/src/test/ui/type/type-check/assignment-in-if.rs index 77b122b0a794..8da7b32b47b1 100644 --- a/src/test/ui/type/type-check/assignment-in-if.rs +++ b/src/test/ui/type/type-check/assignment-in-if.rs @@ -26,7 +26,7 @@ fn main() { //~^ ERROR mismatched types println!("{}", x); } - // "invalid left-hand side expression" error is suppresed + // "invalid left-hand side of assignment" error is suppresed if 3 = x { //~^ ERROR mismatched types println!("{}", x);