Rollup merge of #73382 - Aaron1011:fix/self-receiver-candidates, r=petrochenkov
Only display other method receiver candidates if they actually apply Previously, we would suggest `Box<Self>` as a valid receiver, even if method resolution only succeeded due to an autoderef (e.g. to `&self`)
This commit is contained in:
commit
b443a107f8
@ -888,12 +888,18 @@ fn report_extended_method_error(
|
||||
rcvr,
|
||||
probe::ProbeScope::AllTraits,
|
||||
) {
|
||||
debug!("try_alt_rcvr: pick candidate {:?}", pick);
|
||||
// Make sure the method is defined for the *actual* receiver:
|
||||
// we don't want to treat `Box<Self>` as a receiver if
|
||||
// it only works because of an autoderef to `&self`
|
||||
if pick.autoderefs == 0 {
|
||||
err.span_label(
|
||||
pick.item.ident.span,
|
||||
&format!("the method is available for `{}` here", new_rcvr_t),
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
if let Some(mut err) = self.report_method_error(
|
||||
|
@ -49,14 +49,6 @@ LL | use foo::Bar;
|
||||
error[E0599]: no method named `method` found for struct `std::rc::Rc<&mut std::boxed::Box<&char>>` in the current scope
|
||||
--> $DIR/no-method-suggested-traits.rs:32:43
|
||||
|
|
||||
LL | fn method(&self) {}
|
||||
| ------
|
||||
| |
|
||||
| the method is available for `std::boxed::Box<std::rc::Rc<&mut std::boxed::Box<&char>>>` here
|
||||
| the method is available for `std::pin::Pin<std::rc::Rc<&mut std::boxed::Box<&char>>>` here
|
||||
| the method is available for `std::sync::Arc<std::rc::Rc<&mut std::boxed::Box<&char>>>` here
|
||||
| the method is available for `std::rc::Rc<std::rc::Rc<&mut std::boxed::Box<&char>>>` here
|
||||
...
|
||||
LL | std::rc::Rc::new(&mut Box::new(&'a')).method();
|
||||
| ^^^^^^ method not found in `std::rc::Rc<&mut std::boxed::Box<&char>>`
|
||||
|
|
||||
@ -84,16 +76,6 @@ error[E0599]: no method named `method` found for struct `std::rc::Rc<&mut std::b
|
||||
LL | std::rc::Rc::new(&mut Box::new(&1i32)).method();
|
||||
| ^^^^^^ method not found in `std::rc::Rc<&mut std::boxed::Box<&i32>>`
|
||||
|
|
||||
::: $DIR/auxiliary/no_method_suggested_traits.rs:8:12
|
||||
|
|
||||
LL | fn method(&self) {}
|
||||
| ------
|
||||
| |
|
||||
| the method is available for `std::boxed::Box<std::rc::Rc<&mut std::boxed::Box<&i32>>>` here
|
||||
| the method is available for `std::pin::Pin<std::rc::Rc<&mut std::boxed::Box<&i32>>>` here
|
||||
| the method is available for `std::sync::Arc<std::rc::Rc<&mut std::boxed::Box<&i32>>>` here
|
||||
| the method is available for `std::rc::Rc<std::rc::Rc<&mut std::boxed::Box<&i32>>>` here
|
||||
|
|
||||
= help: items from traits can only be used if the trait is in scope
|
||||
help: the following trait is implemented but not in scope; perhaps add a `use` for it:
|
||||
|
|
||||
|
@ -20,13 +20,6 @@ error[E0599]: no method named `b` found for struct `S` in the current scope
|
||||
LL | struct S;
|
||||
| --------- method `b` not found for this
|
||||
...
|
||||
LL | fn b(&self) { }
|
||||
| -
|
||||
| |
|
||||
| the method is available for `std::boxed::Box<S>` here
|
||||
| the method is available for `std::sync::Arc<S>` here
|
||||
| the method is available for `std::rc::Rc<S>` here
|
||||
...
|
||||
LL | S.b();
|
||||
| ^ method not found in `S`
|
||||
|
|
||||
|
Loading…
Reference in New Issue
Block a user