From ed4952ef392952dc4a7d0241386daf575dea5d6e Mon Sep 17 00:00:00 2001 From: Niko Matsakis Date: Fri, 12 Dec 2014 06:37:42 -0500 Subject: [PATCH] Add (currently unused) helper routine for skolemizing bound regions. --- src/librustc/middle/infer/mod.rs | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/src/librustc/middle/infer/mod.rs b/src/librustc/middle/infer/mod.rs index c58b99e0ae2b7..4eda0d01ebb7b 100644 --- a/src/librustc/middle/infer/mod.rs +++ b/src/librustc/middle/infer/mod.rs @@ -90,6 +90,10 @@ pub struct InferCtxt<'a, 'tcx: 'a> { 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; + /// Why did we require that the two types be related? /// /// 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() }) } -} -impl<'a, 'tcx> InferCtxt<'a, 'tcx> { + pub fn skolemize_bound_regions(&self, + value: &ty::Binder, + 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 { self.type_variables .borrow_mut()