Enum rustc_infer::traits::ObligationCauseCode
source · pub enum ObligationCauseCode<'tcx> {
Show 57 variants
Misc,
SliceOrArrayElem,
TupleElem,
WhereClause(DefId, Span),
WhereClauseInExpr(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,
BuiltinDerived(DerivedCause<'tcx>),
ImplDerived(Box<ImplDerivedCause<'tcx>>),
WellFormedDerived(DerivedCause<'tcx>),
FunctionArg {
arg_hir_id: HirId,
call_hir_id: HirId,
parent_code: InternedObligationCauseCode<'tcx>,
},
CompareImplItem {
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>, HirId)>),
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§
Misc
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
.
WhereClause(DefId, Span)
Represents a clause that comes from a specific item. The span corresponds to the clause.
WhereClauseInExpr(DefId, Span, HirId, usize)
Like WhereClause
, but also identifies the expression
which requires the where
clause to be proven, and also
identifies the index of the predicate in the predicates_of
list of the item.
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
[expr; N]
requires type_of(expr): Copy
.
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
.
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.
BuiltinDerived(DerivedCause<'tcx>)
Derived obligation (i.e. theoretical where
clause) on a built-in
implementation like Copy
or Sized
.
ImplDerived(Box<ImplDerivedCause<'tcx>>)
Derived obligation (i.e. where
clause) on an user-provided impl
or a trait alias.
WellFormedDerived(DerivedCause<'tcx>)
Derived obligation for WF goals.
FunctionArg
Derived obligation refined to point at a specific argument in a call or method expression.
Fields
parent_code: InternedObligationCauseCode<'tcx>
The obligation introduced by this argument.
CompareImplItem
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
Type error arising from type checking a pattern against an expected type.
Fields
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>, HirId)>)
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 Misc
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<TyCtxt<'tcx>, TraitPredicate<TyCtxt<'tcx>>>>)
pub fn peel_derives_with_predicate( &self, ) -> (&ObligationCauseCode<'tcx>, Option<Binder<TyCtxt<'tcx>, TraitPredicate<TyCtxt<'tcx>>>>)
Returns the base obligation and the base trait predicate, if any, ignoring derived obligations.
pub fn parent( &self, ) -> Option<(&ObligationCauseCode<'tcx>, Option<Binder<TyCtxt<'tcx>, TraitPredicate<TyCtxt<'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<SipHasher128>, )
source§impl<'tcx> PartialEq for ObligationCauseCode<'tcx>
impl<'tcx> PartialEq for ObligationCauseCode<'tcx>
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> 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§
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
)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
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<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_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
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<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>,
source§impl<I, T> UpcastFrom<I, T> for T
impl<I, T> UpcastFrom<I, T> for T
fn upcast_from(from: T, _tcx: I) -> T
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:
Misc
: 0 bytesSliceOrArrayElem
: 0 bytesTupleElem
: 0 bytesWhereClause
: 19 bytesWhereClauseInExpr
: 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 bytesBuiltinDerived
: 47 bytesImplDerived
: 15 bytesWellFormedDerived
: 47 bytesFunctionArg
: 31 bytesCompareImplItem
: 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
: 23 bytesMatchImpl
: 39 bytesBinOp
: 39 bytesAscribeUserTypeProvePredicate
: 11 bytesRustCall
: 0 bytesDropImpl
: 0 bytesConstParam
: 15 bytesTypeAlias
: 31 bytes