Skip to content

Commit 2f733aa

Browse files
committed
qualify_consts: extract remove_drop_and_storage_dead_on_promoted_locals.
1 parent 8af33b3 commit 2f733aa

File tree

1 file changed

+34
-29
lines changed

1 file changed

+34
-29
lines changed

src/librustc_mir/transform/qualify_consts.rs

+34-29
Original file line numberDiff line numberDiff line change
@@ -1656,35 +1656,7 @@ impl<'tcx> MirPass<'tcx> for QualifyAndPromoteConstants<'tcx> {
16561656
Mode::Const => tcx.mir_const_qualif(def_id).1,
16571657
_ => Checker::new(tcx, def_id, body, mode).check_const().1,
16581658
};
1659-
1660-
// In `const` and `static` everything without `StorageDead`
1661-
// is `'static`, we don't have to create promoted MIR fragments,
1662-
// just remove `Drop` and `StorageDead` on "promoted" locals.
1663-
debug!("run_pass: promoted_temps={:?}", promoted_temps);
1664-
for block in body.basic_blocks_mut() {
1665-
block.statements.retain(|statement| {
1666-
match statement.kind {
1667-
StatementKind::StorageDead(index) => {
1668-
!promoted_temps.contains(index)
1669-
}
1670-
_ => true
1671-
}
1672-
});
1673-
let terminator = block.terminator_mut();
1674-
match terminator.kind {
1675-
TerminatorKind::Drop {
1676-
location: Place {
1677-
base: PlaceBase::Local(index),
1678-
projection: None,
1679-
},
1680-
target,
1681-
..
1682-
} if promoted_temps.contains(index) => {
1683-
terminator.kind = TerminatorKind::Goto { target };
1684-
}
1685-
_ => {}
1686-
}
1687-
}
1659+
remove_drop_and_storage_dead_on_promoted_locals(body, promoted_temps);
16881660
}
16891661

16901662
if let Mode::Static = mode {
@@ -1738,6 +1710,39 @@ fn check_short_circuiting_in_const_local(tcx: TyCtxt<'_>, body: &mut Body<'tcx>,
17381710
}
17391711
}
17401712

1713+
/// In `const` and `static` everything without `StorageDead`
1714+
/// is `'static`, we don't have to create promoted MIR fragments,
1715+
/// just remove `Drop` and `StorageDead` on "promoted" locals.
1716+
fn remove_drop_and_storage_dead_on_promoted_locals(
1717+
body: &mut Body<'tcx>,
1718+
promoted_temps: &BitSet<Local>,
1719+
) {
1720+
debug!("run_pass: promoted_temps={:?}", promoted_temps);
1721+
1722+
for block in body.basic_blocks_mut() {
1723+
block.statements.retain(|statement| {
1724+
match statement.kind {
1725+
StatementKind::StorageDead(index) => !promoted_temps.contains(index),
1726+
_ => true
1727+
}
1728+
});
1729+
let terminator = block.terminator_mut();
1730+
match terminator.kind {
1731+
TerminatorKind::Drop {
1732+
location: Place {
1733+
base: PlaceBase::Local(index),
1734+
projection: None,
1735+
},
1736+
target,
1737+
..
1738+
} if promoted_temps.contains(index) => {
1739+
terminator.kind = TerminatorKind::Goto { target };
1740+
}
1741+
_ => {}
1742+
}
1743+
}
1744+
}
1745+
17411746
fn check_non_thread_local_static_is_sync(
17421747
tcx: TyCtxt<'tcx>,
17431748
body: &mut Body<'tcx>,

0 commit comments

Comments
 (0)