about summary refs log tree commit diff
path: root/src/librustc_mir
diff options
context:
space:
mode:
authorCorey Farwell <coreyf@rwell.org>2017-03-22 23:38:02 -0400
committerGitHub <noreply@github.com>2017-03-22 23:38:02 -0400
commit39e4a272049f00f55208c04fa8c6a8dfcdbe4c8a (patch)
tree7a4b783f1be5bb2fd41f0ffc68b4525f99330b42 /src/librustc_mir
parenta419ce9406e198d3d336185d6feff97051701eae (diff)
parent45deab4a2c5d0674cac0fd260da4b8c0d46f7aa2 (diff)
downloadrust-39e4a272049f00f55208c04fa8c6a8dfcdbe4c8a.tar.gz
rust-39e4a272049f00f55208c04fa8c6a8dfcdbe4c8a.zip
Rollup merge of #40678 - michaelwoerister:dmi-prep, r=nikomatsakis
Some preparations for directly computing the ICH of crate-metadata.

This PR contains some small fixes in preparation for direct metadata hashing. It mostly just moves stuff into places where it will be needed (making the module structure slightly cleaner along the way) and it fixes some omissions in the MIR region eraser.

r? @nikomatsakis
Diffstat (limited to 'src/librustc_mir')
-rw-r--r--src/librustc_mir/transform/erase_regions.rs28
1 files changed, 27 insertions, 1 deletions
diff --git a/src/librustc_mir/transform/erase_regions.rs b/src/librustc_mir/transform/erase_regions.rs
index cebd9dd9668..0f869e7ed02 100644
--- a/src/librustc_mir/transform/erase_regions.rs
+++ b/src/librustc_mir/transform/erase_regions.rs
@@ -13,7 +13,7 @@
 //! care erasing regions all over the place.
 
 use rustc::ty::subst::Substs;
-use rustc::ty::{Ty, TyCtxt};
+use rustc::ty::{Ty, TyCtxt, ReErased, ClosureSubsts};
 use rustc::mir::*;
 use rustc::mir::visit::MutVisitor;
 use rustc::mir::transform::{MirPass, MirSource, Pass};
@@ -39,6 +39,32 @@ impl<'a, 'tcx> MutVisitor<'tcx> for EraseRegionsVisitor<'a, 'tcx> {
     fn visit_substs(&mut self, substs: &mut &'tcx Substs<'tcx>) {
         *substs = self.tcx.erase_regions(&{*substs});
     }
+
+    fn visit_rvalue(&mut self, rvalue: &mut Rvalue<'tcx>, location: Location) {
+        match *rvalue {
+            Rvalue::Ref(ref mut r, _, _) => {
+                *r = self.tcx.mk_region(ReErased);
+            }
+            Rvalue::Use(..) |
+            Rvalue::Repeat(..) |
+            Rvalue::Len(..) |
+            Rvalue::Cast(..) |
+            Rvalue::BinaryOp(..) |
+            Rvalue::CheckedBinaryOp(..) |
+            Rvalue::UnaryOp(..) |
+            Rvalue::Discriminant(..) |
+            Rvalue::Box(..) |
+            Rvalue::Aggregate(..) => {
+                // These variants don't contain regions.
+            }
+        }
+        self.super_rvalue(rvalue, location);
+    }
+
+    fn visit_closure_substs(&mut self,
+                            substs: &mut ClosureSubsts<'tcx>) {
+        *substs = self.tcx.erase_regions(substs);
+    }
 }
 
 pub struct EraseRegions;