1
Fork 0

Skip reporting item name when checking RPITIT GAT's associated type bounds hold

This commit is contained in:
Michael Goulet 2023-07-27 22:04:19 +00:00
parent 9339f446a5
commit 0ae0643a53
3 changed files with 67 additions and 6 deletions

View file

@ -243,12 +243,18 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
}
infer::CheckAssociatedTypeBounds { impl_item_def_id, trait_item_def_id, parent } => {
let mut err = self.report_concrete_failure(*parent, sub, sup);
// Don't mention the item name if it's an RPITIT, since that'll just confuse
// folks.
if !self.tcx.is_impl_trait_in_trait(impl_item_def_id.to_def_id()) {
let trait_item_span = self.tcx.def_span(trait_item_def_id);
let item_name = self.tcx.item_name(impl_item_def_id.to_def_id());
err.span_label(
trait_item_span,
format!("definition of `{}` from trait", item_name),
);
}
self.suggest_copy_trait_method_bounds(
trait_item_def_id,
impl_item_def_id,

View file

@ -0,0 +1,25 @@
// issue: 114145
#![feature(return_position_impl_trait_in_trait)]
trait Iterable {
type Item<'a>
where
Self: 'a;
fn iter(&self) -> impl '_ + Iterator<Item = Self::Item<'_>>;
}
impl<'a, I: 'a + Iterable> Iterable for &'a I {
type Item<'b> = I::Item<'a>
where
'b: 'a;
//~^ ERROR impl has stricter requirements than trait
fn iter(&self) -> impl 'a + Iterator<Item = I::Item<'a>> {
//~^ ERROR the type `&'a I` does not fulfill the required lifetime
(*self).iter()
}
}
fn main() {}

View file

@ -0,0 +1,30 @@
error[E0276]: impl has stricter requirements than trait
--> $DIR/bad-item-bound-within-rpitit.rs:16:13
|
LL | type Item<'a>
| ------------- definition of `Item` from trait
...
LL | 'b: 'a;
| ^^ impl has extra requirement `'b: 'a`
|
help: copy the `where` clause predicates from the trait
|
LL | where Self: 'b;
| ~~~~~~~~~~~~~~
error[E0477]: the type `&'a I` does not fulfill the required lifetime
--> $DIR/bad-item-bound-within-rpitit.rs:19:5
|
LL | fn iter(&self) -> impl 'a + Iterator<Item = I::Item<'a>> {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
note: type must outlive the anonymous lifetime as defined here
--> $DIR/bad-item-bound-within-rpitit.rs:10:28
|
LL | fn iter(&self) -> impl '_ + Iterator<Item = Self::Item<'_>>;
| ^^
error: aborting due to 2 previous errors
Some errors have detailed explanations: E0276, E0477.
For more information about an error, try `rustc --explain E0276`.