pub enum ObligationCauseCode<'tcx> {
Show 62 variants
MiscObligation,
SliceOrArrayElem,
TupleElem,
ProjectionWf(AliasTy<'tcx>),
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<Span>),
SizedReturnType,
SizedYieldType,
InlineAsmSized,
SizedClosureCapture(LocalDefId),
SizedGeneratorInterior(LocalDefId),
RepeatElementCopy {
is_const_fn: bool,
},
FieldSized {
adt_kind: AdtKind,
span: Span,
last: bool,
},
ConstSized,
SharedStatic,
BuiltinDerivedObligation(DerivedObligationCause<'tcx>),
ImplDerivedObligation(Box<ImplDerivedObligationCause<'tcx>, Global>),
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>, Global>),
Pattern {
span: Option<Span>,
root_ty: Ty<'tcx>,
origin_expr: bool,
},
ConstPatternStructural,
IfExpression(Box<IfExpressionCause<'tcx>, Global>),
IfExpressionWithNoElse,
MainFunctionType,
StartFunctionType,
LangFunctionType(Symbol),
IntrinsicType,
LetElse,
MethodReceiver,
UnifyReceiver(Box<UnifyReceiverContext<'tcx>, Global>),
ReturnNoExpression,
ReturnValue(HirId),
ReturnType,
OpaqueReturnType(Option<(Ty<'tcx>, Span)>),
BlockTailExpression(HirId, MatchSource),
TrivialBound,
OpaqueType,
AwaitableExpr(Option<HirId>),
ForLoopIterator,
QuestionMark,
WellFormed(Option<WellFormedLoc>),
MatchImpl(ObligationCause<'tcx>, DefId),
BinOp {
rhs_span: Option<Span>,
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
.
ProjectionWf(AliasTy<'tcx>)
This is the trait reference from the given projection.
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<Span>)
Argument type must be Sized
.
SizedReturnType
Return type 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
.
SizedGeneratorInterior(LocalDefId)
Types live across generator yields must be Sized
.
RepeatElementCopy
Fields
[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>, Global>)
DerivedObligation(DerivedObligationCause<'tcx>)
FunctionArgumentObligation
Fields
arg_hir_id: HirId
The node of the relevant argument in the function call.
call_hir_id: HirId
The node of the function call.
parent_code: InternedObligationCauseCode<'tcx>
The obligation introduced by this argument.
CompareImplItemObligation
Error derived when matching traits/impls; see ObligationCause for more details
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>, Global>)
Computing common supertype in the arms of a match expression
Pattern
Fields
Type error arising from type checking a pattern against an expected type.
ConstPatternStructural
Constants in patterns must have Structural
type.
IfExpression(Box<IfExpressionCause<'tcx>, Global>)
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>, Global>)
ReturnNoExpression
return
with no expression
ReturnValue(HirId)
return
with an expression
ReturnType
Return type of this function
OpaqueReturnType(Option<(Ty<'tcx>, Span)>)
Opaque return type of this function
BlockTailExpression(HirId, MatchSource)
Block implicit return
TrivialBound
#[feature(trivial_bounds)] is not enabled
OpaqueType
If X
is the concrete type of an opaque type impl Y
, then X
must implement Y
AwaitableExpr(Option<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
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.
Auto Trait Implementations§
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§
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
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 bytesProjectionWf
: 23 bytesItemObligation
: 11 bytesBindingObligation
: 19 bytesExprItemObligation
: 31 bytesExprBindingObligation
: 39 bytesReferenceOutlivesReferent
: 15 bytesObjectTypeBound
: 23 bytesCoercion
: 23 bytesAssignmentLhsSized
: 0 bytesTupleInitializerSized
: 0 bytesStructInitializerSized
: 0 bytesVariableType
: 11 bytesSizedArgumentType
: 15 bytesSizedReturnType
: 0 bytesSizedYieldType
: 0 bytesInlineAsmSized
: 0 bytesSizedClosureCapture
: 7 bytesSizedGeneratorInterior
: 7 bytesRepeatElementCopy
: 1 byteFieldSized
: 11 bytesConstSized
: 0 bytesSharedStatic
: 0 bytesBuiltinDerivedObligation
: 47 bytesImplDerivedObligation
: 15 bytesDerivedObligation
: 47 bytesFunctionArgumentObligation
: 31 bytesCompareImplItemObligation
: 15 bytesCheckAssociatedTypeBounds
: 15 bytesExprAssignable
: 0 bytesMatchExpressionArm
: 15 bytesPattern
: 23 bytesConstPatternStructural
: 0 bytesIfExpression
: 15 bytesIfExpressionWithNoElse
: 0 bytesMainFunctionType
: 0 bytesStartFunctionType
: 0 bytesLangFunctionType
: 7 bytesIntrinsicType
: 0 bytesLetElse
: 0 bytesMethodReceiver
: 0 bytesUnifyReceiver
: 15 bytesReturnNoExpression
: 0 bytesReturnValue
: 11 bytesReturnType
: 0 bytesOpaqueReturnType
: 23 bytesBlockTailExpression
: 19 bytesTrivialBound
: 0 bytesOpaqueType
: 0 bytesAwaitableExpr
: 11 bytesForLoopIterator
: 0 bytesQuestionMark
: 0 bytesWellFormed
: 11 bytesMatchImpl
: 39 bytesBinOp
: 23 bytesAscribeUserTypeProvePredicate
: 11 bytesRustCall
: 0 bytesDropImpl
: 0 bytesConstParam
: 15 bytesTypeAlias
: 31 bytes