Change:
In that commit, go to folder and run (tested in nightly, stable 1.69 and stable 1.70) : <details<summary<strongBacktrace</strong</summary<p</p</details
This is causing us to leak placeholders into implied bounds. Minimized:

Discussion:
use rustc_infer::infer::InferCtxt; use rustc_middle::mir::ConstraintCategory; use rustc_middle::traits::query::OutlivesBound; <del> use rustc_middle::ty::{self, RegionVid, Ty}; </del> <ins> use rustc_middle::ty::{self, RegionVid, Ty, TypeVisitableExt}; </ins> use rustc_span::{ErrorGuaranteed, Span, DUMMY_SP}; use rustc_trait_selection::traits::query::type_op::{self, TypeOp}; use std::rc::Rc;

.map_err(|_: ErrorGuaranteed| debug!("failed to compute implied bounds {:?}", ty)) .ok()?; debug!(?bounds, ?constraints); <ins> // Because of #109628, we may have unexpected placeholders. Ignore them! // FIXME(#109628): panic in this case once the issue is fixed. let bounds = bounds.into_iter().filter(|bound| !bound.has_placeholders()); </ins> self.add_outlives_bounds(bounds); constraints }

}; let mut constraints = QueryRegionConstraints::default(); <del> let Ok(InferOk { value, obligations }) = self </del> <ins> let Ok(InferOk { value: mut bounds, obligations }) = self </ins> .instantiate_nll_query_response_and_region_obligations( &ObligationCause::dummy(), param_env,

}; assert_eq!(&obligations, &[]); <ins> // Because of #109628, we may have unexpected placeholders. Ignore them! // FIXME(#109628): panic in this case once the issue is fixed. bounds.retain(|bound| !bound.has_placeholders()); </ins> if !constraints.is_empty() { let span = self.tcx.def_span(body_id);

} }; <del> value </del> <ins> bounds </ins> } fn implied_bounds_tys(

<ins> error[E0477]: the type `&'lt u8` does not fulfill the required lifetime --> $DIR/normalization-placeholder-leak.rs:31:40 | LL |     fn test_lifetime<'lt, T: Trait>(_: Foo<&'lt u8>) {} |                                        ^^^^^^^^^^^^ error[E0477]: the type `<T as AnotherTrait>::Ty2<'lt>` does not fulfill the required lifetime --> $DIR/normalization-placeholder-leak.rs:36:44 | LL |     fn test_alias<'lt, T: AnotherTrait>(_: Foo<T::Ty2::<'lt>>) {} |                                            ^^^^^^^^^^^^^^^^^^ error: aborting due to 2 previous errors For more information about this error, try `rustc --explain E0477`. </ins>

<ins> // Because of #109628, when we compute the implied bounds from `Foo<X>`, // we incorrectly get `X: placeholder('x)`. // Make sure we ignore these bogus bounds and not use them for anything useful. // // revisions: fail pass // [fail] check-fail // [pass] check-pass trait Trait { type Ty<'a> where Self: 'a; } impl<T> Trait for T { type Ty<'a> = () where Self: 'a; } struct Foo<T: Trait>(T) where for<'x> T::Ty<'x>: Sized; trait AnotherTrait { type Ty2<'a>: 'a; } #[cfg(fail)] mod fail { use super::*; // implied_bound: `'lt: placeholder('x)`. // don't use the bound to prove `'lt: 'static`. fn test_lifetime<'lt, T: Trait>(_: Foo<&'lt u8>) {} //[fail]~^ ERROR `&'lt u8` does not fulfill the required lifetime // implied bound: `T::Ty2<'lt>: placeholder('x)`. // don't use the bound to prove `T::Ty2<'lt>: 'static`. fn test_alias<'lt, T: AnotherTrait>(_: Foo<T::Ty2::<'lt>>) {} //[fail]~^ ERROR `<T as AnotherTrait>::Ty2<'lt>` does not fulfill the required lifetime } mod pass { use super::*; // implied_bound: 'static: placeholder('x). // don't ice. fn test_lifetime<T: Trait>(_: Foo<&'static u8>) {} // implied bound: T::Ty2<'static>: placeholder('x). // don't add the bound to the environment, // otherwise we would fail to infer a value for `'_`. fn test_alias<T: AnotherTrait>(_: Foo<T::Ty2::<'static>>) { None::<&'static T::Ty2<'_>>; } } fn main() {} </ins>