pub enum TyKind {
Show 15 variants
Scalar(ScalarTy),
Array(Ty, ConstantExpr, Option<TraitRef>),
Slice(Ty, Option<TraitRef>),
Adt(TypeDeclRef),
Ref(Region, Ty, RefKind),
RawPtr(Ty, RefKind),
FnDef(RegionBinder<FnPtr>),
FnPtr(RegionBinder<FunSig>),
DynTrait(DynPredicate),
Pattern(Ty, TypePattern),
Never,
TypeVar(TypeDbVar),
TraitType(TraitRef, AssocTypeId, GenericArgs),
PtrMetadata(Ty),
Error(String),
}Expand description
A type.
This is interned as Ty, making it cheap to clone and compare.
Variants§
Scalar(ScalarTy)
A scalar (integers, floats, char, or bool).
Array(Ty, ConstantExpr, Option<TraitRef>)
An array [T; N]. The third field is the proof that T: Sized; it is absent with
--hide-marker-traits.
Slice(Ty, Option<TraitRef>)
A slice [T]. The second field is the proof that T: Sized; it is absent with
--hide-marker-traits.
Adt(TypeDeclRef)
An ADT: structs, enums, unions, as well as tuples and str.
Ref(Region, Ty, RefKind)
A reference: &T or &mut T.
RawPtr(Ty, RefKind)
A raw pointer.
FnDef(RegionBinder<FnPtr>)
The unique type associated with each function item. Each function item is given a unique
type that has the function’s early-bound generics. This type is not generally nameable in
Rust; it’s a ZST (there’s a unique value), and a value of that type can be cast to a
function pointer or passed to functions that expect FnOnce/FnMut/Fn parameters.
There’s a binder here because charon function items take both early and late-bound lifetimes as arguments; given that the type we’re pointing to is polymorphic in the late-bound variables, we need to bind them here.
// `'a` is early-bound, 'b is late-bound.
fn foo<'a, 'b>(x: &'a u32, y: &'b u32)
where u32: 'b
{}For rustc, there’s a ZST foo<'a>, that can be cast to a for<'b> fn(&'a u32, &'b u32)
function pointer.
For charon, there’s an item foo<'a, 'b>, and the FnDef item that corresponds to rustc’s
foo<'a> is represented as FnDef(for<'b> foo<'a, 'b>).
FnPtr(RegionBinder<FunSig>)
Function pointer type. This is a literal pointer to a region of memory that contains a callable function.
A function pointer can have lifetime generics, e.g. for<'a> fn(&'a mut u32) -> &'a u32,
hence the binder.
DynTrait(DynPredicate)
dyn Trait: erased value known to implement Trait. A pointer to it will carry a vtable
pointer that stores the methods that can be called on this value.
Pattern(Ty, TypePattern)
A pattern type: a type that is representationally identical to its base type, except the only valid values are the ones that match the pattern.
Never
The never type, the canonical uninhabited type.
TypeVar(TypeDbVar)
A type variable.
TraitType(TraitRef, AssocTypeId, GenericArgs)
A trait associated type: <T as Trait>::AssocType<Args>.
PtrMetadata(Ty)
The type of pointer metadata for the given type; e.g. for [T], this type is usize. The
way to write this type in Rust is <X as core::ptr::Pointee>::Metadata.
Error(String)
A type that could not be computed or was incorrect.
Implementations§
Source§impl TyKind
impl TyKind
pub fn is_scalar(&self) -> bool
pub fn is_array(&self) -> bool
pub fn is_slice(&self) -> bool
pub fn is_adt(&self) -> bool
pub fn is_ref(&self) -> bool
pub fn is_raw_ptr(&self) -> bool
pub fn is_fn_def(&self) -> bool
pub fn is_fn_ptr(&self) -> bool
pub fn is_dyn_trait(&self) -> bool
pub fn is_pattern(&self) -> bool
pub fn is_never(&self) -> bool
pub fn is_type_var(&self) -> bool
pub fn is_trait_type(&self) -> bool
pub fn is_ptr_metadata(&self) -> bool
pub fn is_error(&self) -> bool
Source§impl TyKind
impl TyKind
pub fn as_scalar(&self) -> Option<&ScalarTy>
pub fn as_array(&self) -> Option<(&Ty, &ConstantExpr, &Option<TraitRef>)>
pub fn as_slice(&self) -> Option<(&Ty, &Option<TraitRef>)>
pub fn as_adt(&self) -> Option<&TypeDeclRef>
pub fn as_ref(&self) -> Option<(&Region, &Ty, &RefKind)>
pub fn as_raw_ptr(&self) -> Option<(&Ty, &RefKind)>
pub fn as_fn_def(&self) -> Option<&RegionBinder<FnPtr>>
pub fn as_fn_ptr(&self) -> Option<&RegionBinder<FunSig>>
pub fn as_dyn_trait(&self) -> Option<&DynPredicate>
pub fn as_pattern(&self) -> Option<(&Ty, &TypePattern)>
pub fn as_never(&self) -> Option<()>
pub fn as_type_var(&self) -> Option<&TypeDbVar>
pub fn as_trait_type(&self) -> Option<(&TraitRef, &AssocTypeId, &GenericArgs)>
pub fn as_ptr_metadata(&self) -> Option<&Ty>
pub fn as_error(&self) -> Option<&String>
Source§impl TyKind
impl TyKind
pub fn as_scalar_mut(&mut self) -> Option<&mut ScalarTy>
pub fn as_array_mut( &mut self, ) -> Option<(&mut Ty, &mut ConstantExpr, &mut Option<TraitRef>)>
pub fn as_slice_mut(&mut self) -> Option<(&mut Ty, &mut Option<TraitRef>)>
pub fn as_adt_mut(&mut self) -> Option<&mut TypeDeclRef>
pub fn as_ref_mut(&mut self) -> Option<(&mut Region, &mut Ty, &mut RefKind)>
pub fn as_raw_ptr_mut(&mut self) -> Option<(&mut Ty, &mut RefKind)>
pub fn as_fn_def_mut(&mut self) -> Option<&mut RegionBinder<FnPtr>>
pub fn as_fn_ptr_mut(&mut self) -> Option<&mut RegionBinder<FunSig>>
pub fn as_dyn_trait_mut(&mut self) -> Option<&mut DynPredicate>
pub fn as_pattern_mut(&mut self) -> Option<(&mut Ty, &mut TypePattern)>
pub fn as_never_mut(&mut self) -> Option<()>
pub fn as_type_var_mut(&mut self) -> Option<&mut TypeDbVar>
pub fn as_trait_type_mut( &mut self, ) -> Option<(&mut TraitRef, &mut AssocTypeId, &mut GenericArgs)>
pub fn as_ptr_metadata_mut(&mut self) -> Option<&mut Ty>
pub fn as_error_mut(&mut self) -> Option<&mut String>
Source§impl TyKind
impl TyKind
pub fn to_scalar(self) -> Option<ScalarTy>
pub fn to_array(self) -> Option<(Ty, ConstantExpr, Option<TraitRef>)>
pub fn to_slice(self) -> Option<(Ty, Option<TraitRef>)>
pub fn to_adt(self) -> Option<TypeDeclRef>
pub fn to_ref(self) -> Option<(Region, Ty, RefKind)>
pub fn to_raw_ptr(self) -> Option<(Ty, RefKind)>
pub fn to_fn_def(self) -> Option<RegionBinder<FnPtr>>
pub fn to_fn_ptr(self) -> Option<RegionBinder<FunSig>>
pub fn to_dyn_trait(self) -> Option<DynPredicate>
pub fn to_pattern(self) -> Option<(Ty, TypePattern)>
pub fn to_never(self) -> Option<()>
pub fn to_type_var(self) -> Option<TypeDbVar>
pub fn to_trait_type(self) -> Option<(TraitRef, AssocTypeId, GenericArgs)>
pub fn to_ptr_metadata(self) -> Option<Ty>
pub fn to_error(self) -> Option<String>
Source§impl TyKind
impl TyKind
pub fn into_ty(self) -> Ty
pub fn is_usize(&self) -> bool
pub fn is_unsigned_scalar(&self) -> bool
pub fn is_signed_scalar(&self) -> bool
pub fn is_str(&self) -> bool
pub fn is_tuple(&self) -> bool
pub fn as_adt_id(&self) -> Option<TypeDeclId>
pub fn as_box(&self) -> Option<&Ty>
pub fn as_box_mut(&mut self) -> Option<&mut Ty>
pub fn builtin_deref(&self) -> Option<&Ty>
pub fn builtin_deref_mut(&mut self) -> Option<&mut Ty>
pub fn as_array_or_slice(&self) -> Option<&Ty>
pub fn as_array_or_slice_mut(&mut self) -> Option<&mut Ty>
Trait Implementations§
Source§impl AstVisitable for TyKind
impl AstVisitable for TyKind
Source§fn drive<V: VisitAst>(&self, v: &mut V) -> ControlFlow<V::Break>
fn drive<V: VisitAst>(&self, v: &mut V) -> ControlFlow<V::Break>
visit_$any
method if it exists, otherwise visit_inner.Source§fn drive_mut<V: VisitAstMut>(&mut self, v: &mut V) -> ControlFlow<V::Break>
fn drive_mut<V: VisitAstMut>(&mut self, v: &mut V) -> ControlFlow<V::Break>
visit_$any
method if it exists, otherwise visit_inner.Source§fn drive_two<V: ZipAst>(&self, other: &Self, v: &mut V) -> ControlFlow<V::Break>
fn drive_two<V: ZipAst>(&self, other: &Self, v: &mut V) -> ControlFlow<V::Break>
visit_$any
method if it exists, otherwise visit_inner.Source§fn dyn_visit<T: AstVisitable>(&self, f: impl FnMut(&T))where
Self: Sized,
fn dyn_visit<T: AstVisitable>(&self, f: impl FnMut(&T))where
Self: Sized,
self, in pre-order traversal.Source§fn dyn_visit_mut<T: AstVisitable>(&mut self, f: impl FnMut(&mut T))where
Self: Sized,
fn dyn_visit_mut<T: AstVisitable>(&mut self, f: impl FnMut(&mut T))where
Self: Sized,
self, in pre-order traversal.Source§impl<'de, __State: ?Sized> DeserializeState<'de, __State> for TyKindwhere
ScalarTy: DeserializeState<'de, __State>,
Ty: DeserializeState<'de, __State>,
ConstantExpr: DeserializeState<'de, __State>,
Option<TraitRef>: DeserializeState<'de, __State>,
TypeDeclRef: DeserializeState<'de, __State>,
Region: DeserializeState<'de, __State>,
RefKind: DeserializeState<'de, __State>,
RegionBinder<FnPtr>: DeserializeState<'de, __State>,
RegionBinder<FunSig>: DeserializeState<'de, __State>,
DynPredicate: DeserializeState<'de, __State>,
TypePattern: DeserializeState<'de, __State>,
TypeDbVar: DeserializeState<'de, __State>,
TraitRef: DeserializeState<'de, __State>,
AssocTypeId: DeserializeState<'de, __State>,
GenericArgs: DeserializeState<'de, __State>,
String: DeserializeState<'de, __State>,
impl<'de, __State: ?Sized> DeserializeState<'de, __State> for TyKindwhere
ScalarTy: DeserializeState<'de, __State>,
Ty: DeserializeState<'de, __State>,
ConstantExpr: DeserializeState<'de, __State>,
Option<TraitRef>: DeserializeState<'de, __State>,
TypeDeclRef: DeserializeState<'de, __State>,
Region: DeserializeState<'de, __State>,
RefKind: DeserializeState<'de, __State>,
RegionBinder<FnPtr>: DeserializeState<'de, __State>,
RegionBinder<FunSig>: DeserializeState<'de, __State>,
DynPredicate: DeserializeState<'de, __State>,
TypePattern: DeserializeState<'de, __State>,
TypeDbVar: DeserializeState<'de, __State>,
TraitRef: DeserializeState<'de, __State>,
AssocTypeId: DeserializeState<'de, __State>,
GenericArgs: DeserializeState<'de, __State>,
String: DeserializeState<'de, __State>,
fn deserialize_state<__D>(
__state: &__State,
__deserializer: __D,
) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Source§impl<'s, V> Drive<'s, V> for TyKindwhere
V: Visitor + Visit<'s, ScalarTy> + Visit<'s, Ty> + Visit<'s, ConstantExpr> + Visit<'s, Option<TraitRef>> + Visit<'s, TypeDeclRef> + Visit<'s, Region> + Visit<'s, RefKind> + Visit<'s, RegionBinder<FnPtr>> + Visit<'s, RegionBinder<FunSig>> + Visit<'s, DynPredicate> + Visit<'s, TypePattern> + Visit<'s, TypeDbVar> + Visit<'s, TraitRef> + Visit<'s, AssocTypeId> + Visit<'s, GenericArgs> + Visit<'s, String>,
impl<'s, V> Drive<'s, V> for TyKindwhere
V: Visitor + Visit<'s, ScalarTy> + Visit<'s, Ty> + Visit<'s, ConstantExpr> + Visit<'s, Option<TraitRef>> + Visit<'s, TypeDeclRef> + Visit<'s, Region> + Visit<'s, RefKind> + Visit<'s, RegionBinder<FnPtr>> + Visit<'s, RegionBinder<FunSig>> + Visit<'s, DynPredicate> + Visit<'s, TypePattern> + Visit<'s, TypeDbVar> + Visit<'s, TraitRef> + Visit<'s, AssocTypeId> + Visit<'s, GenericArgs> + Visit<'s, String>,
Source§fn drive_inner(&'s self, visitor: &mut V) -> ControlFlow<V::Break>
fn drive_inner(&'s self, visitor: &mut V) -> ControlFlow<V::Break>
v.visit() on the immediate contents of self.Source§impl<'s, V> DriveMut<'s, V> for TyKindwhere
V: Visitor + VisitMut<'s, ScalarTy> + VisitMut<'s, Ty> + VisitMut<'s, ConstantExpr> + VisitMut<'s, Option<TraitRef>> + VisitMut<'s, TypeDeclRef> + VisitMut<'s, Region> + VisitMut<'s, RefKind> + VisitMut<'s, RegionBinder<FnPtr>> + VisitMut<'s, RegionBinder<FunSig>> + VisitMut<'s, DynPredicate> + VisitMut<'s, TypePattern> + VisitMut<'s, TypeDbVar> + VisitMut<'s, TraitRef> + VisitMut<'s, AssocTypeId> + VisitMut<'s, GenericArgs> + VisitMut<'s, String>,
impl<'s, V> DriveMut<'s, V> for TyKindwhere
V: Visitor + VisitMut<'s, ScalarTy> + VisitMut<'s, Ty> + VisitMut<'s, ConstantExpr> + VisitMut<'s, Option<TraitRef>> + VisitMut<'s, TypeDeclRef> + VisitMut<'s, Region> + VisitMut<'s, RefKind> + VisitMut<'s, RegionBinder<FnPtr>> + VisitMut<'s, RegionBinder<FunSig>> + VisitMut<'s, DynPredicate> + VisitMut<'s, TypePattern> + VisitMut<'s, TypeDbVar> + VisitMut<'s, TraitRef> + VisitMut<'s, AssocTypeId> + VisitMut<'s, GenericArgs> + VisitMut<'s, String>,
Source§fn drive_inner_mut(&'s mut self, visitor: &mut V) -> ControlFlow<V::Break>
fn drive_inner_mut(&'s mut self, visitor: &mut V) -> ControlFlow<V::Break>
v.visit() on the immediate contents of self.Source§impl<'s, V> DriveTwo<'s, V> for TyKindwhere
V: Visitor<Break: Default> + VisitTwo<'s, ScalarTy> + VisitTwo<'s, Ty> + VisitTwo<'s, ConstantExpr> + VisitTwo<'s, Option<TraitRef>> + VisitTwo<'s, TypeDeclRef> + VisitTwo<'s, Region> + VisitTwo<'s, RefKind> + VisitTwo<'s, RegionBinder<FnPtr>> + VisitTwo<'s, RegionBinder<FunSig>> + VisitTwo<'s, DynPredicate> + VisitTwo<'s, TypePattern> + VisitTwo<'s, TypeDbVar> + VisitTwo<'s, TraitRef> + VisitTwo<'s, AssocTypeId> + VisitTwo<'s, GenericArgs> + VisitTwo<'s, String>,
impl<'s, V> DriveTwo<'s, V> for TyKindwhere
V: Visitor<Break: Default> + VisitTwo<'s, ScalarTy> + VisitTwo<'s, Ty> + VisitTwo<'s, ConstantExpr> + VisitTwo<'s, Option<TraitRef>> + VisitTwo<'s, TypeDeclRef> + VisitTwo<'s, Region> + VisitTwo<'s, RefKind> + VisitTwo<'s, RegionBinder<FnPtr>> + VisitTwo<'s, RegionBinder<FunSig>> + VisitTwo<'s, DynPredicate> + VisitTwo<'s, TypePattern> + VisitTwo<'s, TypeDbVar> + VisitTwo<'s, TraitRef> + VisitTwo<'s, AssocTypeId> + VisitTwo<'s, GenericArgs> + VisitTwo<'s, String>,
Source§fn drive_two_inner(
&'s self,
other: &'s Self,
visitor: &mut V,
) -> ControlFlow<V::Break>
fn drive_two_inner( &'s self, other: &'s Self, visitor: &mut V, ) -> ControlFlow<V::Break>
v.visit() on the immediate contents of self and other, if they correspond. If
the values don’t match up, this returns Break(Default::default()).impl Eq for TyKind
Source§impl Ord for TyKind
impl Ord for TyKind
1.21.0 (const: unstable) · Source§fn max(self, other: Self) -> Selfwhere
Self: Sized,
fn max(self, other: Self) -> Selfwhere
Self: Sized,
Source§impl PartialOrd for TyKind
impl PartialOrd for TyKind
Source§impl<__State: ?Sized> SerializeState<__State> for TyKindwhere
ScalarTy: SerializeState<__State>,
Ty: SerializeState<__State>,
ConstantExpr: SerializeState<__State>,
Option<TraitRef>: SerializeState<__State>,
TypeDeclRef: SerializeState<__State>,
Region: SerializeState<__State>,
RefKind: SerializeState<__State>,
RegionBinder<FnPtr>: SerializeState<__State>,
RegionBinder<FunSig>: SerializeState<__State>,
DynPredicate: SerializeState<__State>,
TypePattern: SerializeState<__State>,
TypeDbVar: SerializeState<__State>,
TraitRef: SerializeState<__State>,
AssocTypeId: SerializeState<__State>,
GenericArgs: SerializeState<__State>,
String: SerializeState<__State>,
impl<__State: ?Sized> SerializeState<__State> for TyKindwhere
ScalarTy: SerializeState<__State>,
Ty: SerializeState<__State>,
ConstantExpr: SerializeState<__State>,
Option<TraitRef>: SerializeState<__State>,
TypeDeclRef: SerializeState<__State>,
Region: SerializeState<__State>,
RefKind: SerializeState<__State>,
RegionBinder<FnPtr>: SerializeState<__State>,
RegionBinder<FunSig>: SerializeState<__State>,
DynPredicate: SerializeState<__State>,
TypePattern: SerializeState<__State>,
TypeDbVar: SerializeState<__State>,
TraitRef: SerializeState<__State>,
AssocTypeId: SerializeState<__State>,
GenericArgs: SerializeState<__State>,
String: SerializeState<__State>,
fn serialize_state<__S>(
&self,
__state: &__State,
__serializer: __S,
) -> Result<__S::Ok, __S::Error>where
__S: Serializer,
impl StructuralPartialEq for TyKind
Auto Trait Implementations§
impl Freeze for TyKind
impl RefUnwindSafe for TyKind
impl Send for TyKind
impl Sync for TyKind
impl Unpin for TyKind
impl UnsafeUnpin for TyKind
impl UnwindSafe for TyKind
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,
§impl<Q, K> Comparable<K> for Q
impl<Q, K> Comparable<K> for Q
impl<T> Dedup for T
§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> HashConsable for T
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> 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 moreimpl<T> Mappable for T
Source§impl<T> TyVisitable for Twhere
T: AstVisitable,
impl<T> TyVisitable for Twhere
T: AstVisitable,
Source§fn visit_vars(&mut self, v: &mut impl VarsVisitor)
fn visit_vars(&mut self, v: &mut impl VarsVisitor)
self, as seen from the outside of self. This means
that any variable bound inside self will be skipped, and all the seen De Bruijn indices
will count from the outside of self.Source§fn substitute(self, generics: &GenericArgs) -> Self
fn substitute(self, generics: &GenericArgs) -> Self
self by replacing them with the provided values.
Note: if self is an item that comes from a TraitDecl, you must use
substitute_with_self or substitute_inner_binder, otherwise you’ll get panics.Source§fn substitute_inner_binder(self, generics: &GenericArgs) -> Self
fn substitute_inner_binder(self, generics: &GenericArgs) -> Self
self by replacing them with the provided values.
This is appropriate when substituting an inner binder.Source§fn substitute_explicits(self, generics: &GenericArgs) -> Self
fn substitute_explicits(self, generics: &GenericArgs) -> Self
Source§fn substitute_with_self(
self,
generics: &GenericArgs,
self_ref: &TraitRefKind,
) -> Self
fn substitute_with_self( self, generics: &GenericArgs, self_ref: &TraitRefKind, ) -> Self
TraitRefKind::SelfId trait ref.Source§fn substitute_with_tref(self, tref: &TraitRef) -> Self
fn substitute_with_tref(self, tref: &TraitRef) -> Self
TraitRefKind::SelfId trait ref.Source§fn try_substitute_with_tref(
self,
tref: &TraitRef,
) -> Result<Self, GenericsMismatch>
fn try_substitute_with_tref( self, tref: &TraitRef, ) -> Result<Self, GenericsMismatch>
TraitRefKind::SelfId trait ref.fn try_substitute( self, generics: &GenericArgs, ) -> Result<Self, GenericsMismatch>
fn try_substitute_with_self( self, generics: &GenericArgs, self_ref: &TraitRefKind, ) -> Result<Self, GenericsMismatch>
Source§fn move_under_binder(self) -> Self
fn move_under_binder(self) -> Self
Source§fn move_under_binders(self, depth: DeBruijnId) -> Self
fn move_under_binders(self, depth: DeBruijnId) -> Self
depth binders.Source§fn move_from_under_binder(self) -> Option<Self>
fn move_from_under_binder(self) -> Option<Self>
Source§fn move_from_under_binders(self, depth: DeBruijnId) -> Option<Self>
fn move_from_under_binders(self, depth: DeBruijnId) -> Option<Self>
depth binders. Returns None if it contains a variable bound in
one of these depth binders.Source§fn visit_db_id<B>(
&mut self,
f: impl FnMut(&mut DeBruijnId) -> ControlFlow<B>,
) -> ControlFlow<B>
fn visit_db_id<B>( &mut self, f: impl FnMut(&mut DeBruijnId) -> ControlFlow<B>, ) -> ControlFlow<B>
self, as seen from the outside of self. This means
that any variable bound inside self will be skipped, and all the seen indices will count
from the outside of self.