struct ReplaceAliasWithInfer<'me, 'a, D, I>where
D: SolverDelegate<Interner = I>,
I: Interner,{
ecx: &'me mut EvalCtxt<'a, D>,
param_env: I::ParamEnv,
normalization_goal_source: GoalSource,
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.
The emitted goals get evaluated in the context of the parent goal; by
replacing aliases in nested goals we essentially pull the normalization out of
the nested goal. We want to treat the goal as if the normalization still happens
inside of the nested goal by inheriting the step_kind
of the nested goal and
storing it in the GoalSource
of the emitted AliasRelate
goals.
This is necessary for tests/ui/sized/coinductive-1.rs to compile.
Fields§
§ecx: &'me mut EvalCtxt<'a, D>
§param_env: I::ParamEnv
§normalization_goal_source: GoalSource
§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,
fn new( ecx: &'me mut EvalCtxt<'a, D>, for_goal_source: GoalSource, param_env: I::ParamEnv, ) -> Self
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
<I as Interner>::ParamEnv: DynSend,
<I as Interner>::Ty: DynSend,
<I as Interner>::CanonicalVars: DynSend,
<I as Interner>::PredefinedOpaques: DynSend,
<I as Interner>::Span: DynSend,
D: DynSync + DynSend,
<I as Interner>::GenericArgs: DynSend,
<I as Interner>::Term: DynSend,
<I as Interner>::Predicate: DynSend,
<I as Interner>::DefiningOpaqueTypes: 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
<I as Interner>::ParamEnv: DynSync,
<I as Interner>::Ty: DynSync,
<I as Interner>::CanonicalVars: DynSync,
<I as Interner>::PredefinedOpaques: DynSync,
<I as Interner>::Span: DynSync,
D: DynSync,
<I as Interner>::GenericArgs: DynSync,
<I as Interner>::Term: DynSync,
<I as Interner>::Predicate: DynSync,
<I as Interner>::DefiningOpaqueTypes: 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
<I as Interner>::ParamEnv: RefUnwindSafe,
<I as Interner>::CanonicalVars: RefUnwindSafe,
<I as Interner>::PredefinedOpaques: RefUnwindSafe,
<I as Interner>::Span: 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
<I as Interner>::ParamEnv: Send,
<I as Interner>::CanonicalVars: Send,
<I as Interner>::PredefinedOpaques: Send,
<I as Interner>::Span: 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
<I as Interner>::ParamEnv: Sync,
<I as Interner>::CanonicalVars: Sync,
<I as Interner>::PredefinedOpaques: Sync,
<I as Interner>::Span: 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>::DefId: Sync,
<I as Interner>::DefiningOpaqueTypes: 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
Source§impl<T, R> CollectAndApply<T, R> for T
impl<T, R> CollectAndApply<T, R> for T
Source§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>
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>
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
Source§impl<I, T, U> Upcast<I, U> for Twhere
U: UpcastFrom<I, T>,
impl<I, T, U> Upcast<I, U> for Twhere
U: UpcastFrom<I, T>,
Source§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>
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.