Enum rustc_middle::traits::ObligationCauseCode
source · 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>>),
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,
},
ConstPatternStructural,
IfExpression(Box<IfExpressionCause<'tcx>>),
IfExpressionWithNoElse,
MainFunctionType,
StartFunctionType,
LangFunctionType(Symbol),
IntrinsicType,
LetElse,
MethodReceiver,
UnifyReceiver(Box<UnifyReceiverContext<'tcx>>),
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>>)
DerivedObligation(DerivedObligationCause<'tcx>)
FunctionArgumentObligation
Fields
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>>)
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>>)
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
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.
Implementations§
source§impl<'tcx> ObligationCauseCode<'tcx>
impl<'tcx> ObligationCauseCode<'tcx>
fn into(self) -> InternedObligationCauseCode<'tcx>
source§impl<'tcx> ObligationCauseCode<'tcx>
impl<'tcx> ObligationCauseCode<'tcx>
sourcepub fn peel_derives(&self) -> &Self
pub fn peel_derives(&self) -> &Self
Returns the base obligation, ignoring derived obligations.
pub fn parent(&self) -> Option<(&Self, Option<PolyTraitPredicate<'tcx>>)>
pub fn peel_match_impls(&self) -> &Self
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, '__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<ObligationCauseCode<'tcx>> for ObligationCauseCode<'tcx>
impl<'tcx> PartialEq<ObligationCauseCode<'tcx>> 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: FallibleTypeFolder<TyCtxt<'tcx>>>(
self,
__folder: &mut __F
) -> Result<Self, __F::Error>
fn try_fold_with<__F: FallibleTypeFolder<TyCtxt<'tcx>>>( self, __folder: &mut __F ) -> Result<Self, __F::Error>
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: TypeVisitor<TyCtxt<'tcx>>>(
&self,
__visitor: &mut __V
) -> ControlFlow<__V::BreakTy>
fn visit_with<__V: TypeVisitor<TyCtxt<'tcx>>>( &self, __visitor: &mut __V ) -> ControlFlow<__V::BreakTy>
impl<'tcx> Eq for ObligationCauseCode<'tcx>
impl<'tcx> StructuralEq for ObligationCauseCode<'tcx>
impl<'tcx> StructuralPartialEq for ObligationCauseCode<'tcx>
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
source§impl<T, R> CollectAndApply<T, R> for T
impl<T, R> CollectAndApply<T, R> for T
source§impl<Tcx, T> DepNodeParams<Tcx> for Twhere
Tcx: DepContext,
T: for<'a> HashStable<StableHashingContext<'a>> + Debug,
impl<Tcx, T> DepNodeParams<Tcx> for Twhere Tcx: DepContext, T: for<'a> HashStable<StableHashingContext<'a>> + Debug,
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<P> IntoQueryParam<P> for P
impl<P> IntoQueryParam<P> for P
fn into_query_param(self) -> P
source§impl<'tcx, T> IsSuggestable<'tcx> for Twhere
T: TypeVisitable<TyCtxt<'tcx>> + TypeFoldable<TyCtxt<'tcx>>,
impl<'tcx, T> IsSuggestable<'tcx> for Twhere T: TypeVisitable<TyCtxt<'tcx>> + TypeFoldable<TyCtxt<'tcx>>,
source§impl<T> MaybeResult<T> for T
impl<T> MaybeResult<T> 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<'tcx, T> TypeVisitableExt<'tcx> for Twhere
T: TypeVisitable<TyCtxt<'tcx>>,
impl<'tcx, T> TypeVisitableExt<'tcx> for Twhere T: TypeVisitable<TyCtxt<'tcx>>,
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.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_type_flags(&self, flags: TypeFlags) -> bool
fn has_projections(&self) -> bool
fn has_inherent_projections(&self) -> bool
fn has_opaque_types(&self) -> bool
fn has_generators(&self) -> bool
fn references_error(&self) -> bool
fn error_reported(&self) -> Result<(), ErrorGuaranteed>
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_late_bound_regions(&self) -> bool
fn has_late_bound_regions(&self) -> bool
source§fn has_non_region_late_bound(&self) -> bool
fn has_non_region_late_bound(&self) -> bool
source§fn has_late_bound_vars(&self) -> bool
fn has_late_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: &[QueryInfo], _guar: ErrorGuaranteed ) -> 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