Rollup merge of #110550 - compiler-errors:deref-on-binop-rhs, r=wesleywiser

Suggest deref on comparison binop RHS even if type is not Copy

Fixes #110500
This commit is contained in:
Matthias Krüger 2023-04-26 18:51:41 +02:00 committed by GitHub
commit 8e6fffcbaa
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 29 additions and 1 deletions

View File

@ -1508,6 +1508,12 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
// FIXME(compiler-errors): We can actually do this if the checked_ty is // FIXME(compiler-errors): We can actually do this if the checked_ty is
// `steps` layers of boxes, not just one, but this is easier and most likely. // `steps` layers of boxes, not just one, but this is easier and most likely.
|| (checked_ty.is_box() && steps == 1) || (checked_ty.is_box() && steps == 1)
// We can always deref a binop that takes its arguments by ref.
|| matches!(
self.tcx.hir().get_parent(expr.hir_id),
hir::Node::Expr(hir::Expr { kind: hir::ExprKind::Binary(op, ..), .. })
if !op.node.is_by_value()
)
{ {
let deref_kind = if checked_ty.is_box() { let deref_kind = if checked_ty.is_box() {
"unboxing the value" "unboxing the value"

View File

@ -72,4 +72,13 @@ fn main() {
} else { } else {
&0 &0
}; };
#[derive(PartialEq, Eq)]
struct Foo;
let foo = Foo;
let bar = &Foo;
if foo == bar {
//~^ ERROR mismatched types
}
} }

View File

@ -175,6 +175,19 @@ LL | || };
| |_____`if` and `else` have incompatible types | |_____`if` and `else` have incompatible types
| expected `i32`, found `&{integer}` | expected `i32`, found `&{integer}`
error: aborting due to 13 previous errors error[E0308]: mismatched types
--> $DIR/deref-suggestion.rs:81:15
|
LL | if foo == bar {
| --- ^^^ expected `Foo`, found `&Foo`
| |
| expected because this is `Foo`
|
help: consider dereferencing the borrow
|
LL | if foo == *bar {
| +
error: aborting due to 14 previous errors
For more information about this error, try `rustc --explain E0308`. For more information about this error, try `rustc --explain E0308`.