about summary refs log tree commit diff
diff options
context:
space:
mode:
authorSantiago Pastorino <spastorino@gmail.com>2019-10-07 19:35:41 -0300
committerSantiago Pastorino <spastorino@gmail.com>2019-10-17 22:06:55 -0400
commit39c9ed3ac19b3f6c79069d32a317daa763371369 (patch)
treedb4883499881cb07a42969dec81dd12e6c066e94
parent0fc063f15936761024183a3bb3790684d5de3bd3 (diff)
downloadrust-39c9ed3ac19b3f6c79069d32a317daa763371369.tar.gz
rust-39c9ed3ac19b3f6c79069d32a317daa763371369.zip
Prepare erase_regions MutVisitor to have projections interned
-rw-r--r--src/librustc_mir/transform/erase_regions.rs21
1 files changed, 20 insertions, 1 deletions
diff --git a/src/librustc_mir/transform/erase_regions.rs b/src/librustc_mir/transform/erase_regions.rs
index e9ce84a2583..132149d5d43 100644
--- a/src/librustc_mir/transform/erase_regions.rs
+++ b/src/librustc_mir/transform/erase_regions.rs
@@ -7,7 +7,7 @@
 use rustc::ty::subst::SubstsRef;
 use rustc::ty::{self, Ty, TyCtxt};
 use rustc::mir::*;
-use rustc::mir::visit::{MutVisitor, TyContext};
+use rustc::mir::visit::{MutVisitor, PlaceContext, TyContext};
 use crate::transform::{MirPass, MirSource};
 
 struct EraseRegionsVisitor<'tcx> {
@@ -38,6 +38,25 @@ impl MutVisitor<'tcx> for EraseRegionsVisitor<'tcx> {
     fn visit_substs(&mut self, substs: &mut SubstsRef<'tcx>, _: Location) {
         *substs = self.tcx.erase_regions(substs);
     }
+
+    fn visit_place(
+        &mut self,
+        place: &mut Place<'tcx>,
+        context: PlaceContext,
+        location: Location,
+    ) {
+        self.visit_place_base(&mut place.base, context, location);
+
+        let new_projection: Vec<_> = place.projection.iter().map(|elem|
+            if let PlaceElem::Field(field, ty) = elem {
+                PlaceElem::Field(*field, self.tcx.erase_regions(ty))
+            } else {
+                elem.clone()
+            }
+        ).collect();
+
+        place.projection = new_projection.into_boxed_slice();
+    }
 }
 
 pub struct EraseRegions;