mirror of
				https://github.com/rust-lang/rust.git
				synced 2025-10-31 04:57:19 +00:00 
			
		
		
		
	 bb27b05104
			
		
	
	
		bb27b05104
		
	
	
	
	
		
			
			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.
		
	
			
		
			
				
	
	
		
			30 lines
		
	
	
		
			972 B
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			30 lines
		
	
	
		
			972 B
		
	
	
	
		
			Rust
		
	
	
	
	
	
| 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,
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| }
 |