-impl<'tcx> MutVisitor<'tcx> for DeleteAscribeUserType {
- fn visit_statement(&mut self,
- block: BasicBlock,
- statement: &mut Statement<'tcx>,
- location: Location) {
- if let StatementKind::AscribeUserType(..) = statement.kind {
- statement.make_nop();
- }
- self.super_statement(block, statement, location);
- }
-}
-
-pub struct CleanFakeReadsAndBorrows;
-
-#[derive(Default)]
-pub struct DeleteAndRecordFakeReads {
- fake_borrow_temporaries: FxHashSet<Local>,
-}
-
-pub struct DeleteFakeBorrows {
- fake_borrow_temporaries: FxHashSet<Local>,
-}
-
-// Removes any FakeReads from the MIR
-impl MirPass for CleanFakeReadsAndBorrows {
- fn run_pass<'a, 'tcx>(&self,
- _tcx: TyCtxt<'a, 'tcx, 'tcx>,
- _source: MirSource<'tcx>,
- mir: &mut Mir<'tcx>) {
- let mut delete_reads = DeleteAndRecordFakeReads::default();
- delete_reads.visit_mir(mir);
- let mut delete_borrows = DeleteFakeBorrows {
- fake_borrow_temporaries: delete_reads.fake_borrow_temporaries,
- };
- delete_borrows.visit_mir(mir);
- }
-}
-
-impl<'tcx> MutVisitor<'tcx> for DeleteAndRecordFakeReads {
- fn visit_statement(&mut self,
- block: BasicBlock,
- statement: &mut Statement<'tcx>,
- location: Location) {
- if let StatementKind::FakeRead(cause, ref place) = statement.kind {
- if let FakeReadCause::ForMatchGuard = cause {
- match *place {
- Place::Local(local) => self.fake_borrow_temporaries.insert(local),
- _ => bug!("Fake match guard read of non-local: {:?}", place),
- };
- }
- statement.make_nop();
- }
- self.super_statement(block, statement, location);
- }
-}
-
-impl<'tcx> MutVisitor<'tcx> for DeleteFakeBorrows {