pub struct Obligation<'tcx, T> {
pub cause: ObligationCause<'tcx>,
pub param_env: ParamEnv<'tcx>,
pub predicate: T,
pub recursion_depth: usize,
}
Expand description
An Obligation
represents some trait reference (e.g., i32: Eq
) for
which the “impl_source” must be found. The process of finding an “impl_source” is
called “resolving” the Obligation
. This process consists of
either identifying an impl
(e.g., impl Eq for i32
) that
satisfies the obligation, or else finding a bound that is in
scope. The eventual result is usually a Selection
(defined below).
Fields§
§cause: ObligationCause<'tcx>
The reason we have to prove this thing.
param_env: ParamEnv<'tcx>
The environment in which we should prove this thing.
predicate: T
The thing we are trying to prove.
recursion_depth: usize
If we started proving this as a result of trying to prove something else, track the total depth to ensure termination. If this goes over a certain threshold, we abort compilation – in such cases, we can not say whether or not the predicate holds for certain. Stupid halting problem; such a drag.
Implementations§
Source§impl<'tcx> Obligation<'tcx, Predicate<'tcx>>
impl<'tcx> Obligation<'tcx, Predicate<'tcx>>
Sourcepub fn flip_polarity(
&self,
tcx: TyCtxt<'tcx>,
) -> Option<Obligation<'tcx, Predicate<'tcx>>>
pub fn flip_polarity( &self, tcx: TyCtxt<'tcx>, ) -> Option<Obligation<'tcx, Predicate<'tcx>>>
Flips the polarity of the inner predicate.
Given T: Trait
predicate it returns T: !Trait
and given T: !Trait
returns T: Trait
.
Source§impl<'tcx> Obligation<'tcx, Binder<TyCtxt<'tcx>, TraitPredicate<TyCtxt<'tcx>>>>
impl<'tcx> Obligation<'tcx, Binder<TyCtxt<'tcx>, TraitPredicate<TyCtxt<'tcx>>>>
pub fn derived_cause( &self, variant: impl FnOnce(DerivedCause<'tcx>) -> ObligationCauseCode<'tcx>, ) -> ObligationCause<'tcx>
Source§impl<'tcx, O> Obligation<'tcx, O>
impl<'tcx, O> Obligation<'tcx, O>
pub fn new( tcx: TyCtxt<'tcx>, cause: ObligationCause<'tcx>, param_env: ParamEnv<'tcx>, predicate: impl Upcast<TyCtxt<'tcx>, O>, ) -> Obligation<'tcx, O>
Sourcepub fn set_depth_from_parent(&mut self, parent_depth: usize)
pub fn set_depth_from_parent(&mut self, parent_depth: usize)
We often create nested obligations without setting the correct depth.
To deal with this evaluate and fulfill explicitly update the depth of nested obligations using this function.
pub fn with_depth( tcx: TyCtxt<'tcx>, cause: ObligationCause<'tcx>, recursion_depth: usize, param_env: ParamEnv<'tcx>, predicate: impl Upcast<TyCtxt<'tcx>, O>, ) -> Obligation<'tcx, O>
pub fn misc( tcx: TyCtxt<'tcx>, span: Span, body_id: LocalDefId, param_env: ParamEnv<'tcx>, trait_ref: impl Upcast<TyCtxt<'tcx>, O>, ) -> Obligation<'tcx, O>
pub fn with<P>( &self, tcx: TyCtxt<'tcx>, value: impl Upcast<TyCtxt<'tcx>, P>, ) -> Obligation<'tcx, P>
Source§impl<'tcx> Obligation<'tcx, Binder<TyCtxt<'tcx>, TraitPredicate<TyCtxt<'tcx>>>>
impl<'tcx> Obligation<'tcx, Binder<TyCtxt<'tcx>, TraitPredicate<TyCtxt<'tcx>>>>
Trait Implementations§
Source§impl<'tcx, T> Clone for Obligation<'tcx, T>where
T: Clone,
impl<'tcx, T> Clone for Obligation<'tcx, T>where
T: Clone,
Source§fn clone(&self) -> Obligation<'tcx, T>
fn clone(&self) -> Obligation<'tcx, T>
Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read moreSource§impl<'tcx, O> Debug for Obligation<'tcx, O>where
O: Debug,
impl<'tcx, O> Debug for Obligation<'tcx, O>where
O: Debug,
Source§impl<'tcx> Elaboratable<TyCtxt<'tcx>> for Obligation<'tcx, Predicate<'tcx>>
impl<'tcx> Elaboratable<TyCtxt<'tcx>> for Obligation<'tcx, Predicate<'tcx>>
For Obligation
, a sub-obligation is combined with the current obligation’s
param-env and cause code.
fn predicate(&self) -> Predicate<'tcx>
fn child(&self, clause: Clause<'tcx>) -> Obligation<'tcx, Predicate<'tcx>>
fn child_with_derived_cause( &self, clause: Clause<'tcx>, span: Span, parent_trait_pred: Binder<TyCtxt<'tcx>, TraitPredicate<TyCtxt<'tcx>>>, index: usize, ) -> Obligation<'tcx, Predicate<'tcx>>
Source§impl<T> Hash for Obligation<'_, T>where
T: Hash,
impl<T> Hash for Obligation<'_, T>where
T: Hash,
Source§impl<'tcx, T> PartialEq for Obligation<'tcx, T>where
T: PartialEq,
impl<'tcx, T> PartialEq for Obligation<'tcx, T>where
T: PartialEq,
Source§impl<'tcx, O> TypeFoldable<TyCtxt<'tcx>> for Obligation<'tcx, O>where
O: TypeFoldable<TyCtxt<'tcx>>,
impl<'tcx, O> TypeFoldable<TyCtxt<'tcx>> for Obligation<'tcx, O>where
O: TypeFoldable<TyCtxt<'tcx>>,
Source§fn try_fold_with<F>(
self,
folder: &mut F,
) -> Result<Obligation<'tcx, O>, <F as FallibleTypeFolder<TyCtxt<'tcx>>>::Error>where
F: FallibleTypeFolder<TyCtxt<'tcx>>,
fn try_fold_with<F>(
self,
folder: &mut F,
) -> Result<Obligation<'tcx, O>, <F as FallibleTypeFolder<TyCtxt<'tcx>>>::Error>where
F: FallibleTypeFolder<TyCtxt<'tcx>>,
§fn fold_with<F>(self, folder: &mut F) -> Selfwhere
F: TypeFolder<I>,
fn fold_with<F>(self, folder: &mut F) -> Selfwhere
F: TypeFolder<I>,
try_fold_with
for use with infallible
folders. Do not override this method, to ensure coherence with
try_fold_with
.Source§impl<'tcx, O> TypeVisitable<TyCtxt<'tcx>> for Obligation<'tcx, O>where
O: TypeVisitable<TyCtxt<'tcx>>,
impl<'tcx, O> TypeVisitable<TyCtxt<'tcx>> for Obligation<'tcx, O>where
O: TypeVisitable<TyCtxt<'tcx>>,
Source§fn visit_with<V>(
&self,
visitor: &mut V,
) -> <V as TypeVisitor<TyCtxt<'tcx>>>::Resultwhere
V: TypeVisitor<TyCtxt<'tcx>>,
fn visit_with<V>(
&self,
visitor: &mut V,
) -> <V as TypeVisitor<TyCtxt<'tcx>>>::Resultwhere
V: TypeVisitor<TyCtxt<'tcx>>,
impl<T> Eq for Obligation<'_, T>where
T: Eq,
Auto Trait Implementations§
impl<'tcx, T> DynSend for Obligation<'tcx, T>where
T: DynSend,
impl<'tcx, T> DynSync for Obligation<'tcx, T>where
T: DynSync,
impl<'tcx, T> Freeze for Obligation<'tcx, T>where
T: Freeze,
impl<'tcx, T> !RefUnwindSafe for Obligation<'tcx, T>
impl<'tcx, T> Send for Obligation<'tcx, T>where
T: Send,
impl<'tcx, T> Sync for Obligation<'tcx, T>where
T: Sync,
impl<'tcx, T> Unpin for Obligation<'tcx, T>where
T: Unpin,
impl<'tcx, T> !UnwindSafe for Obligation<'tcx, T>
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> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§unsafe fn clone_to_uninit(&self, dst: *mut T)
unsafe fn clone_to_uninit(&self, dst: *mut T)
clone_to_uninit
)§impl<T, R> CollectAndApply<T, R> for T
impl<T, R> CollectAndApply<T, R> for T
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key
and return true
if they are equal.Source§impl<T> Filterable for T
impl<T> Filterable for T
Source§fn filterable(
self,
filter_name: &'static str,
) -> RequestFilterDataProvider<T, fn(_: DataRequest<'_>) -> bool>
fn filterable( self, filter_name: &'static str, ) -> RequestFilterDataProvider<T, fn(_: DataRequest<'_>) -> bool>
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<P> IntoQueryParam<P> for P
impl<P> IntoQueryParam<P> for P
fn into_query_param(self) -> P
Source§impl<'tcx, T> IsSuggestable<'tcx> for T
impl<'tcx, T> IsSuggestable<'tcx> for T
Source§impl<T> MaybeResult<T> for T
impl<T> MaybeResult<T> for T
Source§impl<T> Pointable for T
impl<T> Pointable for T
§impl<I, T> TypeVisitableExt<I> for Twhere
I: Interner,
T: TypeVisitable<I>,
impl<I, T> TypeVisitableExt<I> for Twhere
I: Interner,
T: TypeVisitable<I>,
fn has_type_flags(&self, flags: TypeFlags) -> bool
§fn has_vars_bound_at_or_above(&self, binder: DebruijnIndex) -> bool
fn has_vars_bound_at_or_above(&self, binder: DebruijnIndex) -> bool
true
if self
has any late-bound regions that are either
bound by binder
or bound by some binder outside of binder
.
If binder
is ty::INNERMOST
, this indicates whether
there are any late-bound regions that appear free.fn error_reported(&self) -> Result<(), <I as Interner>::ErrorGuaranteed>
§fn has_vars_bound_above(&self, binder: DebruijnIndex) -> bool
fn has_vars_bound_above(&self, binder: DebruijnIndex) -> bool
true
if this type has any regions that escape binder
(and
hence are not bound by it).§fn has_escaping_bound_vars(&self) -> bool
fn has_escaping_bound_vars(&self) -> bool
true
if this type has regions that are not a part of the type.
For example, for<'a> fn(&'a i32)
return false
, while fn(&'a i32)
would return true
. The latter can occur when traversing through the
former. Read morefn has_aliases(&self) -> bool
fn has_opaque_types(&self) -> bool
fn has_coroutines(&self) -> bool
fn references_error(&self) -> bool
fn has_non_region_param(&self) -> bool
fn has_infer_regions(&self) -> bool
fn has_infer_types(&self) -> bool
fn has_non_region_infer(&self) -> bool
fn has_infer(&self) -> bool
fn has_placeholders(&self) -> bool
fn has_non_region_placeholders(&self) -> bool
fn has_param(&self) -> bool
§fn has_free_regions(&self) -> bool
fn has_free_regions(&self) -> bool
fn has_erased_regions(&self) -> bool
§fn has_erasable_regions(&self) -> bool
fn has_erasable_regions(&self) -> bool
§fn is_global(&self) -> bool
fn is_global(&self) -> bool
§fn has_bound_regions(&self) -> bool
fn has_bound_regions(&self) -> bool
§fn has_non_region_bound_vars(&self) -> bool
fn has_non_region_bound_vars(&self) -> bool
§fn has_bound_vars(&self) -> bool
fn has_bound_vars(&self) -> bool
§fn still_further_specializable(&self) -> bool
fn still_further_specializable(&self) -> bool
impl
specialization.§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>,
§impl<I, T> UpcastFrom<I, T> for T
impl<I, T> UpcastFrom<I, T> for T
fn upcast_from(from: T, _tcx: I) -> T
§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: Unable to compute type layout, possibly due to this type having generic parameters. Layout can only be computed for concrete, fully-instantiated types.