@@ -25,9 +25,7 @@ use ty::ReStatic;
25
25
use ty:: { BrFresh , ReLateBound , ReSkolemized , ReVar } ;
26
26
27
27
use std:: collections:: BTreeMap ;
28
- use std:: fmt;
29
- use std:: mem;
30
- use std:: u32;
28
+ use std:: { cmp, fmt, mem, u32} ;
31
29
32
30
mod taint;
33
31
@@ -233,6 +231,7 @@ type CombineMap<'tcx> = FxHashMap<TwoRegions<'tcx>, RegionVid>;
233
231
#[ derive( Debug , Clone , Copy ) ]
234
232
pub struct RegionVariableInfo {
235
233
pub origin : RegionVariableOrigin ,
234
+ pub universe : ty:: UniverseIndex ,
236
235
}
237
236
238
237
pub struct RegionSnapshot {
@@ -438,9 +437,12 @@ impl<'tcx> RegionConstraintCollector<'tcx> {
438
437
}
439
438
}
440
439
441
- pub fn new_region_var ( & mut self , origin : RegionVariableOrigin ) -> RegionVid {
440
+ pub fn new_region_var ( & mut self ,
441
+ universe : ty:: UniverseIndex ,
442
+ origin : RegionVariableOrigin ) -> RegionVid {
442
443
let vid = self . var_infos . push ( RegionVariableInfo {
443
444
origin,
445
+ universe,
444
446
} ) ;
445
447
446
448
let u_vid = self . unification_table
@@ -457,6 +459,11 @@ impl<'tcx> RegionConstraintCollector<'tcx> {
457
459
return vid;
458
460
}
459
461
462
+ /// Returns the universe for the given variable.
463
+ pub fn var_universe ( & self , vid : RegionVid ) -> ty:: UniverseIndex {
464
+ self . var_infos [ vid] . universe
465
+ }
466
+
460
467
/// Returns the origin for the given variable.
461
468
pub fn var_origin ( & self , vid : RegionVid ) -> RegionVariableOrigin {
462
469
self . var_infos [ vid] . origin
@@ -810,7 +817,10 @@ impl<'tcx> RegionConstraintCollector<'tcx> {
810
817
if let Some ( & c) = self . combine_map ( t) . get ( & vars) {
811
818
return tcx. mk_region ( ReVar ( c) ) ;
812
819
}
813
- let c = self . new_region_var ( MiscVariable ( origin. span ( ) ) ) ;
820
+ let a_universe = self . universe ( a) ;
821
+ let b_universe = self . universe ( b) ;
822
+ let c_universe = cmp:: max ( a_universe, b_universe) ;
823
+ let c = self . new_region_var ( c_universe, MiscVariable ( origin. span ( ) ) ) ;
814
824
self . combine_map ( t) . insert ( vars, c) ;
815
825
if self . in_snapshot ( ) {
816
826
self . undo_log . push ( AddCombination ( t, vars) ) ;
@@ -826,6 +836,22 @@ impl<'tcx> RegionConstraintCollector<'tcx> {
826
836
new_r
827
837
}
828
838
839
+ fn universe ( & self , region : Region < ' tcx > ) -> ty:: UniverseIndex {
840
+ match * region {
841
+ ty:: ReScope ( ..) |
842
+ ty:: ReStatic |
843
+ ty:: ReEmpty |
844
+ ty:: ReErased |
845
+ ty:: ReFree ( ..) |
846
+ ty:: ReEarlyBound ( ..) => ty:: UniverseIndex :: ROOT ,
847
+ ty:: ReSkolemized ( universe, _) => universe,
848
+ ty:: ReClosureBound ( vid) |
849
+ ty:: ReVar ( vid) => self . var_universe ( vid) ,
850
+ ty:: ReLateBound ( ..) =>
851
+ bug ! ( "universe(): encountered bound region {:?}" , region) ,
852
+ }
853
+ }
854
+
829
855
pub fn vars_created_since_snapshot ( & self , mark : & RegionSnapshot ) -> Vec < RegionVid > {
830
856
self . undo_log [ mark. length ..]
831
857
. iter ( )
0 commit comments