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 } => {
|
infer::CheckAssociatedTypeBounds { impl_item_def_id, trait_item_def_id, parent } => {
|
||||||
let mut err = self.report_concrete_failure(*parent, sub, sup);
|
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 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());
|
let item_name = self.tcx.item_name(impl_item_def_id.to_def_id());
|
||||||
err.span_label(
|
err.span_label(
|
||||||
trait_item_span,
|
trait_item_span,
|
||||||
format!("definition of `{}` from trait", item_name),
|
format!("definition of `{}` from trait", item_name),
|
||||||
);
|
);
|
||||||
|
}
|
||||||
|
|
||||||
self.suggest_copy_trait_method_bounds(
|
self.suggest_copy_trait_method_bounds(
|
||||||
trait_item_def_id,
|
trait_item_def_id,
|
||||||
impl_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