pub enum ObligationCauseCode<'tcx> {
Show 59 variants
MiscObligation,
SliceOrArrayElem,
TupleElem,
ItemObligation(DefId),
BindingObligation(DefId, Span),
ExprItemObligation(DefId, HirId, usize),
ExprBindingObligation(DefId, Span, HirId, usize),
ReferenceOutlivesReferent(Ty<'tcx>),
ObjectTypeBound(Ty<'tcx>, Region<'tcx>),
Coercion {
source: Ty<'tcx>,
target: Ty<'tcx>,
},
AssignmentLhsSized,
TupleInitializerSized,
StructInitializerSized,
VariableType(HirId),
SizedArgumentType(Option<HirId>),
SizedReturnType,
SizedCallReturnType,
SizedYieldType,
InlineAsmSized,
SizedClosureCapture(LocalDefId),
SizedCoroutineInterior(LocalDefId),
RepeatElementCopy {
is_constable: IsConstable,
elt_type: Ty<'tcx>,
elt_span: Span,
elt_stmt_span: Span,
},
FieldSized {
adt_kind: AdtKind,
span: Span,
last: bool,
},
ConstSized,
SharedStatic,
BuiltinDerivedObligation(DerivedObligationCause<'tcx>),
ImplDerivedObligation(Box<ImplDerivedObligationCause<'tcx>>),
DerivedObligation(DerivedObligationCause<'tcx>),
FunctionArgumentObligation {
arg_hir_id: HirId,
call_hir_id: HirId,
parent_code: InternedObligationCauseCode<'tcx>,
},
CompareImplItemObligation {
impl_item_def_id: LocalDefId,
trait_item_def_id: DefId,
kind: AssocKind,
},
CheckAssociatedTypeBounds {
impl_item_def_id: LocalDefId,
trait_item_def_id: DefId,
},
ExprAssignable,
MatchExpressionArm(Box<MatchExpressionArmCause<'tcx>>),
Pattern {
span: Option<Span>,
root_ty: Ty<'tcx>,
origin_expr: bool,
},
IfExpression(Box<IfExpressionCause<'tcx>>),
IfExpressionWithNoElse,
MainFunctionType,
StartFunctionType,
LangFunctionType(Symbol),
IntrinsicType,
LetElse,
MethodReceiver,
UnifyReceiver(Box<UnifyReceiverContext<'tcx>>),
ReturnNoExpression,
ReturnValue(HirId),
OpaqueReturnType(Option<(Ty<'tcx>, Span)>),
BlockTailExpression(HirId, MatchSource),
TrivialBound,
AwaitableExpr(HirId),
ForLoopIterator,
QuestionMark,
WellFormed(Option<WellFormedLoc>),
MatchImpl(ObligationCause<'tcx>, DefId),
BinOp {
lhs_hir_id: HirId,
rhs_hir_id: Option<HirId>,
rhs_span: Option<Span>,
rhs_is_lit: bool,
output_ty: Option<Ty<'tcx>>,
},
AscribeUserTypeProvePredicate(Span),
RustCall,
DropImpl,
ConstParam(Ty<'tcx>),
TypeAlias(InternedObligationCauseCode<'tcx>, Span, DefId),
}
Variants§
MiscObligation
Not well classified or should be obvious from the span.
SliceOrArrayElem
A slice or array is WF only if T: Sized
.
TupleElem
A tuple is WF only if its middle elements are Sized
.
ItemObligation(DefId)
Must satisfy all of the where-clause predicates of the given item.
BindingObligation(DefId, Span)
Like ItemObligation
, but carries the span of the
predicate when it can be identified.
ExprItemObligation(DefId, HirId, usize)
Like ItemObligation
, but carries the HirId
of the
expression that caused the obligation, and the usize
indicates exactly which predicate it is in the list of
instantiated predicates.
ExprBindingObligation(DefId, Span, HirId, usize)
Combines ExprItemObligation
and BindingObligation
.
ReferenceOutlivesReferent(Ty<'tcx>)
A type like &'a T
is WF only if T: 'a
.
ObjectTypeBound(Ty<'tcx>, Region<'tcx>)
A type like Box<Foo<'a> + 'b>
is WF only if 'b: 'a
.
Coercion
Obligation incurred due to a coercion.
AssignmentLhsSized
Various cases where expressions must be Sized
/ Copy
/ etc.
L = X
implies that L
is Sized
.
TupleInitializerSized
(x1, .., xn)
must be Sized
.
StructInitializerSized
S { ... }
must be Sized
.
VariableType(HirId)
Type of each variable must be Sized
.
SizedArgumentType(Option<HirId>)
Argument type must be Sized
.
SizedReturnType
Return type must be Sized
.
SizedCallReturnType
Return type of a call expression must be Sized
.
SizedYieldType
Yield type must be Sized
.
InlineAsmSized
Inline asm operand type must be Sized
.
SizedClosureCapture(LocalDefId)
Captured closure type must be Sized
.
SizedCoroutineInterior(LocalDefId)
Types live across coroutine yields must be Sized
.
RepeatElementCopy
Fields
is_constable: IsConstable
If element is a const fn
or const ctor we display a help message suggesting
to move it to a new const
item while saying that T
doesn’t implement Copy
.
[expr; N]
requires type_of(expr): Copy
.
FieldSized
Types of fields (other than the last, except for packed structs) in a struct must be sized.
ConstSized
Constant expressions must be sized.
static
items must have Sync
type.
BuiltinDerivedObligation(DerivedObligationCause<'tcx>)
ImplDerivedObligation(Box<ImplDerivedObligationCause<'tcx>>)
DerivedObligation(DerivedObligationCause<'tcx>)
FunctionArgumentObligation
Fields
parent_code: InternedObligationCauseCode<'tcx>
The obligation introduced by this argument.
CompareImplItemObligation
Error derived when checking an impl item is compatible with its corresponding trait item’s definition
CheckAssociatedTypeBounds
Checking that the bounds of a trait’s associated type hold for a given impl
ExprAssignable
Checking that this expression can be assigned to its target.
MatchExpressionArm(Box<MatchExpressionArmCause<'tcx>>)
Computing common supertype in the arms of a match expression
Pattern
Fields
Type error arising from type checking a pattern against an expected type.
IfExpression(Box<IfExpressionCause<'tcx>>)
Computing common supertype in an if expression
IfExpressionWithNoElse
Computing common supertype of an if expression with no else counter-part
MainFunctionType
main
has wrong type
StartFunctionType
start
has wrong type
LangFunctionType(Symbol)
language function has wrong type
IntrinsicType
Intrinsic has wrong type
LetElse
A let else block does not diverge
MethodReceiver
Method receiver
UnifyReceiver(Box<UnifyReceiverContext<'tcx>>)
ReturnNoExpression
return
with no expression
ReturnValue(HirId)
return
with an expression
OpaqueReturnType(Option<(Ty<'tcx>, Span)>)
Opaque return type of this function
BlockTailExpression(HirId, MatchSource)
Block implicit return
TrivialBound
#[feature(trivial_bounds)] is not enabled
AwaitableExpr(HirId)
ForLoopIterator
QuestionMark
WellFormed(Option<WellFormedLoc>)
Well-formed checking. If a WellFormedLoc
is provided,
then it will be used to perform HIR-based wf checking
after an error occurs, in order to generate a more precise error span.
This is purely for diagnostic purposes - it is always
correct to use MiscObligation
instead, or to specify
WellFormed(None)
MatchImpl(ObligationCause<'tcx>, DefId)
From match_impl
. The cause for us having to match an impl, and the DefId we are matching against.
BinOp
Fields
AscribeUserTypeProvePredicate(Span)
RustCall
DropImpl
Obligations to prove that a std::ops::Drop
impl is not stronger than
the ADT it’s being implemented for.
ConstParam(Ty<'tcx>)
Requirement for a const N: Ty
to implement Ty: ConstParamTy
TypeAlias(InternedObligationCauseCode<'tcx>, Span, DefId)
Obligations emitted during the normalization of a weak type alias.
Implementations§
source§impl<'tcx> ObligationCauseCode<'tcx>
impl<'tcx> ObligationCauseCode<'tcx>
sourcepub fn peel_derives(&self) -> &ObligationCauseCode<'tcx>
pub fn peel_derives(&self) -> &ObligationCauseCode<'tcx>
Returns the base obligation, ignoring derived obligations.
sourcepub fn peel_derives_with_predicate(
&self
) -> (&ObligationCauseCode<'tcx>, Option<Binder<'tcx, TraitPredicate<'tcx>>>)
pub fn peel_derives_with_predicate( &self ) -> (&ObligationCauseCode<'tcx>, Option<Binder<'tcx, TraitPredicate<'tcx>>>)
Returns the base obligation and the base trait predicate, if any, ignoring derived obligations.
pub fn parent( &self ) -> Option<(&ObligationCauseCode<'tcx>, Option<Binder<'tcx, TraitPredicate<'tcx>>>)>
pub fn peel_match_impls(&self) -> &ObligationCauseCode<'tcx>
Trait Implementations§
source§impl<'tcx> Clone for ObligationCauseCode<'tcx>
impl<'tcx> Clone for ObligationCauseCode<'tcx>
source§fn clone(&self) -> ObligationCauseCode<'tcx>
fn clone(&self) -> ObligationCauseCode<'tcx>
1.0.0 · source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read moresource§impl<'tcx> Debug for ObligationCauseCode<'tcx>
impl<'tcx> Debug for ObligationCauseCode<'tcx>
source§impl<'tcx, __D> Decodable<__D> for ObligationCauseCode<'tcx>
impl<'tcx, __D> Decodable<__D> for ObligationCauseCode<'tcx>
fn decode(__decoder: &mut __D) -> ObligationCauseCode<'tcx>
source§impl<'tcx, __E> Encodable<__E> for ObligationCauseCode<'tcx>
impl<'tcx, __E> Encodable<__E> for ObligationCauseCode<'tcx>
source§impl<'tcx, '__ctx> HashStable<StableHashingContext<'__ctx>> for ObligationCauseCode<'tcx>
impl<'tcx, '__ctx> HashStable<StableHashingContext<'__ctx>> for ObligationCauseCode<'tcx>
fn hash_stable( &self, __hcx: &mut StableHashingContext<'__ctx>, __hasher: &mut StableHasher )
source§impl<'tcx> PartialEq for ObligationCauseCode<'tcx>
impl<'tcx> PartialEq for ObligationCauseCode<'tcx>
source§fn eq(&self, other: &ObligationCauseCode<'tcx>) -> bool
fn eq(&self, other: &ObligationCauseCode<'tcx>) -> bool
self
and other
values to be equal, and is used
by ==
.source§impl<'tcx> TypeFoldable<TyCtxt<'tcx>> for ObligationCauseCode<'tcx>
impl<'tcx> TypeFoldable<TyCtxt<'tcx>> for ObligationCauseCode<'tcx>
source§fn try_fold_with<__F>(
self,
__folder: &mut __F
) -> Result<ObligationCauseCode<'tcx>, <__F as FallibleTypeFolder<TyCtxt<'tcx>>>::Error>where
__F: FallibleTypeFolder<TyCtxt<'tcx>>,
fn try_fold_with<__F>(
self,
__folder: &mut __F
) -> Result<ObligationCauseCode<'tcx>, <__F as FallibleTypeFolder<TyCtxt<'tcx>>>::Error>where
__F: FallibleTypeFolder<TyCtxt<'tcx>>,
source§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> TypeVisitable<TyCtxt<'tcx>> for ObligationCauseCode<'tcx>
impl<'tcx> TypeVisitable<TyCtxt<'tcx>> for ObligationCauseCode<'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<'tcx> Eq for ObligationCauseCode<'tcx>
impl<'tcx> StructuralPartialEq for ObligationCauseCode<'tcx>
Auto Trait Implementations§
impl<'tcx> DynSend for ObligationCauseCode<'tcx>
impl<'tcx> DynSync for ObligationCauseCode<'tcx>
impl<'tcx> Freeze for ObligationCauseCode<'tcx>
impl<'tcx> !RefUnwindSafe for ObligationCauseCode<'tcx>
impl<'tcx> Send for ObligationCauseCode<'tcx>
impl<'tcx> Sync for ObligationCauseCode<'tcx>
impl<'tcx> Unpin for ObligationCauseCode<'tcx>
impl<'tcx> !UnwindSafe for ObligationCauseCode<'tcx>
Blanket Implementations§
§impl<T> AnyEq for T
impl<T> AnyEq for T
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<Tcx, T> DepNodeParams<Tcx> for T
impl<Tcx, T> DepNodeParams<Tcx> for T
default fn fingerprint_style() -> FingerprintStyle
source§default fn to_fingerprint(&self, tcx: Tcx) -> Fingerprint
default fn to_fingerprint(&self, tcx: Tcx) -> Fingerprint
default fn to_debug_str(&self, _: Tcx) -> String
source§default fn recover(_: Tcx, _: &DepNode) -> Option<T>
default fn recover(_: Tcx, _: &DepNode) -> Option<T>
DepNode
,
something which is needed when forcing DepNode
s during red-green
evaluation. The query system will only call this method if
fingerprint_style()
is not FingerprintStyle::Opaque
.
It is always valid to return None
here, in which case incremental
compilation will treat the query as having changed instead of forcing it.source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key
and return true
if they are equal.§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<'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
§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<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
source§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>
source§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).source§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_projections(&self) -> bool
fn has_inherent_projections(&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
source§fn has_free_regions(&self) -> bool
fn has_free_regions(&self) -> bool
fn has_erased_regions(&self) -> bool
source§fn has_erasable_regions(&self) -> bool
fn has_erasable_regions(&self) -> bool
source§fn is_global(&self) -> bool
fn is_global(&self) -> bool
source§fn has_bound_regions(&self) -> bool
fn has_bound_regions(&self) -> bool
source§fn has_non_region_bound_vars(&self) -> bool
fn has_non_region_bound_vars(&self) -> bool
source§fn has_bound_vars(&self) -> bool
fn has_bound_vars(&self) -> bool
source§fn still_further_specializable(&self) -> bool
fn still_further_specializable(&self) -> bool
impl
specialization.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: 48 bytes
Size for each variant:
MiscObligation
: 0 bytesSliceOrArrayElem
: 0 bytesTupleElem
: 0 bytesItemObligation
: 11 bytesBindingObligation
: 19 bytesExprItemObligation
: 31 bytesExprBindingObligation
: 39 bytesReferenceOutlivesReferent
: 15 bytesObjectTypeBound
: 23 bytesCoercion
: 23 bytesAssignmentLhsSized
: 0 bytesTupleInitializerSized
: 0 bytesStructInitializerSized
: 0 bytesVariableType
: 11 bytesSizedArgumentType
: 11 bytesSizedReturnType
: 0 bytesSizedCallReturnType
: 0 bytesSizedYieldType
: 0 bytesInlineAsmSized
: 0 bytesSizedClosureCapture
: 7 bytesSizedCoroutineInterior
: 7 bytesRepeatElementCopy
: 31 bytesFieldSized
: 11 bytesConstSized
: 0 bytesSharedStatic
: 0 bytesBuiltinDerivedObligation
: 47 bytesImplDerivedObligation
: 15 bytesDerivedObligation
: 47 bytesFunctionArgumentObligation
: 31 bytesCompareImplItemObligation
: 15 bytesCheckAssociatedTypeBounds
: 15 bytesExprAssignable
: 0 bytesMatchExpressionArm
: 15 bytesPattern
: 23 bytesIfExpression
: 15 bytesIfExpressionWithNoElse
: 0 bytesMainFunctionType
: 0 bytesStartFunctionType
: 0 bytesLangFunctionType
: 7 bytesIntrinsicType
: 0 bytesLetElse
: 0 bytesMethodReceiver
: 0 bytesUnifyReceiver
: 15 bytesReturnNoExpression
: 0 bytesReturnValue
: 11 bytesOpaqueReturnType
: 23 bytesBlockTailExpression
: 19 bytesTrivialBound
: 0 bytesAwaitableExpr
: 11 bytesForLoopIterator
: 0 bytesQuestionMark
: 0 bytesWellFormed
: 11 bytesMatchImpl
: 39 bytesBinOp
: 39 bytesAscribeUserTypeProvePredicate
: 11 bytesRustCall
: 0 bytesDropImpl
: 0 bytesConstParam
: 15 bytesTypeAlias
: 31 bytes