struct ProvisionalCacheEntry<'tcx> {
stack_depth: Option<StackDepth>,
with_inductive_stack: Option<DetachedEntry<'tcx>>,
with_coinductive_stack: Option<DetachedEntry<'tcx>>,
}
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<'tcx>>
§with_coinductive_stack: Option<DetachedEntry<'tcx>>
Implementations§
Trait Implementations§
source§impl<'tcx> Default for ProvisionalCacheEntry<'tcx>
impl<'tcx> Default for ProvisionalCacheEntry<'tcx>
source§fn default() -> ProvisionalCacheEntry<'tcx>
fn default() -> ProvisionalCacheEntry<'tcx>
Auto Trait Implementations§
impl<'tcx> DynSend for ProvisionalCacheEntry<'tcx>
impl<'tcx> DynSync for ProvisionalCacheEntry<'tcx>
impl<'tcx> Freeze for ProvisionalCacheEntry<'tcx>
impl<'tcx> !RefUnwindSafe for ProvisionalCacheEntry<'tcx>
impl<'tcx> Send for ProvisionalCacheEntry<'tcx>
impl<'tcx> Sync for ProvisionalCacheEntry<'tcx>
impl<'tcx> Unpin for ProvisionalCacheEntry<'tcx>
impl<'tcx> !UnwindSafe for ProvisionalCacheEntry<'tcx>
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
§impl<T> Filterable for T
impl<T> Filterable 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<P> IntoQueryParam<P> for P
impl<P> IntoQueryParam<P> for P
fn into_query_param(self) -> P
source§impl<T> MaybeResult<T> for T
impl<T> MaybeResult<T> for T
§impl<T> Pointable for T
impl<T> Pointable for T
source§impl<'tcx, T> ToPredicate<'tcx, T> for T
impl<'tcx, T> ToPredicate<'tcx, T> for T
fn to_predicate(self, _tcx: TyCtxt<'tcx>) -> T
source§impl<Tcx, T> Value<Tcx> for Twhere
Tcx: DepContext,
impl<Tcx, T> Value<Tcx> for Twhere
Tcx: DepContext,
default fn from_cycle_error( tcx: Tcx, cycle_error: &CycleError, _guar: ErrorGuaranteed ) -> 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,
impl<T> ErasedDestructor for Twhere
T: 'static,
impl<T> MaybeSendSync for T
Layout§
Note: Most layout information is completely unstable and may even differ between compilations. The only exception is types with certain repr(...)
attributes. Please see the Rust Reference's “Type Layout” chapter for details on type layout guarantees.
Size: 104 bytes