diff options
| author | Santiago Pastorino <spastorino@gmail.com> | 2019-10-07 19:35:41 -0300 |
|---|---|---|
| committer | Santiago Pastorino <spastorino@gmail.com> | 2019-10-17 22:06:55 -0400 |
| commit | 39c9ed3ac19b3f6c79069d32a317daa763371369 (patch) | |
| tree | db4883499881cb07a42969dec81dd12e6c066e94 | |
| parent | 0fc063f15936761024183a3bb3790684d5de3bd3 (diff) | |
| download | rust-39c9ed3ac19b3f6c79069d32a317daa763371369.tar.gz rust-39c9ed3ac19b3f6c79069d32a317daa763371369.zip | |
Prepare erase_regions MutVisitor to have projections interned
| -rw-r--r-- | src/librustc_mir/transform/erase_regions.rs | 21 |
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; |
