summaryrefslogtreecommitdiffstats
path: root/compiler/rustc_mir_dataflow/src/drop_flag_effects.rs
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-06-07 05:48:48 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-06-07 05:48:48 +0000
commitef24de24a82fe681581cc130f342363c47c0969a (patch)
tree0d494f7e1a38b95c92426f58fe6eaa877303a86c /compiler/rustc_mir_dataflow/src/drop_flag_effects.rs
parentReleasing progress-linux version 1.74.1+dfsg1-1~progress7.99u1. (diff)
downloadrustc-ef24de24a82fe681581cc130f342363c47c0969a.tar.xz
rustc-ef24de24a82fe681581cc130f342363c47c0969a.zip
Merging upstream version 1.75.0+dfsg1.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'compiler/rustc_mir_dataflow/src/drop_flag_effects.rs')
-rw-r--r--compiler/rustc_mir_dataflow/src/drop_flag_effects.rs83
1 files changed, 1 insertions, 82 deletions
diff --git a/compiler/rustc_mir_dataflow/src/drop_flag_effects.rs b/compiler/rustc_mir_dataflow/src/drop_flag_effects.rs
index 0d466bbe5..163d74cc9 100644
--- a/compiler/rustc_mir_dataflow/src/drop_flag_effects.rs
+++ b/compiler/rustc_mir_dataflow/src/drop_flag_effects.rs
@@ -1,6 +1,6 @@
use crate::elaborate_drops::DropFlagState;
use rustc_middle::mir::{self, Body, Location, Terminator, TerminatorKind};
-use rustc_middle::ty::{self, TyCtxt};
+use rustc_middle::ty::TyCtxt;
use rustc_target::abi::VariantIdx;
use super::indexes::MovePathIndex;
@@ -55,60 +55,6 @@ pub fn on_all_children_bits<'tcx, F>(
) where
F: FnMut(MovePathIndex),
{
- #[inline]
- fn is_terminal_path<'tcx>(
- tcx: TyCtxt<'tcx>,
- body: &Body<'tcx>,
- move_data: &MoveData<'tcx>,
- path: MovePathIndex,
- ) -> bool {
- let place = move_data.move_paths[path].place;
-
- // When enumerating the child fragments of a path, don't recurse into
- // paths (1.) past arrays, slices, and pointers, nor (2.) into a type
- // that implements `Drop`.
- //
- // Places behind references or arrays are not tracked by elaboration
- // and are always assumed to be initialized when accessible. As
- // references and indexes can be reseated, trying to track them can
- // only lead to trouble.
- //
- // Places behind ADT's with a Drop impl are not tracked by
- // elaboration since they can never have a drop-flag state that
- // differs from that of the parent with the Drop impl.
- //
- // In both cases, the contents can only be accessed if and only if
- // their parents are initialized. This implies for example that there
- // is no need to maintain separate drop flags to track such state.
- //
- // FIXME: we have to do something for moving slice patterns.
- let ty = place.ty(body, tcx).ty;
- match ty.kind() {
- ty::Adt(def, _) if (def.has_dtor(tcx) && !def.is_box()) || def.is_union() => {
- debug!(
- "place_contents_drop_state_cannot_differ place: {:?} ty: {:?} Drop => true",
- place, ty
- );
- true
- }
- ty::Array(..) => {
- debug!(
- "place_contents_drop_state_cannot_differ place: {:?} ty: {:?} => false",
- place, ty
- );
- false
- }
- ty::Slice(..) | ty::Ref(..) | ty::RawPtr(..) => {
- debug!(
- "place_contents_drop_state_cannot_differ place: {:?} ty: {:?} refd => true",
- place, ty
- );
- true
- }
- _ => false,
- }
- }
-
fn on_all_children_bits<'tcx, F>(
tcx: TyCtxt<'tcx>,
body: &Body<'tcx>,
@@ -120,10 +66,6 @@ pub fn on_all_children_bits<'tcx, F>(
{
each_child(move_path_index);
- if is_terminal_path(tcx, body, move_data, move_path_index) {
- return;
- }
-
let mut next_child_index = move_data.move_paths[move_path_index].first_child;
while let Some(child_index) = next_child_index {
on_all_children_bits(tcx, body, move_data, child_index, each_child);
@@ -133,29 +75,6 @@ pub fn on_all_children_bits<'tcx, F>(
on_all_children_bits(tcx, body, move_data, move_path_index, &mut each_child);
}
-pub fn on_all_drop_children_bits<'tcx, F>(
- tcx: TyCtxt<'tcx>,
- body: &Body<'tcx>,
- ctxt: &MoveDataParamEnv<'tcx>,
- path: MovePathIndex,
- mut each_child: F,
-) where
- F: FnMut(MovePathIndex),
-{
- on_all_children_bits(tcx, body, &ctxt.move_data, path, |child| {
- let place = &ctxt.move_data.move_paths[path].place;
- let ty = place.ty(body, tcx).ty;
- debug!("on_all_drop_children_bits({:?}, {:?} : {:?})", path, place, ty);
-
- let erased_ty = tcx.erase_regions(ty);
- if erased_ty.needs_drop(tcx, ctxt.param_env) {
- each_child(child);
- } else {
- debug!("on_all_drop_children_bits - skipping")
- }
- })
-}
-
pub fn drop_flag_effects_for_function_entry<'tcx, F>(
tcx: TyCtxt<'tcx>,
body: &Body<'tcx>,