Also suggest dereferencing LHS when both &mut T and T are valid binop LHS

This commit is contained in:
Michael Goulet 2022-09-03 19:13:17 +00:00
parent 771456264b
commit 98f4b20abc
3 changed files with 43 additions and 0 deletions

View File

@ -70,6 +70,14 @@ pub fn check_binop_assign(
.is_err()
{
err.downgrade_to_delayed_bug();
} else {
// Otherwise, it's valid to suggest dereferencing the LHS here.
err.span_suggestion_verbose(
lhs.span.shrink_to_lo(),
"consider dereferencing the left-hand side of this operation",
"*",
Applicability::MaybeIncorrect,
);
}
}
}

View File

@ -0,0 +1,19 @@
// issue #101376
use std::ops::AddAssign;
struct Foo;
impl AddAssign<()> for Foo {
fn add_assign(&mut self, _: ()) {}
}
impl AddAssign<()> for &mut Foo {
fn add_assign(&mut self, _: ()) {}
}
fn main() {
(&mut Foo) += ();
//~^ ERROR invalid left-hand side of assignment
//~| NOTE cannot assign to this expression
//~| HELP consider dereferencing the left-hand side of this operation
}

View File

@ -0,0 +1,16 @@
error[E0067]: invalid left-hand side of assignment
--> $DIR/assign-non-lval-needs-deref.rs:15:16
|
LL | (&mut Foo) += ();
| ---------- ^^
| |
| cannot assign to this expression
|
help: consider dereferencing the left-hand side of this operation
|
LL | *(&mut Foo) += ();
| +
error: aborting due to previous error
For more information about this error, try `rustc --explain E0067`.