pub enum CastKind {
Scalar(ScalarTy),
RawPtr(Ty),
PtrExposeProvenance,
PtrWithExposedProvenance(Ty),
FnDefToFnPtr,
FnPtrToUnsafe,
Subtype(Ty),
Unsize(Ty, UnsizingMetadata, MetadataPath),
Transmute(Ty),
Concretize(Ty, MetadataPath),
}Expand description
Cast the operand to a new type.
Variants§
Scalar(ScalarTy)
Conversion between scalar types. See https://doc.rust-lang.org/reference/expressions/operator-expr.html#r-expr.as.numeric
RawPtr(Ty)
Convert a raw pointer or function pointer to a raw pointer.
PtrExposeProvenance
Converts a pointer or function pointer to an address, exposing its provenance. See https://doc.rust-lang.org/std/primitive.pointer.html#method.expose_provenance.
PtrWithExposedProvenance(Ty)
Converts an address to a pointer, which picks up exposed provenance. See https://doc.rust-lang.org/std/ptr/fn.with_exposed_provenance.html.
FnDefToFnPtr
Turn a function item into a function pointer, binding exactly its late-bound regions.
FnPtrToUnsafe
Convert a safe function pointer to an unsafe function pointer with the same signature.
Subtype(Ty)
Convert a value to a supertype; this has no runtime effect.
Unsize(Ty, UnsizingMetadata, MetadataPath)
Unsize coercion. This is
either [T; N] -> [T] or T: Trait -> dyn Trait coercions, behind a pointer
(reference, Box, or other type that implements CoerceUnsized).
The special case of &[T; N] -> &[T] coercion is caught by UnOp::ArrayToSlice.
Transmute(Ty)
Reinterprets the bits of a value of one type as another type, i.e. exactly what
std::mem::transmute does.
Concretize(Ty, MetadataPath)
Converts a receiver type with dyn Trait<...> to a concrete type T, used in vtable method shims.
Valid conversions are references, raw pointers, and (optionally) boxes:
&[mut] dyn Trait<...>->&[mut] T*[mut] dyn Trait<...>->*[mut] TBox<dyn Trait<...>>->Box<T>when no--treat-box-as-builtin- smart-pointers, e.g.
Rc<dyn Trait<...>>->Rc<T>orPin<&mut dyn Trait<...>>->Pin<&mut T>
For possible receivers, see: https://doc.rust-lang.org/reference/items/traits.html#dyn-compatibility.
With --index-to-function-calls, this also converts &[T] to &[T; N] (or the mutable
equivalents) when an array subslice projection determines the length statically.
Implementations§
Source§impl CastKind
impl CastKind
pub fn is_scalar(&self) -> bool
pub fn is_raw_ptr(&self) -> bool
pub fn is_ptr_expose_provenance(&self) -> bool
pub fn is_ptr_with_exposed_provenance(&self) -> bool
pub fn is_fn_def_to_fn_ptr(&self) -> bool
pub fn is_fn_ptr_to_unsafe(&self) -> bool
pub fn is_subtype(&self) -> bool
pub fn is_unsize(&self) -> bool
pub fn is_transmute(&self) -> bool
pub fn is_concretize(&self) -> bool
Trait Implementations§
Source§impl AstVisitable for CastKind
impl AstVisitable for CastKind
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 CastKindwhere
ScalarTy: DeserializeState<'de, __State>,
Ty: DeserializeState<'de, __State>,
UnsizingMetadata: DeserializeState<'de, __State>,
MetadataPath: DeserializeState<'de, __State>,
impl<'de, __State: ?Sized> DeserializeState<'de, __State> for CastKindwhere
ScalarTy: DeserializeState<'de, __State>,
Ty: DeserializeState<'de, __State>,
UnsizingMetadata: DeserializeState<'de, __State>,
MetadataPath: 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 CastKindwhere
V: Visitor + Visit<'s, ScalarTy> + Visit<'s, Ty> + Visit<'s, UnsizingMetadata> + Visit<'s, MetadataPath>,
impl<'s, V> Drive<'s, V> for CastKindwhere
V: Visitor + Visit<'s, ScalarTy> + Visit<'s, Ty> + Visit<'s, UnsizingMetadata> + Visit<'s, MetadataPath>,
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 CastKindwhere
V: Visitor + VisitMut<'s, ScalarTy> + VisitMut<'s, Ty> + VisitMut<'s, UnsizingMetadata> + VisitMut<'s, MetadataPath>,
impl<'s, V> DriveMut<'s, V> for CastKindwhere
V: Visitor + VisitMut<'s, ScalarTy> + VisitMut<'s, Ty> + VisitMut<'s, UnsizingMetadata> + VisitMut<'s, MetadataPath>,
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 CastKindwhere
V: Visitor<Break: Default> + VisitTwo<'s, ScalarTy> + VisitTwo<'s, Ty> + VisitTwo<'s, UnsizingMetadata> + VisitTwo<'s, MetadataPath>,
impl<'s, V> DriveTwo<'s, V> for CastKindwhere
V: Visitor<Break: Default> + VisitTwo<'s, ScalarTy> + VisitTwo<'s, Ty> + VisitTwo<'s, UnsizingMetadata> + VisitTwo<'s, MetadataPath>,
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 CastKind
Source§impl<C: AstFormatter> FmtWithCtx<C> for CastKind
impl<C: AstFormatter> FmtWithCtx<C> for CastKind
Source§impl Ord for CastKind
impl Ord for CastKind
1.21.0 (const: unstable) · Source§fn max(self, other: Self) -> Selfwhere
Self: Sized,
fn max(self, other: Self) -> Selfwhere
Self: Sized,
1.21.0 (const: unstable) · Source§fn min(self, other: Self) -> Selfwhere
Self: Sized,
fn min(self, other: Self) -> Selfwhere
Self: Sized,
Source§impl PartialOrd for CastKind
impl PartialOrd for CastKind
Source§impl<__State: ?Sized> SerializeState<__State> for CastKindwhere
ScalarTy: SerializeState<__State>,
Ty: SerializeState<__State>,
UnsizingMetadata: SerializeState<__State>,
MetadataPath: SerializeState<__State>,
impl<__State: ?Sized> SerializeState<__State> for CastKindwhere
ScalarTy: SerializeState<__State>,
Ty: SerializeState<__State>,
UnsizingMetadata: SerializeState<__State>,
MetadataPath: SerializeState<__State>,
fn serialize_state<__S>(
&self,
__state: &__State,
__serializer: __S,
) -> Result<__S::Ok, __S::Error>where
__S: Serializer,
impl StructuralPartialEq for CastKind
Auto Trait Implementations§
impl Freeze for CastKind
impl RefUnwindSafe for CastKind
impl Send for CastKind
impl Sync for CastKind
impl Unpin for CastKind
impl UnsafeUnpin for CastKind
impl UnwindSafe for CastKind
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 type_info(&self) -> TypeInfo
fn type_info(&self) -> TypeInfo
TypeInfo.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.Source§fn has_escaping_region_var(&self) -> bool
fn has_escaping_region_var(&self) -> bool
Source§fn collect_regions(&self) -> SeqHashSet<Region>
fn collect_regions(&self) -> SeqHashSet<Region>
self.