[−][src]Struct rustc_mir::transform::generator::EnsureGeneratorFieldAssignmentsNeverAlias
Looks for any assignments between locals (e.g., _4 = _5) that will both be converted to fields
in the generator state machine but whose storage is not marked as conflicting
Validation needs to happen immediately before TransformVisitor is invoked, not after.
This condition would arise when the assignment is the last use of _5 but the initial
definition of _4 if we weren't extra careful to mark all locals used inside a statement as
conflicting. Non-conflicting generator saved locals may be stored at the same location within
the generator state machine, which would result in ill-formed MIR: the left-hand and right-hand
sides of an assignment may not alias. This caused a miscompilation in #73137.
Fields
saved_locals: &'a GeneratorSavedLocalsstorage_conflicts: &'a BitMatrix<GeneratorSavedLocal, GeneratorSavedLocal>assigned_local: Option<GeneratorSavedLocal>Implementations
impl<'_> EnsureGeneratorFieldAssignmentsNeverAlias<'_>[src]
pub(in transform::generator) fn saved_local_for_direct_place(
&self,
place: Place<'_>
) -> Option<GeneratorSavedLocal>[src]
&self,
place: Place<'_>
) -> Option<GeneratorSavedLocal>
pub(in transform::generator) fn check_assigned_place<'tcx>(
&mut self,
place: Place<'tcx>,
f: impl FnOnce(&mut Self)
)[src]
&mut self,
place: Place<'tcx>,
f: impl FnOnce(&mut Self)
)
Trait Implementations
impl<'tcx, '_> Visitor<'tcx> for EnsureGeneratorFieldAssignmentsNeverAlias<'_>[src]
pub fn visit_place(
&mut self,
place: &Place<'tcx>,
context: PlaceContext,
location: Location
)[src]
&mut self,
place: &Place<'tcx>,
context: PlaceContext,
location: Location
)
pub fn visit_statement(
&mut self,
statement: &Statement<'tcx>,
location: Location
)[src]
&mut self,
statement: &Statement<'tcx>,
location: Location
)
pub fn visit_terminator(
&mut self,
terminator: &Terminator<'tcx>,
location: Location
)[src]
&mut self,
terminator: &Terminator<'tcx>,
location: Location
)
pub fn visit_body(&mut self, body: &Body<'tcx>)[src]
pub fn visit_basic_block_data(
&mut self,
block: BasicBlock,
data: &BasicBlockData<'tcx>
)[src]
&mut self,
block: BasicBlock,
data: &BasicBlockData<'tcx>
)
pub fn visit_source_scope_data(&mut self, scope_data: &SourceScopeData<'tcx>)[src]
pub fn visit_assign(
&mut self,
place: &Place<'tcx>,
rvalue: &Rvalue<'tcx>,
location: Location
)[src]
&mut self,
place: &Place<'tcx>,
rvalue: &Rvalue<'tcx>,
location: Location
)
pub fn visit_assert_message(
&mut self,
msg: &AssertKind<Operand<'tcx>>,
location: Location
)[src]
&mut self,
msg: &AssertKind<Operand<'tcx>>,
location: Location
)
pub fn visit_rvalue(&mut self, rvalue: &Rvalue<'tcx>, location: Location)[src]
pub fn visit_operand(&mut self, operand: &Operand<'tcx>, location: Location)[src]
pub fn visit_ascribe_user_ty(
&mut self,
place: &Place<'tcx>,
variance: &Variance,
user_ty: &UserTypeProjection,
location: Location
)[src]
&mut self,
place: &Place<'tcx>,
variance: &Variance,
user_ty: &UserTypeProjection,
location: Location
)
pub fn visit_coverage(&mut self, coverage: &Coverage, location: Location)[src]
pub fn visit_retag(
&mut self,
kind: &RetagKind,
place: &Place<'tcx>,
location: Location
)[src]
&mut self,
kind: &RetagKind,
place: &Place<'tcx>,
location: Location
)
pub fn visit_projection(
&mut self,
local: Local,
projection: &[ProjectionElem<Local, &'tcx TyS<'tcx>>],
context: PlaceContext,
location: Location
)[src]
&mut self,
local: Local,
projection: &[ProjectionElem<Local, &'tcx TyS<'tcx>>],
context: PlaceContext,
location: Location
)
pub fn visit_projection_elem(
&mut self,
local: Local,
proj_base: &[ProjectionElem<Local, &'tcx TyS<'tcx>>],
elem: ProjectionElem<Local, &'tcx TyS<'tcx>>,
context: PlaceContext,
location: Location
)[src]
&mut self,
local: Local,
proj_base: &[ProjectionElem<Local, &'tcx TyS<'tcx>>],
elem: ProjectionElem<Local, &'tcx TyS<'tcx>>,
context: PlaceContext,
location: Location
)
pub fn super_place(
&mut self,
place: &Place<'tcx>,
context: PlaceContext,
location: Location
)[src]
&mut self,
place: &Place<'tcx>,
context: PlaceContext,
location: Location
)
pub fn super_projection(
&mut self,
local: Local,
projection: &[ProjectionElem<Local, &'tcx TyS<'tcx>>],
context: PlaceContext,
location: Location
)[src]
&mut self,
local: Local,
projection: &[ProjectionElem<Local, &'tcx TyS<'tcx>>],
context: PlaceContext,
location: Location
)
pub fn super_projection_elem(
&mut self,
_local: Local,
_proj_base: &[ProjectionElem<Local, &'tcx TyS<'tcx>>],
elem: ProjectionElem<Local, &'tcx TyS<'tcx>>,
_context: PlaceContext,
location: Location
)[src]
&mut self,
_local: Local,
_proj_base: &[ProjectionElem<Local, &'tcx TyS<'tcx>>],
elem: ProjectionElem<Local, &'tcx TyS<'tcx>>,
_context: PlaceContext,
location: Location
)
pub fn visit_constant(&mut self, constant: &Constant<'tcx>, location: Location)[src]
pub fn visit_span(&mut self, span: &Span)[src]
pub fn visit_source_info(&mut self, source_info: &SourceInfo)[src]
pub fn visit_ty(&mut self, ty: &'tcx TyS<'tcx>, TyContext)[src]
pub fn visit_user_type_projection(&mut self, ty: &UserTypeProjection)[src]
pub fn visit_user_type_annotation(
&mut self,
index: UserTypeAnnotationIndex,
ty: &CanonicalUserTypeAnnotation<'tcx>
)[src]
&mut self,
index: UserTypeAnnotationIndex,
ty: &CanonicalUserTypeAnnotation<'tcx>
)
pub fn visit_region(&mut self, region: &&'tcx RegionKind, Location)[src]
pub fn visit_const(&mut self, constant: &&'tcx Const<'tcx>, Location)[src]
pub fn visit_substs(&mut self, substs: &&'tcx List<GenericArg<'tcx>>, Location)[src]
pub fn visit_local_decl(&mut self, local: Local, local_decl: &LocalDecl<'tcx>)[src]
pub fn visit_var_debug_info(&mut self, var_debug_info: &VarDebugInfo<'tcx>)[src]
pub fn visit_local(
&mut self,
_local: &Local,
_context: PlaceContext,
_location: Location
)[src]
&mut self,
_local: &Local,
_context: PlaceContext,
_location: Location
)
pub fn visit_source_scope(&mut self, scope: &SourceScope)[src]
pub fn super_body(&mut self, body: &Body<'tcx>)[src]
pub fn super_basic_block_data(
&mut self,
block: BasicBlock,
data: &BasicBlockData<'tcx>
)[src]
&mut self,
block: BasicBlock,
data: &BasicBlockData<'tcx>
)
pub fn super_source_scope_data(&mut self, scope_data: &SourceScopeData<'tcx>)[src]
pub fn super_statement(
&mut self,
statement: &Statement<'tcx>,
location: Location
)[src]
&mut self,
statement: &Statement<'tcx>,
location: Location
)
pub fn super_assign(
&mut self,
place: &Place<'tcx>,
rvalue: &Rvalue<'tcx>,
location: Location
)[src]
&mut self,
place: &Place<'tcx>,
rvalue: &Rvalue<'tcx>,
location: Location
)
pub fn super_terminator(
&mut self,
terminator: &Terminator<'tcx>,
location: Location
)[src]
&mut self,
terminator: &Terminator<'tcx>,
location: Location
)
pub fn super_assert_message(
&mut self,
msg: &AssertKind<Operand<'tcx>>,
location: Location
)[src]
&mut self,
msg: &AssertKind<Operand<'tcx>>,
location: Location
)
pub fn super_rvalue(&mut self, rvalue: &Rvalue<'tcx>, location: Location)[src]
pub fn super_operand(&mut self, operand: &Operand<'tcx>, location: Location)[src]
pub fn super_ascribe_user_ty(
&mut self,
place: &Place<'tcx>,
_variance: &Variance,
user_ty: &UserTypeProjection,
location: Location
)[src]
&mut self,
place: &Place<'tcx>,
_variance: &Variance,
user_ty: &UserTypeProjection,
location: Location
)
pub fn super_coverage(&mut self, _coverage: &Coverage, _location: Location)[src]
pub fn super_retag(
&mut self,
_kind: &RetagKind,
place: &Place<'tcx>,
location: Location
)[src]
&mut self,
_kind: &RetagKind,
place: &Place<'tcx>,
location: Location
)
pub fn super_local_decl(&mut self, local: Local, local_decl: &LocalDecl<'tcx>)[src]
pub fn super_var_debug_info(&mut self, var_debug_info: &VarDebugInfo<'tcx>)[src]
pub fn super_source_scope(&mut self, _scope: &SourceScope)[src]
pub fn super_constant(&mut self, constant: &Constant<'tcx>, location: Location)[src]
pub fn super_span(&mut self, _span: &Span)[src]
pub fn super_source_info(&mut self, source_info: &SourceInfo)[src]
pub fn super_user_type_projection(&mut self, _ty: &UserTypeProjection)[src]
pub fn super_user_type_annotation(
&mut self,
_index: UserTypeAnnotationIndex,
ty: &CanonicalUserTypeAnnotation<'tcx>
)[src]
&mut self,
_index: UserTypeAnnotationIndex,
ty: &CanonicalUserTypeAnnotation<'tcx>
)
pub fn super_ty(&mut self, _ty: &'tcx TyS<'tcx>)[src]
pub fn super_region(&mut self, _region: &&'tcx RegionKind)[src]
pub fn super_const(&mut self, _const: &&'tcx Const<'tcx>)[src]
pub fn super_substs(&mut self, _substs: &&'tcx List<GenericArg<'tcx>>)[src]
pub fn visit_location(&mut self, body: &Body<'tcx>, location: Location)[src]
Auto Trait Implementations
impl<'a> RefUnwindSafe for EnsureGeneratorFieldAssignmentsNeverAlias<'a>
impl<'a> Send for EnsureGeneratorFieldAssignmentsNeverAlias<'a>
impl<'a> Sync for EnsureGeneratorFieldAssignmentsNeverAlias<'a>
impl<'a> Unpin for EnsureGeneratorFieldAssignmentsNeverAlias<'a>
impl<'a> UnwindSafe for EnsureGeneratorFieldAssignmentsNeverAlias<'a>
Blanket Implementations
impl<T> Any for T where
T: 'static + ?Sized, [src]
T: 'static + ?Sized,
impl<T> Borrow<T> for T where
T: ?Sized, [src]
T: ?Sized,
impl<T> BorrowMut<T> for T where
T: ?Sized, [src]
T: ?Sized,
pub fn borrow_mut(&mut self) -> &mut T[src]
impl<T> From<T> for T[src]
impl<T, U> Into<U> for T where
U: From<T>, [src]
U: From<T>,
impl<T, U> TryFrom<U> for T where
U: Into<T>, [src]
U: Into<T>,
type Error = Infallible
The type returned in the event of a conversion error.
pub fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>[src]
impl<T, U> TryInto<U> for T where
U: TryFrom<T>, [src]
U: TryFrom<T>,
type Error = <U as TryFrom<T>>::Error
The type returned in the event of a conversion error.