pub enum ProjectionCacheEntry<'tcx> {
    InProgress,
    Ambiguous,
    Recur,
    Error,
    NormalizedTy {
        ty: Normalized<'tcx, Term<'tcx>>,
        complete: Option<EvaluationResult>,
    },
}

Variants§

§

InProgress

§

Ambiguous

§

Recur

§

Error

§

NormalizedTy

Fields

§ty: Normalized<'tcx, Term<'tcx>>
§complete: Option<EvaluationResult>

If we were able to successfully evaluate the corresponding cache entry key during predicate evaluation, then this field stores the final result obtained from evaluating all of the projection sub-obligations. During evaluation, we will skip evaluating the cached sub-obligations in ty if this field is set. Evaluation only cares about the final result, so we don’t care about any region constraint side-effects produced by evaluating the sub-obligations.

Additionally, we will clear out the sub-obligations entirely if we ever evaluate the cache entry (along with all its sub obligations) to EvaluatedToOk. This affects all users of the cache, not just evaluation. Since a result of EvaluatedToOk means that there were no region obligations that need to be tracked, it’s fine to forget about the sub-obligations - they don’t provide any additional information. However, we do not discard any obligations when we see EvaluatedToOkModuloRegions - we don’t know which sub-obligations may introduce region constraints, so we keep them all to be safe.

When we are not performing evaluation (e.g. in FulfillmentContext), we ignore this field, and always re-process the cached sub-obligations (which may have been cleared out - see the above paragraph). This ensures that we do not lose any regions constraints that arise from processing the sub-obligations.

Auto Trait Implementations§

§

impl<'tcx> !RefUnwindSafe for ProjectionCacheEntry<'tcx>

§

impl<'tcx> !Send for ProjectionCacheEntry<'tcx>

§

impl<'tcx> !Sync for ProjectionCacheEntry<'tcx>

§

impl<'tcx> Unpin for ProjectionCacheEntry<'tcx>

§

impl<'tcx> !UnwindSafe for ProjectionCacheEntry<'tcx>

Blanket Implementations§

source§

impl<T> Any for Twhere T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T, U> Into<U> for Twhere U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<T> ToOwned for Twhere T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for Twhere U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.

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: 40 bytes

Size for each variant:

  • InProgress: 0 bytes
  • Ambiguous: 0 bytes
  • Recur: 0 bytes
  • Error: 0 bytes
  • NormalizedTy: 39 bytes