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> DynSend for ProvisionalCacheEntry<X>
impl<X> DynSync for ProvisionalCacheEntry<X>
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<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>
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.