Rollup merge of #84808 - estebank:issue-84769, r=petrochenkov
Account for unsatisfied bounds in E0599 Fix #84769, follow up to #84499, #83667.
This commit is contained in:
commit
db77072a25
@ -579,6 +579,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
let mut restrict_type_params = false;
|
let mut restrict_type_params = false;
|
||||||
|
let mut unsatisfied_bounds = false;
|
||||||
if !unsatisfied_predicates.is_empty() {
|
if !unsatisfied_predicates.is_empty() {
|
||||||
let def_span = |def_id| {
|
let def_span = |def_id| {
|
||||||
self.tcx.sess.source_map().guess_head_span(self.tcx.def_span(def_id))
|
self.tcx.sess.source_map().guess_head_span(self.tcx.def_span(def_id))
|
||||||
@ -739,6 +740,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||||||
err.note(&format!(
|
err.note(&format!(
|
||||||
"the following trait bounds were not satisfied:\n{bound_list}"
|
"the following trait bounds were not satisfied:\n{bound_list}"
|
||||||
));
|
));
|
||||||
|
unsatisfied_bounds = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -752,6 +754,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||||||
source,
|
source,
|
||||||
out_of_scope_traits,
|
out_of_scope_traits,
|
||||||
&unsatisfied_predicates,
|
&unsatisfied_predicates,
|
||||||
|
unsatisfied_bounds,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -984,9 +987,10 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||||||
source: SelfSource<'tcx>,
|
source: SelfSource<'tcx>,
|
||||||
valid_out_of_scope_traits: Vec<DefId>,
|
valid_out_of_scope_traits: Vec<DefId>,
|
||||||
unsatisfied_predicates: &[(ty::Predicate<'tcx>, Option<ty::Predicate<'tcx>>)],
|
unsatisfied_predicates: &[(ty::Predicate<'tcx>, Option<ty::Predicate<'tcx>>)],
|
||||||
|
unsatisfied_bounds: bool,
|
||||||
) {
|
) {
|
||||||
let mut alt_rcvr_sugg = false;
|
let mut alt_rcvr_sugg = false;
|
||||||
if let SelfSource::MethodCall(rcvr) = source {
|
if let (SelfSource::MethodCall(rcvr), false) = (source, unsatisfied_bounds) {
|
||||||
debug!(?span, ?item_name, ?rcvr_ty, ?rcvr);
|
debug!(?span, ?item_name, ?rcvr_ty, ?rcvr);
|
||||||
let skippable = [
|
let skippable = [
|
||||||
self.tcx.lang_items().clone_trait(),
|
self.tcx.lang_items().clone_trait(),
|
||||||
|
@ -6,4 +6,11 @@ fn next_u64() -> u64 {
|
|||||||
h.finish() //~ ERROR no method named `finish` found for struct `DefaultHasher`
|
h.finish() //~ ERROR no method named `finish` found for struct `DefaultHasher`
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {}
|
trait Bar {}
|
||||||
|
impl Bar for String {}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let s = String::from("hey");
|
||||||
|
let x: &dyn Bar = &s;
|
||||||
|
x.as_ref(); //~ ERROR the method `as_ref` exists for reference `&dyn Bar`, but its trait bounds
|
||||||
|
}
|
||||||
|
@ -15,6 +15,22 @@ help: the following trait is implemented but not in scope; perhaps add a `use` f
|
|||||||
LL | use std::hash::Hasher;
|
LL | use std::hash::Hasher;
|
||||||
|
|
|
|
||||||
|
|
||||||
error: aborting due to previous error
|
error[E0599]: the method `as_ref` exists for reference `&dyn Bar`, but its trait bounds were not satisfied
|
||||||
|
--> $DIR/import-trait-for-method-call.rs:15:7
|
||||||
|
|
|
||||||
|
LL | trait Bar {}
|
||||||
|
| --------- doesn't satisfy `dyn Bar: AsRef<_>`
|
||||||
|
...
|
||||||
|
LL | x.as_ref();
|
||||||
|
| ^^^^^^ method cannot be called on `&dyn Bar` due to unsatisfied trait bounds
|
||||||
|
|
|
||||||
|
= note: the following trait bounds were not satisfied:
|
||||||
|
`dyn Bar: AsRef<_>`
|
||||||
|
which is required by `&dyn Bar: AsRef<_>`
|
||||||
|
= help: items from traits can only be used if the trait is implemented and in scope
|
||||||
|
= note: the following trait defines an item `as_ref`, perhaps you need to implement it:
|
||||||
|
candidate #1: `AsRef`
|
||||||
|
|
||||||
|
error: aborting due to 2 previous errors
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0599`.
|
For more information about this error, try `rustc --explain E0599`.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user