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
minimized
Bisected to :sweatsmile:

Discussion:
hir_analysis_invalid_union_field_sugg = wrap the field type in `ManuallyDrop<...>` <ins> hir_analysis_late_bound_const_in_apit = `impl Trait` can only mention const parameters from an fn or impl .label = const parameter declared here hir_analysis_late_bound_lifetime_in_apit = `impl Trait` can only mention lifetimes from an fn or impl .label = lifetime declared here hir_analysis_late_bound_type_in_apit = `impl Trait` can only mention type parameters from an fn or impl .label = type parameter declared here </ins> hir_analysis_lifetimes_or_bounds_mismatch_on_trait = lifetime parameters or bounds on {$item_kind} `{$ident}` do not match the trait declaration .label = lifetimes do not match {$item_kind} in trait

Scope::Binder { where_bound_origin: Some(hir::PredicateOrigin::ImplTrait), .. } => { <del> let mut err = self.tcx.sess.struct_span_err( lifetime_ref.ident.span, "`impl Trait` can only mention lifetimes bound at the fn or impl level", ); err.span_note(self.tcx.def_span(region_def_id), "lifetime declared here"); err.emit(); </del> <ins> self.tcx.sess.emit_err(errors::LateBoundInApit::Lifetime { span: lifetime_ref.ident.span, param_span: self.tcx.def_span(region_def_id), }); </ins> return; } Scope::Root { .. } => break,

let mut late_depth = 0; let mut scope = self.scope; let mut crossed_anon_const = false; let result = loop { match *scope { Scope::Body { s, .. } => {

return; } <ins> // We may fail to resolve higher-ranked ty/const vars that are mentioned by APIT. // AST-based resolution does not care for impl-trait desugaring, which are the // responsibility of lowering. This may create a mismatch between the resolution // AST found (`param_def_id`) which points to HRTB, and what HIR allows. // ``` // fn foo(x: impl for<T> Trait<Assoc = impl Trait2<T>>) {} // ``` // // In such case, walk back the binders to diagnose it properly. let mut scope = self.scope; loop { match *scope { Scope::Binder { where_bound_origin: Some(hir::PredicateOrigin::ImplTrait), .. } => { let guar = self.tcx.sess.emit_err(match self.tcx.def_kind(param_def_id) { DefKind::TyParam => errors::LateBoundInApit::Type { span: self.tcx.hir().span(hir_id), param_span: self.tcx.def_span(param_def_id), }, DefKind::ConstParam => errors::LateBoundInApit::Const { span: self.tcx.hir().span(hir_id), param_span: self.tcx.def_span(param_def_id), }, kind => { bug!("unexpected def-kind: {}", kind.descr(param_def_id.to_def_id())) } }); self.map.defs.insert(hir_id, ResolvedArg::Error(guar)); return; } Scope::Root { .. } => break, Scope::Binder { s, .. } | Scope::Body { s, .. } | Scope::Elision { s, .. } | Scope::ObjectLifetimeDefault { s, .. } | Scope::Supertrait { s, .. } | Scope::TraitRefBoundary { s, .. } | Scope::AnonConstBoundary { s } => { scope = s; } } } </ins> self.tcx.sess.delay_span_bug( self.tcx.hir().span(hir_id), format!("could not resolve {param_def_id:?}"),

param_span: Span, }, } <ins> #[derive(Diagnostic)] pub(crate) enum LateBoundInApit { #[diag(hir_analysis_late_bound_type_in_apit)] Type { #[primary_span] span: Span, #[label] param_span: Span, }, #[diag(hir_analysis_late_bound_const_in_apit)] Const { #[primary_span] span: Span, #[label] param_span: Span, }, #[diag(hir_analysis_late_bound_lifetime_in_apit)] Lifetime { #[primary_span] span: Span, #[label] param_span: Span, }, } </ins>

} fn test_argument_position(x: impl for<'a> Trait<'a, Assoc = impl Copy + 'a>) {} <del> //~^ ERROR `impl Trait` can only mention lifetimes bound at the fn or impl level </del> <ins> //~^ ERROR `impl Trait` can only mention lifetimes from an fn or impl </ins> fn main() {}

<del> error: `impl Trait` can only mention lifetimes bound at the fn or impl level </del> <ins> error: `impl Trait` can only mention lifetimes from an fn or impl </ins> --> $DIR/universal_wrong_hrtb.rs:5:73 | LL | fn test_argument_position(x: impl for<'a> Trait<'a, Assoc = impl Copy + 'a>) {} <del> |                                                                         ^^ | note: lifetime declared here --> $DIR/universal_wrong_hrtb.rs:5:39 | LL | fn test_argument_position(x: impl for<'a> Trait<'a, Assoc = impl Copy + 'a>) {} |                                       ^^ </del> <ins> |                                       -- lifetime declared here         ^^ </ins> error: aborting due to previous error

<ins> #![feature(non_lifetime_binders)] //~^ WARN the feature `non_lifetime_binders` is incomplete trait Trait<Input> { type Assoc; } fn uwu(_: impl for<T> Trait<(), Assoc = impl Trait<T>>) {} //~^ ERROR `impl Trait` can only mention type parameters from an fn or impl fn main() {} </ins>

<ins> warning: the feature `non_lifetime_binders` is incomplete and may not be safe to use and/or cause compiler crashes --> $DIR/nested-apit-mentioning-outer-bound-var.rs:1:12 | LL | #![feature(non_lifetime_binders)] |            ^^^^^^^^^^^^^^^^^^^^ | = note: see issue #108185 <https://github.com/rust-lang/rust/issues/108185> for more information = note: `#[warn(incomplete_features)]` on by default error: `impl Trait` can only mention type parameters from an fn or impl --> $DIR/nested-apit-mentioning-outer-bound-var.rs:8:52 | LL | fn uwu(_: impl for<T> Trait<(), Assoc = impl Trait<T>>) {} |                    - type parameter declared here  ^ error: aborting due to previous error; 1 warning emitted </ins>