]> git.lizzy.rs Git - rust.git/commitdiff
give a universe to region variables
authorSean Griffin <sean@seantheprogrammer.com>
Wed, 7 Feb 2018 19:22:47 +0000 (12:22 -0700)
committerSean Griffin <sean@seantheprogrammer.com>
Wed, 2 May 2018 13:36:11 +0000 (07:36 -0600)
src/librustc/infer/mod.rs
src/librustc/infer/region_constraints/mod.rs

index 6e455f1e9739fdac9cada50ac2f2d906a4c7c6ce..e40282aea089ed9cf3a7743e584b973e59b8e546 100644 (file)
@@ -884,7 +884,9 @@ pub fn next_float_var_id(&self) -> FloatVid {
     ///   during diagnostics / error-reporting.
     pub fn next_region_var(&self, origin: RegionVariableOrigin)
                            -> ty::Region<'tcx> {
-        self.tcx.mk_region(ty::ReVar(self.borrow_region_constraints().new_region_var(origin)))
+        let region_var = self.borrow_region_constraints()
+            .new_region_var(self.universe, origin);
+        self.tcx.mk_region(ty::ReVar(region_var))
     }
 
     /// Number of region variables created so far.
index 4d5f8b2b11e708ca0ef251af20f12764434146e4..b2a580420c6a6637acd5cf8e564510bd16a6dabc 100644 (file)
@@ -25,9 +25,7 @@
 use ty::{BrFresh, ReLateBound, ReSkolemized, ReVar};
 
 use std::collections::BTreeMap;
-use std::fmt;
-use std::mem;
-use std::u32;
+use std::{cmp, fmt, mem, u32};
 
 mod taint;
 
@@ -233,6 +231,7 @@ enum CombineMapType {
 #[derive(Debug, Clone, Copy)]
 pub struct RegionVariableInfo {
     pub origin: RegionVariableOrigin,
+    pub universe: ty::UniverseIndex,
 }
 
 pub struct RegionSnapshot {
@@ -438,9 +437,12 @@ fn rollback_undo_entry(&mut self, undo_entry: UndoLogEntry<'tcx>) {
         }
     }
 
-    pub fn new_region_var(&mut self, origin: RegionVariableOrigin) -> RegionVid {
+    pub fn new_region_var(&mut self,
+                          universe: ty::UniverseIndex,
+                          origin: RegionVariableOrigin) -> RegionVid {
         let vid = self.var_infos.push(RegionVariableInfo {
             origin,
+            universe,
         });
 
         let u_vid = self.unification_table
@@ -457,6 +459,11 @@ pub fn new_region_var(&mut self, origin: RegionVariableOrigin) -> RegionVid {
         return vid;
     }
 
+    /// Returns the universe for the given variable.
+    pub fn var_universe(&self, vid: RegionVid) -> ty::UniverseIndex {
+        self.var_infos[vid].universe
+    }
+
     /// Returns the origin for the given variable.
     pub fn var_origin(&self, vid: RegionVid) -> RegionVariableOrigin {
         self.var_infos[vid].origin
@@ -812,7 +819,10 @@ fn combine_vars(
         if let Some(&c) = self.combine_map(t).get(&vars) {
             return tcx.mk_region(ReVar(c));
         }
-        let c = self.new_region_var(MiscVariable(origin.span()));
+        let a_universe = self.universe(a);
+        let b_universe = self.universe(b);
+        let c_universe = cmp::max(a_universe, b_universe);
+        let c = self.new_region_var(c_universe, MiscVariable(origin.span()));
         self.combine_map(t).insert(vars, c);
         if self.in_snapshot() {
             self.undo_log.push(AddCombination(t, vars));
@@ -828,6 +838,22 @@ fn combine_vars(
         new_r
     }
 
+    fn universe(&self, region: Region<'tcx>) -> ty::UniverseIndex {
+        match *region {
+            ty::ReScope(..) |
+            ty::ReStatic |
+            ty::ReEmpty |
+            ty::ReErased |
+            ty::ReFree(..) |
+            ty::ReEarlyBound(..) => ty::UniverseIndex::ROOT,
+            ty::ReSkolemized(universe, _) => universe,
+            ty::ReClosureBound(vid) |
+            ty::ReVar(vid) => self.var_universe(vid),
+            ty::ReLateBound(..) =>
+                bug!("universe(): encountered bound region {:?}", region),
+        }
+    }
+
     pub fn vars_created_since_snapshot(&self, mark: &RegionSnapshot) -> Vec<RegionVid> {
         self.undo_log[mark.length..]
             .iter()