Deeply normalize obligations in refining_impl_trait
This commit is contained in:
parent
ef324565d0
commit
75e15f7cf4
@ -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
|
||||||
|
@ -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,
|
||||||
|
20
tests/ui/impl-trait/in-trait/refine-normalize.rs
Normal file
20
tests/ui/impl-trait/in-trait/refine-normalize.rs
Normal 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() {}
|
Loading…
Reference in New Issue
Block a user