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;
#[derive(Debug, Clone, Copy)]
pub struct RegionVariableInfo {
pub origin: RegionVariableOrigin,
+ pub universe: ty::UniverseIndex,
}
pub struct RegionSnapshot {
}
}
- 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
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
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));
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()