Separate RemoveFalseEdges from SimplifyBranches
Otherwise dataflow state will propagate along false edges and cause
things to be marked as maybe init unnecessarily. These should be
separate, since `SimplifyBranches` also makes `if true {} else {}` into
a `goto`, which means we wouldn't lint anything in the `else` block.
This commit is contained in:
29
compiler/rustc_mir_transform/src/remove_false_edges.rs
Normal file
29
compiler/rustc_mir_transform/src/remove_false_edges.rs
Normal file
@@ -0,0 +1,29 @@
|
||||
use rustc_middle::mir::{Body, TerminatorKind};
|
||||
use rustc_middle::ty::TyCtxt;
|
||||
|
||||
use crate::MirPass;
|
||||
|
||||
/// Removes `FalseEdge` and `FalseUnwind` terminators from the MIR.
|
||||
///
|
||||
/// These are only needed for borrow checking, and can be removed afterwards.
|
||||
///
|
||||
/// FIXME: This should probably have its own MIR phase.
|
||||
pub struct RemoveFalseEdges;
|
||||
|
||||
impl<'tcx> MirPass<'tcx> for RemoveFalseEdges {
|
||||
fn run_pass(&self, _: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
|
||||
for block in body.basic_blocks_mut() {
|
||||
let terminator = block.terminator_mut();
|
||||
terminator.kind = match terminator.kind {
|
||||
TerminatorKind::FalseEdge { real_target, .. } => {
|
||||
TerminatorKind::Goto { target: real_target }
|
||||
}
|
||||
TerminatorKind::FalseUnwind { real_target, .. } => {
|
||||
TerminatorKind::Goto { target: real_target }
|
||||
}
|
||||
|
||||
_ => continue,
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user