[−][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]
fn saved_local_for_direct_place(
&self,
place: Place<'_>
) -> Option<GeneratorSavedLocal>[src]
&self,
place: Place<'_>
) -> Option<GeneratorSavedLocal>
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]
fn visit_place(
&mut self,
place: &Place<'tcx>,
context: PlaceContext,
location: Location
)[src]
&mut self,
place: &Place<'tcx>,
context: PlaceContext,
location: Location
)
fn visit_statement(&mut self, statement: &Statement<'tcx>, location: Location)[src]
fn visit_terminator(
&mut self,
terminator: &Terminator<'tcx>,
location: Location
)[src]
&mut self,
terminator: &Terminator<'tcx>,
location: Location
)
fn visit_body(&mut self, body: &Body<'tcx>)[src]
fn visit_basic_block_data(
&mut self,
block: BasicBlock,
data: &BasicBlockData<'tcx>
)[src]
&mut self,
block: BasicBlock,
data: &BasicBlockData<'tcx>
)
fn visit_source_scope_data(&mut self, scope_data: &SourceScopeData<'tcx>)[src]
fn visit_assign(
&mut self,
place: &Place<'tcx>,
rvalue: &Rvalue<'tcx>,
location: Location
)[src]
&mut self,
place: &Place<'tcx>,
rvalue: &Rvalue<'tcx>,
location: Location
)
fn visit_assert_message(
&mut self,
msg: &AssertKind<Operand<'tcx>>,
location: Location
)[src]
&mut self,
msg: &AssertKind<Operand<'tcx>>,
location: Location
)
fn visit_rvalue(&mut self, rvalue: &Rvalue<'tcx>, location: Location)[src]
fn visit_operand(&mut self, operand: &Operand<'tcx>, location: Location)[src]
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
)
fn visit_coverage(&mut self, coverage: &Coverage, location: Location)[src]
fn visit_retag(
&mut self,
kind: &RetagKind,
place: &Place<'tcx>,
location: Location
)[src]
&mut self,
kind: &RetagKind,
place: &Place<'tcx>,
location: Location
)
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
)
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
)
fn super_place(
&mut self,
place: &Place<'tcx>,
context: PlaceContext,
location: Location
)[src]
&mut self,
place: &Place<'tcx>,
context: PlaceContext,
location: Location
)
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
)
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
)
fn visit_constant(&mut self, constant: &Constant<'tcx>, location: Location)[src]
fn visit_span(&mut self, span: &Span)[src]
fn visit_source_info(&mut self, source_info: &SourceInfo)[src]
fn visit_ty(&mut self, ty: &'tcx TyS<'tcx>, TyContext)[src]
fn visit_user_type_projection(&mut self, ty: &UserTypeProjection)[src]
fn visit_user_type_annotation(
&mut self,
index: UserTypeAnnotationIndex,
ty: &CanonicalUserTypeAnnotation<'tcx>
)[src]
&mut self,
index: UserTypeAnnotationIndex,
ty: &CanonicalUserTypeAnnotation<'tcx>
)
fn visit_region(&mut self, region: &&'tcx RegionKind, Location)[src]
fn visit_const(&mut self, constant: &&'tcx Const<'tcx>, Location)[src]
fn visit_substs(&mut self, substs: &&'tcx List<GenericArg<'tcx>>, Location)[src]
fn visit_local_decl(&mut self, local: Local, local_decl: &LocalDecl<'tcx>)[src]
fn visit_var_debug_info(&mut self, var_debug_info: &VarDebugInfo<'tcx>)[src]
fn visit_local(
&mut self,
_local: &Local,
_context: PlaceContext,
_location: Location
)[src]
&mut self,
_local: &Local,
_context: PlaceContext,
_location: Location
)
fn visit_source_scope(&mut self, scope: &SourceScope)[src]
fn super_body(&mut self, body: &Body<'tcx>)[src]
fn super_basic_block_data(
&mut self,
block: BasicBlock,
data: &BasicBlockData<'tcx>
)[src]
&mut self,
block: BasicBlock,
data: &BasicBlockData<'tcx>
)
fn super_source_scope_data(&mut self, scope_data: &SourceScopeData<'tcx>)[src]
fn super_statement(&mut self, statement: &Statement<'tcx>, location: Location)[src]
fn super_assign(
&mut self,
place: &Place<'tcx>,
rvalue: &Rvalue<'tcx>,
location: Location
)[src]
&mut self,
place: &Place<'tcx>,
rvalue: &Rvalue<'tcx>,
location: Location
)
fn super_terminator(
&mut self,
terminator: &Terminator<'tcx>,
location: Location
)[src]
&mut self,
terminator: &Terminator<'tcx>,
location: Location
)
fn super_assert_message(
&mut self,
msg: &AssertKind<Operand<'tcx>>,
location: Location
)[src]
&mut self,
msg: &AssertKind<Operand<'tcx>>,
location: Location
)
fn super_rvalue(&mut self, rvalue: &Rvalue<'tcx>, location: Location)[src]
fn super_operand(&mut self, operand: &Operand<'tcx>, location: Location)[src]
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
)
fn super_coverage(&mut self, _coverage: &Coverage, _location: Location)[src]
fn super_retag(
&mut self,
_kind: &RetagKind,
place: &Place<'tcx>,
location: Location
)[src]
&mut self,
_kind: &RetagKind,
place: &Place<'tcx>,
location: Location
)
fn super_local_decl(&mut self, local: Local, local_decl: &LocalDecl<'tcx>)[src]
fn super_var_debug_info(&mut self, var_debug_info: &VarDebugInfo<'tcx>)[src]
fn super_source_scope(&mut self, _scope: &SourceScope)[src]
fn super_constant(&mut self, constant: &Constant<'tcx>, location: Location)[src]
fn super_span(&mut self, _span: &Span)[src]
fn super_source_info(&mut self, source_info: &SourceInfo)[src]
fn super_user_type_projection(&mut self, _ty: &UserTypeProjection)[src]
fn super_user_type_annotation(
&mut self,
_index: UserTypeAnnotationIndex,
ty: &CanonicalUserTypeAnnotation<'tcx>
)[src]
&mut self,
_index: UserTypeAnnotationIndex,
ty: &CanonicalUserTypeAnnotation<'tcx>
)
fn super_ty(&mut self, _ty: &'tcx TyS<'tcx>)[src]
fn super_region(&mut self, _region: &&'tcx RegionKind)[src]
fn super_const(&mut self, _const: &&'tcx Const<'tcx>)[src]
fn super_substs(&mut self, _substs: &&'tcx List<GenericArg<'tcx>>)[src]
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.