pub enum TerminatorKind {
Goto {
target: BlockId,
},
Switch {
data: SwitchData,
branches: IndexVec<BranchId, BlockId>,
},
Call {
call: Call,
target: BlockId,
on_unwind: BlockId,
},
Drop {
kind: DropKind,
place: Place,
fn_ptr: FnPtr,
target: BlockId,
on_unwind: BlockId,
},
InlineAsm {
asm: InlineAsm,
fallthrough: Option<BlockId>,
labels: IndexVec<BranchId, BlockId>,
on_unwind: BlockId,
},
Assert {
assert: Assert,
target: BlockId,
on_unwind: BlockId,
},
Panic {
name: Name,
on_unwind: BlockId,
},
UnwindTerminate,
UnwindResume,
Return,
UndefinedBehavior,
}Variants§
Goto
Switch
Call
Drop
Drop the value at the given place.
Depending on DropKind, this may be a real call to drop_glue, or a conditional call
that should only happen if the place has not been moved out of. See the docs of DropKind
for more details; to get precise drops use --precise-drops.
Fields
InlineAsm
An inline assembly block.
Fields
fallthrough: Option<BlockId>Next block if the control-flow continues without jumping. Absent for naked_asm! and noreturn.
labels: IndexVec<BranchId, BlockId>Targets of AsmOperand::Label operands.
Assert
Assert that the given condition holds, and if not, unwind to the given block. This is used for bounds checks, overflow checks, etc.
Panic
Call to a built-in panicking function.
UnwindTerminate
Unwinding must stop for ABI reasons or because cleanup code panicked again.
UnwindResume
Unwind out of the current function into its caller.
Return
UndefinedBehavior
Reaching this point is undefined behavior in the Rust abstract machine.
Implementations§
Source§impl TerminatorKind
impl TerminatorKind
pub fn is_goto(&self) -> bool
pub fn is_switch(&self) -> bool
pub fn is_call(&self) -> bool
pub fn is_drop(&self) -> bool
pub fn is_inline_asm(&self) -> bool
pub fn is_assert(&self) -> bool
pub fn is_panic(&self) -> bool
pub fn is_unwind_terminate(&self) -> bool
pub fn is_unwind_resume(&self) -> bool
pub fn is_return(&self) -> bool
pub fn is_undefined_behavior(&self) -> bool
Source§impl TerminatorKind
impl TerminatorKind
pub fn as_goto(&self) -> Option<&BlockId>
pub fn as_switch(&self) -> Option<(&SwitchData, &IndexVec<BranchId, BlockId>)>
pub fn as_call(&self) -> Option<(&Call, &BlockId, &BlockId)>
pub fn as_drop(&self) -> Option<(&DropKind, &Place, &FnPtr, &BlockId, &BlockId)>
pub fn as_inline_asm( &self, ) -> Option<(&InlineAsm, &Option<BlockId>, &IndexVec<BranchId, BlockId>, &BlockId)>
pub fn as_assert(&self) -> Option<(&Assert, &BlockId, &BlockId)>
pub fn as_panic(&self) -> Option<(&Name, &BlockId)>
pub fn as_unwind_terminate(&self) -> Option<()>
pub fn as_unwind_resume(&self) -> Option<()>
pub fn as_return(&self) -> Option<()>
pub fn as_undefined_behavior(&self) -> Option<()>
Source§impl TerminatorKind
impl TerminatorKind
pub fn as_goto_mut(&mut self) -> Option<&mut BlockId>
pub fn as_switch_mut( &mut self, ) -> Option<(&mut SwitchData, &mut IndexVec<BranchId, BlockId>)>
pub fn as_call_mut(&mut self) -> Option<(&mut Call, &mut BlockId, &mut BlockId)>
pub fn as_drop_mut( &mut self, ) -> Option<(&mut DropKind, &mut Place, &mut FnPtr, &mut BlockId, &mut BlockId)>
pub fn as_inline_asm_mut( &mut self, ) -> Option<(&mut InlineAsm, &mut Option<BlockId>, &mut IndexVec<BranchId, BlockId>, &mut BlockId)>
pub fn as_assert_mut( &mut self, ) -> Option<(&mut Assert, &mut BlockId, &mut BlockId)>
pub fn as_panic_mut(&mut self) -> Option<(&mut Name, &mut BlockId)>
pub fn as_unwind_terminate_mut(&mut self) -> Option<()>
pub fn as_unwind_resume_mut(&mut self) -> Option<()>
pub fn as_return_mut(&mut self) -> Option<()>
pub fn as_undefined_behavior_mut(&mut self) -> Option<()>
Trait Implementations§
Source§impl AstVisitable for TerminatorKind
impl AstVisitable for TerminatorKind
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 BodyVisitable for TerminatorKind
impl BodyVisitable for TerminatorKind
Source§fn drive_body<V: VisitBody>(&self, v: &mut V) -> ControlFlow<V::Break>
fn drive_body<V: VisitBody>(&self, v: &mut V) -> ControlFlow<V::Break>
visit_$any
method if it exists, otherwise visit_inner.Source§fn drive_body_mut<V: VisitBodyMut>(
&mut self,
v: &mut V,
) -> ControlFlow<V::Break>
fn drive_body_mut<V: VisitBodyMut>( &mut self, v: &mut V, ) -> ControlFlow<V::Break>
visit_$any
method if it exists, otherwise visit_inner.Source§fn dyn_visit_in_body<T: BodyVisitable>(&self, f: impl FnMut(&T))where
Self: Sized,
fn dyn_visit_in_body<T: BodyVisitable>(&self, f: impl FnMut(&T))where
Self: Sized,
self, in pre-order traversal.Source§fn dyn_visit_in_body_mut<T: BodyVisitable>(&mut self, f: impl FnMut(&mut T))where
Self: Sized,
fn dyn_visit_in_body_mut<T: BodyVisitable>(&mut self, f: impl FnMut(&mut T))where
Self: Sized,
self, in pre-order traversal.Source§impl Clone for TerminatorKind
impl Clone for TerminatorKind
Source§fn clone(&self) -> TerminatorKind
fn clone(&self) -> TerminatorKind
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for TerminatorKind
impl Debug for TerminatorKind
Source§impl<'de, __State: ?Sized> DeserializeState<'de, __State> for TerminatorKindwhere
BlockId: DeserializeState<'de, __State>,
SwitchData: DeserializeState<'de, __State>,
IndexVec<BranchId, BlockId>: DeserializeState<'de, __State>,
Call: DeserializeState<'de, __State>,
DropKind: DeserializeState<'de, __State>,
Place: DeserializeState<'de, __State>,
FnPtr: DeserializeState<'de, __State>,
InlineAsm: DeserializeState<'de, __State>,
Option<BlockId>: DeserializeState<'de, __State>,
Assert: DeserializeState<'de, __State>,
Name: DeserializeState<'de, __State>,
impl<'de, __State: ?Sized> DeserializeState<'de, __State> for TerminatorKindwhere
BlockId: DeserializeState<'de, __State>,
SwitchData: DeserializeState<'de, __State>,
IndexVec<BranchId, BlockId>: DeserializeState<'de, __State>,
Call: DeserializeState<'de, __State>,
DropKind: DeserializeState<'de, __State>,
Place: DeserializeState<'de, __State>,
FnPtr: DeserializeState<'de, __State>,
InlineAsm: DeserializeState<'de, __State>,
Option<BlockId>: DeserializeState<'de, __State>,
Assert: DeserializeState<'de, __State>,
Name: 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 TerminatorKind
impl<'s, V> Drive<'s, V> for TerminatorKind
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 TerminatorKindwhere
V: Visitor + VisitMut<'s, BlockId> + VisitMut<'s, SwitchData> + VisitMut<'s, IndexVec<BranchId, BlockId>> + VisitMut<'s, Call> + VisitMut<'s, DropKind> + VisitMut<'s, Place> + VisitMut<'s, FnPtr> + VisitMut<'s, InlineAsm> + VisitMut<'s, Option<BlockId>> + VisitMut<'s, Assert> + VisitMut<'s, Name>,
impl<'s, V> DriveMut<'s, V> for TerminatorKindwhere
V: Visitor + VisitMut<'s, BlockId> + VisitMut<'s, SwitchData> + VisitMut<'s, IndexVec<BranchId, BlockId>> + VisitMut<'s, Call> + VisitMut<'s, DropKind> + VisitMut<'s, Place> + VisitMut<'s, FnPtr> + VisitMut<'s, InlineAsm> + VisitMut<'s, Option<BlockId>> + VisitMut<'s, Assert> + VisitMut<'s, Name>,
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 TerminatorKindwhere
V: Visitor<Break: Default> + VisitTwo<'s, BlockId> + VisitTwo<'s, SwitchData> + VisitTwo<'s, IndexVec<BranchId, BlockId>> + VisitTwo<'s, Call> + VisitTwo<'s, DropKind> + VisitTwo<'s, Place> + VisitTwo<'s, FnPtr> + VisitTwo<'s, InlineAsm> + VisitTwo<'s, Option<BlockId>> + VisitTwo<'s, Assert> + VisitTwo<'s, Name>,
impl<'s, V> DriveTwo<'s, V> for TerminatorKindwhere
V: Visitor<Break: Default> + VisitTwo<'s, BlockId> + VisitTwo<'s, SwitchData> + VisitTwo<'s, IndexVec<BranchId, BlockId>> + VisitTwo<'s, Call> + VisitTwo<'s, DropKind> + VisitTwo<'s, Place> + VisitTwo<'s, FnPtr> + VisitTwo<'s, InlineAsm> + VisitTwo<'s, Option<BlockId>> + VisitTwo<'s, Assert> + VisitTwo<'s, Name>,
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 TerminatorKind
Source§impl PartialEq for TerminatorKind
impl PartialEq for TerminatorKind
Source§impl<__State: ?Sized> SerializeState<__State> for TerminatorKindwhere
BlockId: SerializeState<__State>,
SwitchData: SerializeState<__State>,
IndexVec<BranchId, BlockId>: SerializeState<__State>,
Call: SerializeState<__State>,
DropKind: SerializeState<__State>,
Place: SerializeState<__State>,
FnPtr: SerializeState<__State>,
InlineAsm: SerializeState<__State>,
Option<BlockId>: SerializeState<__State>,
Assert: SerializeState<__State>,
Name: SerializeState<__State>,
impl<__State: ?Sized> SerializeState<__State> for TerminatorKindwhere
BlockId: SerializeState<__State>,
SwitchData: SerializeState<__State>,
IndexVec<BranchId, BlockId>: SerializeState<__State>,
Call: SerializeState<__State>,
DropKind: SerializeState<__State>,
Place: SerializeState<__State>,
FnPtr: SerializeState<__State>,
InlineAsm: SerializeState<__State>,
Option<BlockId>: SerializeState<__State>,
Assert: SerializeState<__State>,
Name: SerializeState<__State>,
fn serialize_state<__S>(
&self,
__state: &__State,
__serializer: __S,
) -> Result<__S::Ok, __S::Error>where
__S: Serializer,
impl StructuralPartialEq for TerminatorKind
Auto Trait Implementations§
impl Freeze for TerminatorKind
impl RefUnwindSafe for TerminatorKind
impl Send for TerminatorKind
impl Sync for TerminatorKind
impl Unpin for TerminatorKind
impl UnsafeUnpin for TerminatorKind
impl UnwindSafe for TerminatorKind
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> 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> 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 collect_regions(&self) -> impl Iterator<Item = Region>
fn collect_regions(&self) -> impl Iterator<Item = Region>
self.