1
Fork 0

Add (currently unused) helper routine for skolemizing bound regions.

This commit is contained in:
Niko Matsakis 2014-12-12 06:37:42 -05:00
parent 416e62924e
commit ed4952ef39

View file

@ -90,6 +90,10 @@ pub struct InferCtxt<'a, 'tcx: 'a> {
RegionVarBindings<'a, 'tcx>, RegionVarBindings<'a, 'tcx>,
} }
/// A map returned by `skolemize_bound_regions()` indicating the skolemized
/// region that each late-bound region was replaced with.
pub type SkolemizationMap = FnvHashMap<ty::BoundRegion,ty::Region>;
/// Why did we require that the two types be related? /// Why did we require that the two types be related?
/// ///
/// See `error_reporting.rs` for more details /// See `error_reporting.rs` for more details
@ -698,9 +702,25 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
self.sub(a_is_expected, trace).poly_trait_refs(&*a, &*b).to_ures() self.sub(a_is_expected, trace).poly_trait_refs(&*a, &*b).to_ures()
}) })
} }
}
impl<'a, 'tcx> InferCtxt<'a, 'tcx> { pub fn skolemize_bound_regions<T>(&self,
value: &ty::Binder<T>,
snapshot: &CombinedSnapshot)
-> (T, SkolemizationMap)
where T : TypeFoldable<'tcx>
{
let (result_binder, map) = replace_late_bound_regions(self.tcx, value, |br, _| {
self.region_vars.new_skolemized(br, &snapshot.region_vars_snapshot)
});
debug!("skolemize_bound_regions(value={}, result={}, map={})",
value.repr(self.tcx),
result_binder.value.repr(self.tcx),
map.repr(self.tcx));
(result_binder.value, map)
}
pub fn next_ty_var_id(&self, diverging: bool) -> TyVid { pub fn next_ty_var_id(&self, diverging: bool) -> TyVid {
self.type_variables self.type_variables
.borrow_mut() .borrow_mut()