Change:
<!-- Thank you for finding an Internal Compiler Error! If possible, try to provide a minimal verifiable example. You can read "Rust Bug Minimization Patterns" for how to create smaller examples. --<!-- If you're using the stable version of the compiler, you should also check if the bug also exists in the beta or nightly versions. --: <!-- Include a backtrace in the code block by setting in your environment. E.g. . --<details<summary<strongBacktrace</strong</summary<p</p</details
cc
This brings up the question again with whether or not we should just feed itemname for RPITITs. I can't recall the other issues where this was a problem, but perhaps we should just do that and revert all the previous mitigations we introduced due to the fact that itemname is missing for RPITITs.
Just pushed a fix, I think you were always right about not feeding item_name, whenever you try to call it for RPITITs we should have never tried because the message we are trying to fill won't make any sense.

Discussion:
"impl has stricter requirements than trait" ); <del> if let Some(span) = self.tcx.hir().span_if_local(trait_item_def_id) { let item_name = self.tcx.item_name(impl_item_def_id.to_def_id()); err.span_label(span, format!("definition of `{}` from trait", item_name)); </del> <ins> if !self.tcx.is_impl_trait_in_trait(trait_item_def_id) { if let Some(span) = self.tcx.hir().span_if_local(trait_item_def_id) { let item_name = self.tcx.item_name(impl_item_def_id.to_def_id()); err.span_label(span, format!("definition of `{}` from trait", item_name)); } </ins> } err.span_label(error_span, format!("impl has extra requirement {}", requirement));

<ins> error[E0726]: implicit elided lifetime not allowed here --> $DIR/return-not-existing-pair.rs:12:20 | LL | impl<'a, 'b, T, U> MyTrait<T> for U { |                    ^^^^^^^^^^ expected lifetime parameters | help: indicate the anonymous lifetimes | LL | impl<'a, 'b, T, U> MyTrait<'_, '_, T> for U { |                            +++++++ error[E0412]: cannot find type `ConnImpl` in this scope --> $DIR/return-not-existing-pair.rs:8:48 | LL |     async fn foo(&'a self, key: &'b T) -> (&'a ConnImpl, &'b T); |                                                ^^^^^^^^ not found in this scope error[E0186]: method `foo` has a `&self` declaration in the trait, but not in the impl --> $DIR/return-not-existing-pair.rs:14:5 | LL |     async fn foo(&'a self, key: &'b T) -> (&'a ConnImpl, &'b T); |     ------------------------------------------------------------ `&self` used in trait ... LL |     async fn foo(_: T) -> (&'a U, &'b T) {} |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `&self` in impl error[E0308]: mismatched types --> $DIR/return-not-existing-pair.rs:14:42 | LL |     async fn foo(_: T) -> (&'a U, &'b T) {} |                                          ^^ expected `(&U, &T)`, found `()` | = note:  expected tuple `(&'a U, &'b T)` found unit type `()` error: aborting due to 4 previous errors Some errors have detailed explanations: E0186, E0308, E0412, E0726. For more information about an error, try `rustc --explain E0186`. </ins>

<ins> // edition:2021 // [next] compile-flags: -Zlower-impl-trait-in-trait-to-assoc-ty // revisions: current next #![feature(async_fn_in_trait)] trait MyTrait<'a, 'b, T> { async fn foo(&'a self, key: &'b T) -> (&'a ConnImpl, &'b T); //~^ ERROR: cannot find type `ConnImpl` in this scope [E0412] } impl<'a, 'b, T, U> MyTrait<T> for U { //~^ ERROR: implicit elided lifetime not allowed here [E0726] async fn foo(_: T) -> (&'a U, &'b T) {} //~^ ERROR: method `foo` has a `&self` declaration in the trait, but not in the impl [E0186] //~| ERROR: mismatched types [E0308] } fn main() {} </ins>