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:
Ralf Jung 2021-05-05 17:52:23 +02:00 committed by GitHub
commit db77072a25
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 30 additions and 3 deletions

View File

@ -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(),

View File

@ -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
}

View File

@ -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`.