mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-23 07:14:28 +00:00
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:
commit
8e6fffcbaa
@ -1508,6 +1508,12 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
// 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.
|
||||
|| (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() {
|
||||
"unboxing the value"
|
||||
|
@ -72,4 +72,13 @@ fn main() {
|
||||
} else {
|
||||
&0
|
||||
};
|
||||
|
||||
#[derive(PartialEq, Eq)]
|
||||
struct Foo;
|
||||
let foo = Foo;
|
||||
let bar = &Foo;
|
||||
|
||||
if foo == bar {
|
||||
//~^ ERROR mismatched types
|
||||
}
|
||||
}
|
||||
|
@ -175,6 +175,19 @@ LL | || };
|
||||
| |_____`if` and `else` have incompatible types
|
||||
| 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`.
|
||||
|
Loading…
Reference in New Issue
Block a user