Skip to main content

StackEntry

Struct StackEntry 

Source
pub(super) struct StackEntry<X: Cx> {
    pub input: X::Input,
    pub step_kind_from_parent: PathKind,
    pub available_depth: AvailableDepth,
    pub min_reached_available_depth: AvailableDepth,
    pub increase_depth_for_nested: IncreaseDepthForNested,
    pub provisional_result: Option<X::Result>,
    pub heads: CycleHeads,
    pub encountered_overflow: bool,
    pub usages: Option<HeadUsages>,
    pub candidate_usages: Option<CandidateHeadUsages>,
    pub nested_goals: NestedGoals<X>,
}
Expand description

Stack entries of the evaluation stack. Its fields tend to be lazily updated when popping a child goal or completely immutable.

Fields§

§input: X::Input§step_kind_from_parent: PathKind

Whether proving this goal is a coinductive step.

This is used when encountering a trait solver cycle to decide whether the initial provisional result of the cycle.

§available_depth: AvailableDepth

The available depth of a given goal, immutable.

§min_reached_available_depth: AvailableDepth

The minimum available depth encountered while evaluating this goal’s nested goals. If there’s no nested goal, this is equal to the available_depth.

§increase_depth_for_nested: IncreaseDepthForNested

Whether evaluating nested goals of a given goal should increase the depth.

Normally, it should be Yes, but among rustc’s predicate goals, normalizes-to goals are exceptions. They act like functions that used for normalizing associated terms while evaluating projection goals and since their expected terms are always fully unconstrained intentionally, they often return ambiguous nested goals to the caller’s context. As these nested goals are evaluated again in the caller’s context, we don’t want to increase depths when they are evaluated as nested goals for normalizes-to goals, otherwise we will encounter recursion limit overflows more often.

§provisional_result: Option<X::Result>

Starts out as None and gets set when rerunning this goal in case we encounter a cycle.

§heads: CycleHeads

All cycle heads this goal depends on. Lazily updated and only up-to date for the top of the stack.

§encountered_overflow: bool

Whether evaluating this goal encountered overflow. Lazily updated.

§usages: Option<HeadUsages>

Whether and how this goal has been used as a cycle head. Lazily updated.

§candidate_usages: Option<CandidateHeadUsages>

We want to be able to ignore head usages if they happen inside of candidates which don’t impact the result of a goal. This enables us to avoid rerunning goals and is also used when rebasing provisional cache entries.

To implement this, we track all usages while evaluating a candidate. If this candidate then ends up ignored, we manually remove its usages from usages and heads.

§nested_goals: NestedGoals<X>

The nested goals of this goal, see the doc comment of the type.

Implementations§

Source§

impl<X: Cx> StackEntry<X>

Source

pub(super) fn required_depth(&self) -> usize

Trait Implementations§

Source§

impl<X> Debug for StackEntry<X>
where X: Cx,

Source§

fn fmt(&self, __f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

§

impl<X> DynSend for StackEntry<X>
where <X as Cx>::Input: DynSend, <X as Cx>::Result: DynSend,

§

impl<X> DynSync for StackEntry<X>
where <X as Cx>::Input: DynSync, <X as Cx>::Result: DynSync,

§

impl<X> Freeze for StackEntry<X>
where <X as Cx>::Input: Freeze, <X as Cx>::Result: Freeze,

§

impl<X> RefUnwindSafe for StackEntry<X>
where <X as Cx>::Input: RefUnwindSafe, <X as Cx>::Result: RefUnwindSafe,

§

impl<X> Send for StackEntry<X>
where <X as Cx>::Input: Send, <X as Cx>::Result: Send,

§

impl<X> Sync for StackEntry<X>
where <X as Cx>::Input: Sync, <X as Cx>::Result: Sync,

§

impl<X> Unpin for StackEntry<X>
where <X as Cx>::Input: Unpin, <X as Cx>::Result: Unpin,

§

impl<X> UnsafeUnpin for StackEntry<X>
where <X as Cx>::Input: UnsafeUnpin, <X as Cx>::Result: UnsafeUnpin,

§

impl<X> UnwindSafe for StackEntry<X>
where <X as Cx>::Input: UnwindSafe, <X as Cx>::Result: UnwindSafe,

Blanket Implementations§

Source§

impl<T> Aligned for T

Source§

const ALIGN: Alignment

Alignment of Self.
Source§

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

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

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

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

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

Source§

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

Mutably borrows from an owned value. Read more
Source§

impl<T, R> CollectAndApply<T, R> for T

Source§

fn collect_and_apply<I, F>(iter: I, f: F) -> R
where I: Iterator<Item = T>, F: FnOnce(&[T]) -> R,

Equivalent to f(&iter.collect::<Vec<_>>()).

Source§

type Output = R

Source§

impl<T> ErasedDestructor for T
where T: 'static,

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where 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> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts 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 more
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

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

Source§

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 T
where U: TryFrom<T>,

Source§

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.
Source§

impl<I, T, U> Upcast<I, U> for T
where U: UpcastFrom<I, T>,

Source§

fn upcast(self, interner: I) -> U

Source§

impl<I, T> UpcastFrom<I, T> for T

Source§

fn upcast_from(from: T, _tcx: I) -> T

Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more

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.