]> git.lizzy.rs Git - rust.git/blob - compiler/rustc_mir_transform/src/cleanup_post_borrowck.rs
Rollup merge of #103702 - WaffleLapkin:lift-sized-bounds-from-pointer-methods-where...
[rust.git] / compiler / rustc_mir_transform / src / cleanup_post_borrowck.rs
1 //! This module provides a pass that removes parts of MIR that are no longer relevant after
2 //! analysis phase and borrowck. In particular, it removes false edges, user type annotations and
3 //! replaces following statements with [`Nop`]s:
4 //!
5 //!   - [`AscribeUserType`]
6 //!   - [`FakeRead`]
7 //!   - [`Assign`] statements with a [`Shallow`] borrow
8 //!
9 //! [`AscribeUserType`]: rustc_middle::mir::StatementKind::AscribeUserType
10 //! [`Assign`]: rustc_middle::mir::StatementKind::Assign
11 //! [`FakeRead`]: rustc_middle::mir::StatementKind::FakeRead
12 //! [`Nop`]: rustc_middle::mir::StatementKind::Nop
13 //! [`Shallow`]: rustc_middle::mir::BorrowKind::Shallow
14
15 use crate::MirPass;
16 use rustc_middle::mir::{Body, BorrowKind, Rvalue, StatementKind, TerminatorKind};
17 use rustc_middle::ty::TyCtxt;
18
19 pub struct CleanupPostBorrowck;
20
21 impl<'tcx> MirPass<'tcx> for CleanupPostBorrowck {
22     fn run_pass(&self, _tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
23         for basic_block in body.basic_blocks.as_mut() {
24             for statement in basic_block.statements.iter_mut() {
25                 match statement.kind {
26                     StatementKind::AscribeUserType(..)
27                     | StatementKind::Assign(box (_, Rvalue::Ref(_, BorrowKind::Shallow, _)))
28                     | StatementKind::FakeRead(..) => statement.make_nop(),
29                     _ => (),
30                 }
31             }
32             let terminator = basic_block.terminator_mut();
33             match terminator.kind {
34                 TerminatorKind::FalseEdge { real_target, .. }
35                 | TerminatorKind::FalseUnwind { real_target, .. } => {
36                     terminator.kind = TerminatorKind::Goto { target: real_target };
37                 }
38                 _ => {}
39             }
40         }
41
42         body.user_type_annotations.raw.clear();
43
44         for decl in &mut body.local_decls {
45             decl.user_ty = None;
46         }
47     }
48 }