struct ReplaceAliasWithInfer<'me, 'a, D, I>where
D: SolverDelegate<Interner = I>,
I: Interner,{
ecx: &'me mut EvalCtxt<'a, D>,
param_env: I::ParamEnv,
cache: HashMap<I::Ty, I::Ty>,
}Expand description
Eagerly replace aliases with inference variables, emitting AliasRelate
goals, used when adding goals to the EvalCtxt. We compute the
AliasRelate goals before evaluating the actual goal to get all the
constraints we can.
This is a performance optimization to more eagerly detect cycles during trait solving. See tests/ui/traits/next-solver/cycles/cycle-modulo-ambig-aliases.rs.
Fields§
§ecx: &'me mut EvalCtxt<'a, D>§param_env: I::ParamEnv§cache: HashMap<I::Ty, I::Ty>Implementations§
source§impl<'me, 'a, D, I> ReplaceAliasWithInfer<'me, 'a, D, I>where
D: SolverDelegate<Interner = I>,
I: Interner,
impl<'me, 'a, D, I> ReplaceAliasWithInfer<'me, 'a, D, I>where
D: SolverDelegate<Interner = I>,
I: Interner,
Trait Implementations§
source§impl<D, I> TypeFolder<I> for ReplaceAliasWithInfer<'_, '_, D, I>where
D: SolverDelegate<Interner = I>,
I: Interner,
impl<D, I> TypeFolder<I> for ReplaceAliasWithInfer<'_, '_, D, I>where
D: SolverDelegate<Interner = I>,
I: Interner,
fn cx(&self) -> I
fn fold_ty(&mut self, ty: I::Ty) -> I::Ty
fn fold_const(&mut self, ct: I::Const) -> I::Const
fn fold_predicate(&mut self, predicate: I::Predicate) -> I::Predicate
fn fold_binder<T>(&mut self, t: Binder<I, T>) -> Binder<I, T>where
T: TypeFoldable<I>,
fn fold_region(&mut self, r: <I as Interner>::Region) -> <I as Interner>::Region
Auto Trait Implementations§
impl<'me, 'a, D, I> DynSend for ReplaceAliasWithInfer<'me, 'a, D, I>where
<D as Deref>::Target: Sized,
<I as Interner>::ParamEnv: DynSend,
<I as Interner>::Ty: DynSend,
<I as Interner>::CanonicalVars: DynSend,
<I as Interner>::PredefinedOpaques: DynSend,
D: DynSync + DynSend,
<I as Interner>::GenericArgs: DynSend,
<I as Interner>::DefiningOpaqueTypes: DynSend,
<I as Interner>::Term: DynSend,
<I as Interner>::Predicate: DynSend,
<I as Interner>::DefId: DynSend,
<I as Interner>::GenericArg: DynSend,
<I as Interner>::ExternalConstraints: DynSend,
impl<'me, 'a, D, I> DynSync for ReplaceAliasWithInfer<'me, 'a, D, I>where
<D as Deref>::Target: Sized,
<I as Interner>::ParamEnv: DynSync,
<I as Interner>::Ty: DynSync,
<I as Interner>::CanonicalVars: DynSync,
<I as Interner>::PredefinedOpaques: DynSync,
D: DynSync,
<I as Interner>::GenericArgs: DynSync,
<I as Interner>::DefiningOpaqueTypes: DynSync,
<I as Interner>::Term: DynSync,
<I as Interner>::Predicate: DynSync,
<I as Interner>::DefId: DynSync,
<I as Interner>::GenericArg: DynSync,
<I as Interner>::ExternalConstraints: DynSync,
impl<'me, 'a, D, I> Freeze for ReplaceAliasWithInfer<'me, 'a, D, I>
impl<'me, 'a, D, I> RefUnwindSafe for ReplaceAliasWithInfer<'me, 'a, D, I>where
<D as Deref>::Target: Sized,
<I as Interner>::ParamEnv: RefUnwindSafe,
<I as Interner>::CanonicalVars: RefUnwindSafe,
<I as Interner>::PredefinedOpaques: RefUnwindSafe,
D: RefUnwindSafe,
<I as Interner>::GenericArgs: RefUnwindSafe,
<I as Interner>::Ty: RefUnwindSafe,
<I as Interner>::Term: RefUnwindSafe,
<I as Interner>::Predicate: RefUnwindSafe,
<I as Interner>::DefId: RefUnwindSafe,
<I as Interner>::DefiningOpaqueTypes: RefUnwindSafe,
<I as Interner>::GenericArg: RefUnwindSafe,
<I as Interner>::ExternalConstraints: RefUnwindSafe,
impl<'me, 'a, D, I> Send for ReplaceAliasWithInfer<'me, 'a, D, I>where
<D as Deref>::Target: Sized,
<I as Interner>::ParamEnv: Send,
<I as Interner>::CanonicalVars: Send,
<I as Interner>::PredefinedOpaques: Send,
D: Sync + Send,
<I as Interner>::GenericArgs: Send,
<I as Interner>::Ty: Send,
<I as Interner>::DefiningOpaqueTypes: Send,
<I as Interner>::Term: Send,
<I as Interner>::Predicate: Send,
<I as Interner>::DefId: Send,
<I as Interner>::ExternalConstraints: Send,
<I as Interner>::GenericArg: Send,
impl<'me, 'a, D, I> Sync for ReplaceAliasWithInfer<'me, 'a, D, I>where
<D as Deref>::Target: Sized,
<I as Interner>::ParamEnv: Sync,
<I as Interner>::CanonicalVars: Sync,
<I as Interner>::PredefinedOpaques: Sync,
D: Sync,
<I as Interner>::GenericArgs: Sync,
<I as Interner>::Ty: Sync,
<I as Interner>::Term: Sync,
<I as Interner>::Predicate: Sync,
<I as Interner>::DefiningOpaqueTypes: Sync,
<I as Interner>::DefId: Sync,
<I as Interner>::GenericArg: Sync,
<I as Interner>::ExternalConstraints: Sync,
impl<'me, 'a, D, I> Unpin for ReplaceAliasWithInfer<'me, 'a, D, I>
impl<'me, 'a, D, I> !UnwindSafe for ReplaceAliasWithInfer<'me, 'a, D, I>
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
§impl<T, R> CollectAndApply<T, R> for T
impl<T, R> CollectAndApply<T, R> for T
§impl<I, F> FallibleTypeFolder<I> for Fwhere
I: Interner,
F: TypeFolder<I>,
impl<I, F> FallibleTypeFolder<I> for Fwhere
I: Interner,
F: TypeFolder<I>,
type Error = !
fn cx(&self) -> I
fn try_fold_binder<T>(&mut self, t: Binder<I, T>) -> Result<Binder<I, T>, !>where
T: TypeFoldable<I>,
fn try_fold_ty( &mut self, t: <I as Interner>::Ty, ) -> Result<<I as Interner>::Ty, !>
fn try_fold_region( &mut self, r: <I as Interner>::Region, ) -> Result<<I as Interner>::Region, !>
fn try_fold_const( &mut self, c: <I as Interner>::Const, ) -> Result<<I as Interner>::Const, !>
fn try_fold_predicate( &mut self, p: <I as Interner>::Predicate, ) -> Result<<I as Interner>::Predicate, !>
source§impl<T> Instrument for T
impl<T> Instrument for T
source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
source§impl<T> IntoEither for T
impl<T> IntoEither for T
source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
Converts
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moresource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
Converts
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moresource§impl<T> Pointable for T
impl<T> Pointable for T
§impl<I, T> UpcastFrom<I, T> for T
impl<I, T> UpcastFrom<I, T> for T
fn upcast_from(from: T, _tcx: I) -> T
source§impl<T> WithSubscriber for T
impl<T> WithSubscriber for T
source§fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
source§fn with_current_subscriber(self) -> WithDispatch<Self>
fn with_current_subscriber(self) -> WithDispatch<Self>
impl<'a, T> Captures<'a> for Twhere
T: ?Sized,
Layout§
Note: Unable to compute type layout, possibly due to this type having generic parameters. Layout can only be computed for concrete, fully-instantiated types.