Struct rustc_type_ir::search_graph::ProvisionalCacheEntry
source · struct ProvisionalCacheEntry<X: Cx> {
stack_depth: Option<StackDepth>,
with_inductive_stack: Option<DetachedEntry<X>>,
with_coinductive_stack: Option<DetachedEntry<X>>,
}
Expand description
Stores the stack depth of a currently evaluated goal and already computed results for goals which depend on other goals still on the stack.
The provisional result may depend on whether the stack above it is inductive or coinductive. Because of this, we store separate provisional results for each case. If an provisional entry is not applicable, it may be the case that we already have provisional result while computing a goal. In this case we prefer the provisional result to potentially avoid fixpoint iterations. See tests/ui/traits/next-solver/cycles/mixed-cycles-2.rs for an example.
The provisional cache can theoretically result in changes to the observable behavior, see tests/ui/traits/next-solver/cycles/provisional-cache-impacts-behavior.rs.
Fields§
§stack_depth: Option<StackDepth>
§with_inductive_stack: Option<DetachedEntry<X>>
§with_coinductive_stack: Option<DetachedEntry<X>>
Implementations§
Trait Implementations§
Auto Trait Implementations§
impl<X> Freeze for ProvisionalCacheEntry<X>
impl<X> RefUnwindSafe for ProvisionalCacheEntry<X>
impl<X> Send for ProvisionalCacheEntry<X>
impl<X> Sync for ProvisionalCacheEntry<X>
impl<X> Unpin for ProvisionalCacheEntry<X>
impl<X> UnwindSafe for ProvisionalCacheEntry<X>
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<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<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>
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.