Deeply normalize obligations in refining_impl_trait

This commit is contained in:
Michael Goulet 2024-02-28 16:09:06 +00:00
parent ef324565d0
commit 75e15f7cf4
3 changed files with 38 additions and 5 deletions

View File

@ -136,11 +136,15 @@ pub(super) fn check_refining_return_position_impl_trait_in_trait<'tcx>(
// 1. Project the RPITIT projections from the trait to the opaques on the impl, // 1. Project the RPITIT projections from the trait to the opaques on the impl,
// which means that they don't need to be mapped manually. // which means that they don't need to be mapped manually.
// //
// 2. Project any other projections that show up in the bound. That makes sure that // 2. Deeply normalize any other projections that show up in the bound. That makes sure
// we don't consider `tests/ui/async-await/in-trait/async-associated-types.rs` // that we don't consider `tests/ui/async-await/in-trait/async-associated-types.rs`
// to be refining. // or `tests/ui/impl-trait/in-trait/refine-normalize.rs` to be refining.
let (trait_bounds, impl_bounds) = let Ok((trait_bounds, impl_bounds)) =
ocx.normalize(&ObligationCause::dummy(), param_env, (trait_bounds, impl_bounds)); ocx.deeply_normalize(&ObligationCause::dummy(), param_env, (trait_bounds, impl_bounds))
else {
tcx.dcx().delayed_bug("encountered errors when checking RPITIT refinement (selection)");
return;
};
// Since we've normalized things, we need to resolve regions, since we'll // Since we've normalized things, we need to resolve regions, since we'll
// possibly have introduced region vars during projection. We don't expect // possibly have introduced region vars during projection. We don't expect

View File

@ -107,6 +107,15 @@ pub fn normalize<T: TypeFoldable<TyCtxt<'tcx>>>(
self.register_infer_ok_obligations(infer_ok) self.register_infer_ok_obligations(infer_ok)
} }
pub fn deeply_normalize<T: TypeFoldable<TyCtxt<'tcx>>>(
&self,
cause: &ObligationCause<'tcx>,
param_env: ty::ParamEnv<'tcx>,
value: T,
) -> Result<T, Vec<FulfillmentError<'tcx>>> {
self.infcx.at(cause, param_env).deeply_normalize(value, &mut **self.engine.borrow_mut())
}
/// Makes `expected <: actual`. /// Makes `expected <: actual`.
pub fn eq_exp<T>( pub fn eq_exp<T>(
&self, &self,

View File

@ -0,0 +1,20 @@
//@ check-pass
//@ edition: 2021
//@ revisions: current next
//@[next] compile-flags: -Znext-solver
#![deny(refining_impl_trait)]
pub trait Foo {
type Item;
fn hello() -> impl Iterator<Item = Self::Item>;
}
impl Foo for () {
type Item = ();
fn hello() -> impl Iterator<Item = ()> { [()].into_iter() }
}
fn main() {}