Skip to content

Commit 5c65ab4

Browse files
Make MaybeInitializedPlaces able to borrow or own its MoveData
1 parent 7e47022 commit 5c65ab4

File tree

3 files changed

+44
-18
lines changed

3 files changed

+44
-18
lines changed

src/librustc_mir/dataflow/impls/mod.rs

+34-17
Original file line numberDiff line numberDiff line change
@@ -67,15 +67,15 @@ pub use self::storage_liveness::{MaybeRequiresStorage, MaybeStorageLive};
6767
/// Similarly, at a given `drop` statement, the set-intersection
6868
/// between this data and `MaybeUninitializedPlaces` yields the set of
6969
/// places that would require a dynamic drop-flag at that statement.
70-
pub struct MaybeInitializedPlaces<'a, 'tcx> {
70+
pub struct MaybeInitializedPlaces<'a, 'tcx, M = &'a MoveDataParamEnv<'tcx>> {
7171
tcx: TyCtxt<'tcx>,
7272
body: &'a Body<'tcx>,
73-
mdpe: &'a MoveDataParamEnv<'tcx>,
73+
pub(crate) mdpe: M,
7474
mark_inactive_variants_as_uninit: bool,
7575
}
7676

77-
impl<'a, 'tcx> MaybeInitializedPlaces<'a, 'tcx> {
78-
pub fn new(tcx: TyCtxt<'tcx>, body: &'a Body<'tcx>, mdpe: &'a MoveDataParamEnv<'tcx>) -> Self {
77+
impl<'a, 'tcx, M> MaybeInitializedPlaces<'a, 'tcx, M> {
78+
pub fn new(tcx: TyCtxt<'tcx>, body: &'a Body<'tcx>, mdpe: M) -> Self {
7979
MaybeInitializedPlaces { tcx, body, mdpe, mark_inactive_variants_as_uninit: false }
8080
}
8181

@@ -85,9 +85,12 @@ impl<'a, 'tcx> MaybeInitializedPlaces<'a, 'tcx> {
8585
}
8686
}
8787

88-
impl<'a, 'tcx> HasMoveData<'tcx> for MaybeInitializedPlaces<'a, 'tcx> {
88+
impl<'a, 'tcx, M> HasMoveData<'tcx> for MaybeInitializedPlaces<'a, 'tcx, M>
89+
where
90+
M: std::borrow::Borrow<MoveDataParamEnv<'tcx>>,
91+
{
8992
fn move_data(&self) -> &MoveData<'tcx> {
90-
&self.mdpe.move_data
93+
&self.mdpe.borrow().move_data
9194
}
9295
}
9396

@@ -256,7 +259,7 @@ impl<'a, 'tcx> HasMoveData<'tcx> for EverInitializedPlaces<'a, 'tcx> {
256259
}
257260
}
258261

259-
impl<'a, 'tcx> MaybeInitializedPlaces<'a, 'tcx> {
262+
impl<'a, 'tcx, M> MaybeInitializedPlaces<'a, 'tcx, M> {
260263
fn update_bits(
261264
trans: &mut impl GenKill<MovePathIndex>,
262265
path: MovePathIndex,
@@ -295,7 +298,10 @@ impl<'a, 'tcx> DefinitelyInitializedPlaces<'a, 'tcx> {
295298
}
296299
}
297300

298-
impl<'tcx> AnalysisDomain<'tcx> for MaybeInitializedPlaces<'_, 'tcx> {
301+
impl<'tcx, M> AnalysisDomain<'tcx> for MaybeInitializedPlaces<'_, 'tcx, M>
302+
where
303+
M: std::borrow::Borrow<MoveDataParamEnv<'tcx>>,
304+
{
299305
type Idx = MovePathIndex;
300306

301307
const NAME: &'static str = "maybe_init";
@@ -305,7 +311,7 @@ impl<'tcx> AnalysisDomain<'tcx> for MaybeInitializedPlaces<'_, 'tcx> {
305311
}
306312

307313
fn initialize_start_block(&self, _: &mir::Body<'tcx>, state: &mut BitSet<Self::Idx>) {
308-
drop_flag_effects_for_function_entry(self.tcx, self.body, self.mdpe, |path, s| {
314+
drop_flag_effects_for_function_entry(self.tcx, self.body, self.mdpe.borrow(), |path, s| {
309315
assert!(s == DropFlagState::Present);
310316
state.insert(path);
311317
});
@@ -316,16 +322,23 @@ impl<'tcx> AnalysisDomain<'tcx> for MaybeInitializedPlaces<'_, 'tcx> {
316322
}
317323
}
318324

319-
impl<'tcx> GenKillAnalysis<'tcx> for MaybeInitializedPlaces<'_, 'tcx> {
325+
impl<'tcx, M> GenKillAnalysis<'tcx> for MaybeInitializedPlaces<'_, 'tcx, M>
326+
where
327+
M: std::borrow::Borrow<MoveDataParamEnv<'tcx>>,
328+
{
320329
fn statement_effect(
321330
&self,
322331
trans: &mut impl GenKill<Self::Idx>,
323332
_statement: &mir::Statement<'tcx>,
324333
location: Location,
325334
) {
326-
drop_flag_effects_for_location(self.tcx, self.body, self.mdpe, location, |path, s| {
327-
Self::update_bits(trans, path, s)
328-
})
335+
drop_flag_effects_for_location(
336+
self.tcx,
337+
self.body,
338+
self.mdpe.borrow(),
339+
location,
340+
|path, s| Self::update_bits(trans, path, s),
341+
)
329342
}
330343

331344
fn terminator_effect(
@@ -334,9 +347,13 @@ impl<'tcx> GenKillAnalysis<'tcx> for MaybeInitializedPlaces<'_, 'tcx> {
334347
_terminator: &mir::Terminator<'tcx>,
335348
location: Location,
336349
) {
337-
drop_flag_effects_for_location(self.tcx, self.body, self.mdpe, location, |path, s| {
338-
Self::update_bits(trans, path, s)
339-
})
350+
drop_flag_effects_for_location(
351+
self.tcx,
352+
self.body,
353+
self.mdpe.borrow(),
354+
location,
355+
|path, s| Self::update_bits(trans, path, s),
356+
)
340357
}
341358

342359
fn call_return_effect(
@@ -636,7 +653,7 @@ impl<'tcx> GenKillAnalysis<'tcx> for EverInitializedPlaces<'_, 'tcx> {
636653
}
637654
}
638655

639-
impl<'a, 'tcx> BottomValue for MaybeInitializedPlaces<'a, 'tcx> {
656+
impl<'a, 'tcx, M> BottomValue for MaybeInitializedPlaces<'a, 'tcx, M> {
640657
/// bottom = uninitialized
641658
const BOTTOM_VALUE: bool = false;
642659
}

src/librustc_mir/dataflow/move_paths/mod.rs

+9
Original file line numberDiff line numberDiff line change
@@ -307,6 +307,15 @@ pub enum LookupResult {
307307
Parent(Option<MovePathIndex>),
308308
}
309309

310+
impl LookupResult {
311+
pub fn expect_exact(self, s: &str) -> MovePathIndex {
312+
match self {
313+
Self::Exact(mpi) => mpi,
314+
Self::Parent(_) => panic!("{}", s),
315+
}
316+
}
317+
}
318+
310319
impl MovePathLookup {
311320
// Unlike the builder `fn move_path_for` below, this lookup
312321
// alternative will *not* create a MovePath on the fly for an

src/librustc_mir/transform/elaborate_drops.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ fn find_dead_unwinds<'tcx>(
8282
// We only need to do this pass once, because unwind edges can only
8383
// reach cleanup blocks, which can't have unwind edges themselves.
8484
let mut dead_unwinds = BitSet::new_empty(body.basic_blocks().len());
85-
let mut flow_inits = MaybeInitializedPlaces::new(tcx, body, &env)
85+
let mut flow_inits = MaybeInitializedPlaces::new(tcx, body, env)
8686
.mark_inactive_variants_as_uninit(false)
8787
.into_engine(tcx, body, def_id)
8888
.iterate_to_fixpoint()

0 commit comments

Comments
 (0)