Auto merge of #95125 - JakobDegen:uninit-variant-rvalue, r=oli-obk
Add new `Deinit` statement This rvalue replaces `SetDiscriminant` for ADTs. This PR is an alternative to #94590 , which only specifies that the behavior of `SetDiscriminant` is the same as what this rvalue would do. The motivation for this change are discussed in that PR and [on Zulip](https://rust-lang.zulipchat.com/#narrow/stream/189540-t-compiler.2Fwg-mir-opt/topic/SetDiscriminant.20and.20aggregate.20initialization.20.2394590) r? `@oli-obk`
This commit is contained in:
commit
625e4dd13a
128 changed files with 745 additions and 294 deletions
|
@ -1588,8 +1588,17 @@ pub enum StatementKind<'tcx> {
|
|||
FakeRead(Box<(FakeReadCause, Place<'tcx>)>),
|
||||
|
||||
/// Write the discriminant for a variant to the enum Place.
|
||||
///
|
||||
/// This is permitted for both generators and ADTs. This does not necessarily write to the
|
||||
/// entire place; instead, it writes to the minimum set of bytes as required by the layout for
|
||||
/// the type.
|
||||
SetDiscriminant { place: Box<Place<'tcx>>, variant_index: VariantIdx },
|
||||
|
||||
/// Deinitializes the place.
|
||||
///
|
||||
/// This writes `uninit` bytes to the entire place.
|
||||
Deinit(Box<Place<'tcx>>),
|
||||
|
||||
/// Start a live range for the storage of the local.
|
||||
StorageLive(Local),
|
||||
|
||||
|
@ -1739,6 +1748,7 @@ impl Debug for Statement<'_> {
|
|||
SetDiscriminant { ref place, variant_index } => {
|
||||
write!(fmt, "discriminant({:?}) = {:?}", place, variant_index)
|
||||
}
|
||||
Deinit(ref place) => write!(fmt, "Deinit({:?})", place),
|
||||
AscribeUserType(box (ref place, ref c_ty), ref variance) => {
|
||||
write!(fmt, "AscribeUserType({:?}, {:?}, {:?})", place, variance, c_ty)
|
||||
}
|
||||
|
|
|
@ -243,6 +243,7 @@ pub fn statement_kind_name(statement: &Statement<'_>) -> &'static str {
|
|||
Assign(..) => "Assign",
|
||||
FakeRead(..) => "FakeRead",
|
||||
SetDiscriminant { .. } => "SetDiscriminant",
|
||||
Deinit(..) => "Deinit",
|
||||
StorageLive(..) => "StorageLive",
|
||||
StorageDead(..) => "StorageDead",
|
||||
Retag(..) => "Retag",
|
||||
|
|
|
@ -395,10 +395,17 @@ macro_rules! make_mir_visitor {
|
|||
StatementKind::SetDiscriminant { place, .. } => {
|
||||
self.visit_place(
|
||||
place,
|
||||
PlaceContext::MutatingUse(MutatingUseContext::Store),
|
||||
PlaceContext::MutatingUse(MutatingUseContext::SetDiscriminant),
|
||||
location
|
||||
);
|
||||
}
|
||||
StatementKind::Deinit(place) => {
|
||||
self.visit_place(
|
||||
place,
|
||||
PlaceContext::MutatingUse(MutatingUseContext::Deinit),
|
||||
location
|
||||
)
|
||||
}
|
||||
StatementKind::StorageLive(local) => {
|
||||
self.visit_local(
|
||||
local,
|
||||
|
@ -1174,6 +1181,10 @@ pub enum NonMutatingUseContext {
|
|||
pub enum MutatingUseContext {
|
||||
/// Appears as LHS of an assignment.
|
||||
Store,
|
||||
/// Appears on `SetDiscriminant`
|
||||
SetDiscriminant,
|
||||
/// Appears on `Deinit`
|
||||
Deinit,
|
||||
/// Output operand of an inline assembly block.
|
||||
AsmOutput,
|
||||
/// Destination of a call.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue