summaryrefslogtreecommitdiffstats
path: root/compiler/rustc_mir_transform/src/remove_uninit_drops.rs
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/rustc_mir_transform/src/remove_uninit_drops.rs')
-rw-r--r--compiler/rustc_mir_transform/src/remove_uninit_drops.rs28
1 files changed, 8 insertions, 20 deletions
diff --git a/compiler/rustc_mir_transform/src/remove_uninit_drops.rs b/compiler/rustc_mir_transform/src/remove_uninit_drops.rs
index 78b6f714a..1f9e521d3 100644
--- a/compiler/rustc_mir_transform/src/remove_uninit_drops.rs
+++ b/compiler/rustc_mir_transform/src/remove_uninit_drops.rs
@@ -1,14 +1,15 @@
use rustc_index::bit_set::ChunkedBitSet;
-use rustc_middle::mir::{Body, Field, Rvalue, Statement, StatementKind, TerminatorKind};
+use rustc_middle::mir::{Body, TerminatorKind};
use rustc_middle::ty::subst::SubstsRef;
use rustc_middle::ty::{self, ParamEnv, Ty, TyCtxt, VariantDef};
use rustc_mir_dataflow::impls::MaybeInitializedPlaces;
use rustc_mir_dataflow::move_paths::{LookupResult, MoveData, MovePathIndex};
use rustc_mir_dataflow::{self, move_path_children_matching, Analysis, MoveDataParamEnv};
+use rustc_target::abi::FieldIdx;
use crate::MirPass;
-/// Removes `Drop` and `DropAndReplace` terminators whose target is known to be uninitialized at
+/// Removes `Drop` terminators whose target is known to be uninitialized at
/// that point.
///
/// This is redundant with drop elaboration, but we need to do it prior to const-checking, and
@@ -37,8 +38,7 @@ impl<'tcx> MirPass<'tcx> for RemoveUninitDrops {
let mut to_remove = vec![];
for (bb, block) in body.basic_blocks.iter_enumerated() {
let terminator = block.terminator();
- let (TerminatorKind::Drop { place, .. } | TerminatorKind::DropAndReplace { place, .. })
- = &terminator.kind
+ let TerminatorKind::Drop { place, .. } = &terminator.kind
else { continue };
maybe_inits.seek_before_primary_effect(body.terminator_loc(bb));
@@ -64,24 +64,12 @@ impl<'tcx> MirPass<'tcx> for RemoveUninitDrops {
for bb in to_remove {
let block = &mut body.basic_blocks_mut()[bb];
- let (TerminatorKind::Drop { target, .. } | TerminatorKind::DropAndReplace { target, .. })
+ let TerminatorKind::Drop { target, .. }
= &block.terminator().kind
else { unreachable!() };
// Replace block terminator with `Goto`.
- let target = *target;
- let old_terminator_kind = std::mem::replace(
- &mut block.terminator_mut().kind,
- TerminatorKind::Goto { target },
- );
-
- // If this is a `DropAndReplace`, we need to emulate the assignment to the return place.
- if let TerminatorKind::DropAndReplace { place, value, .. } = old_terminator_kind {
- block.statements.push(Statement {
- source_info: block.terminator().source_info,
- kind: StatementKind::Assign(Box::new((place, Rvalue::Use(value)))),
- });
- }
+ block.terminator_mut().kind = TerminatorKind::Goto { target: *target };
}
}
}
@@ -143,7 +131,7 @@ fn is_needs_drop_and_init<'tcx>(
.fields
.iter()
.enumerate()
- .map(|(f, field)| (Field::from_usize(f), field.ty(tcx, substs), mpi))
+ .map(|(f, field)| (FieldIdx::from_usize(f), field.ty(tcx, substs), mpi))
.any(field_needs_drop_and_init)
})
}
@@ -151,7 +139,7 @@ fn is_needs_drop_and_init<'tcx>(
ty::Tuple(fields) => fields
.iter()
.enumerate()
- .map(|(f, f_ty)| (Field::from_usize(f), f_ty, mpi))
+ .map(|(f, f_ty)| (FieldIdx::from_usize(f), f_ty, mpi))
.any(field_needs_drop_and_init),
_ => true,