about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMatthew Jasper <mjjasper1@gmail.com>2020-06-18 18:09:18 +0100
committerMatthew Jasper <mjjasper1@gmail.com>2020-06-18 18:09:18 +0100
commitaa117047f05bba9b6838a773a64aaa8f04f51208 (patch)
tree8a8a83ee620c6d1f3c17eb53ef3794e0c25d32bc
parente9b0ce8afa5635d3825b5e76e0b3593d9086778a (diff)
downloadrust-aa117047f05bba9b6838a773a64aaa8f04f51208.tar.gz
rust-aa117047f05bba9b6838a773a64aaa8f04f51208.zip
Add helper method for reusing an existing interned region
-rw-r--r--src/librustc_infer/infer/canonical/canonicalizer.rs8
-rw-r--r--src/librustc_infer/infer/resolve.rs2
-rw-r--r--src/librustc_middle/ty/context.rs7
3 files changed, 9 insertions, 8 deletions
diff --git a/src/librustc_infer/infer/canonical/canonicalizer.rs b/src/librustc_infer/infer/canonical/canonicalizer.rs
index 8695b9616ee..f1235aa243a 100644
--- a/src/librustc_infer/infer/canonical/canonicalizer.rs
+++ b/src/librustc_infer/infer/canonical/canonicalizer.rs
@@ -326,13 +326,7 @@ impl<'cx, 'tcx> TypeFolder<'tcx> for Canonicalizer<'cx, 'tcx> {
                      opportunistically resolved to {:?}",
                     vid, r
                 );
-                // micro-optimize -- avoid an interner look-up if the vid
-                // hasn't changed.
-                let r = if vid == resolved_vid {
-                    r
-                } else {
-                    self.tcx.mk_region(ty::ReVar(resolved_vid))
-                };
+                let r = self.tcx.reuse_or_mk_region(r, ty::ReVar(resolved_vid));
                 self.canonicalize_region_mode.canonicalize_free_region(self, r)
             }
 
diff --git a/src/librustc_infer/infer/resolve.rs b/src/librustc_infer/infer/resolve.rs
index bda38301f1c..d8a215792b0 100644
--- a/src/librustc_infer/infer/resolve.rs
+++ b/src/librustc_infer/infer/resolve.rs
@@ -85,7 +85,7 @@ impl<'a, 'tcx> TypeFolder<'tcx> for OpportunisticRegionResolver<'a, 'tcx> {
                     .borrow_mut()
                     .unwrap_region_constraints()
                     .opportunistic_resolve_var(rid);
-                if resolved == rid { r } else { self.tcx().mk_region(ty::ReVar(resolved)) }
+                self.tcx().reuse_or_mk_region(r, ty::ReVar(resolved))
             }
             _ => r,
         }
diff --git a/src/librustc_middle/ty/context.rs b/src/librustc_middle/ty/context.rs
index d5be3508d2d..f64d1702625 100644
--- a/src/librustc_middle/ty/context.rs
+++ b/src/librustc_middle/ty/context.rs
@@ -2081,6 +2081,13 @@ impl<'tcx> TyCtxt<'tcx> {
         })
     }
 
+    /// Same a `self.mk_region(kind)`, but avoids accessing the interners if
+    /// `*r == kind`.
+    #[inline]
+    pub fn reuse_or_mk_region(self, r: Region<'tcx>, kind: RegionKind) -> Region<'tcx> {
+        if *r == kind { r } else { self.mk_region(kind) }
+    }
+
     #[allow(rustc::usage_of_ty_tykind)]
     #[inline]
     pub fn mk_ty(&self, st: TyKind<'tcx>) -> Ty<'tcx> {