Skip reporting item name when checking RPITIT GAT's associated type bounds hold
This commit is contained in:
parent
9339f446a5
commit
0ae0643a53
3 changed files with 67 additions and 6 deletions
|
@ -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,
|
||||
|
|
25
tests/ui/impl-trait/in-trait/bad-item-bound-within-rpitit.rs
Normal file
25
tests/ui/impl-trait/in-trait/bad-item-bound-within-rpitit.rs
Normal 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() {}
|
|
@ -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`.
|
Loading…
Add table
Add a link
Reference in a new issue