Skip to content

Commit 1562d8c

Browse files
committed
Generalize the replace-late-bound-regions function to operate
over anything that is foldable, not just fn signatures.
1 parent 5c505b7 commit 1562d8c

File tree

5 files changed

+35
-31
lines changed

5 files changed

+35
-31
lines changed

src/librustc/middle/typeck/check/mod.rs

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -97,11 +97,8 @@ use middle::typeck::astconv::{ast_region_to_region, ast_ty_to_ty};
9797
use middle::typeck::astconv;
9898
use middle::typeck::check::_match::pat_ctxt;
9999
use middle::typeck::check::method::{AutoderefReceiver};
100-
use middle::typeck::check::method::{AutoderefReceiverFlag};
101100
use middle::typeck::check::method::{CheckTraitsAndInherentMethods};
102-
use middle::typeck::check::method::{DontAutoderefReceiver};
103-
use middle::typeck::check::method::{IgnoreStaticMethods, ReportStaticMethods};
104-
use middle::typeck::check::regionmanip::replace_late_bound_regions_in_fn_sig;
101+
use middle::typeck::check::regionmanip::replace_late_bound_regions;
105102
use middle::typeck::CrateCtxt;
106103
use middle::typeck::infer::{resolve_type, force_tvar};
107104
use middle::typeck::infer;
@@ -529,7 +526,7 @@ fn check_fn<'a, 'tcx>(ccx: &'a CrateCtxt<'a, 'tcx>,
529526

530527
// First, we have to replace any bound regions in the fn type with free ones.
531528
// The free region references will be bound the node_id of the body block.
532-
let (_, fn_sig) = replace_late_bound_regions_in_fn_sig(tcx, fn_sig, |br| {
529+
let (_, fn_sig) = replace_late_bound_regions(tcx, fn_sig.binder_id, fn_sig, |br| {
533530
ty::ReFree(ty::FreeRegion {scope_id: body.id, bound_region: br})
534531
});
535532

@@ -1531,6 +1528,10 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
15311528
&self.inh.infcx
15321529
}
15331530

1531+
pub fn sess(&self) -> &Session {
1532+
&self.tcx().sess
1533+
}
1534+
15341535
pub fn err_count_since_creation(&self) -> uint {
15351536
self.ccx.tcx.sess.err_count() - self.err_count_on_creation
15361537
}
@@ -2890,7 +2891,7 @@ fn check_expr_with_unifier(fcx: &FnCtxt,
28902891

28912892
// Replace any bound regions that appear in the function
28922893
// signature with region variables
2893-
let (_, fn_sig) = replace_late_bound_regions_in_fn_sig(fcx.tcx(), fn_sig, |br| {
2894+
let (_, fn_sig) = replace_late_bound_regions(fcx.tcx(), fn_sig.binder_id, fn_sig, |br| {
28942895
fcx.infcx().next_region_var(infer::LateBoundRegion(call_expr.span, br))
28952896
});
28962897

@@ -3346,8 +3347,8 @@ fn check_expr_with_unifier(fcx: &FnCtxt,
33463347
match expected_sty {
33473348
Some(ty::ty_closure(ref cenv)) => {
33483349
let (_, sig) =
3349-
replace_late_bound_regions_in_fn_sig(
3350-
tcx, &cenv.sig,
3350+
replace_late_bound_regions(
3351+
tcx, cenv.sig.binder_id, &cenv.sig,
33513352
|_| fcx.inh.infcx.fresh_bound_region(expr.id));
33523353
let onceness = match (&store, &cenv.store) {
33533354
// As the closure type and onceness go, only three

src/librustc/middle/typeck/check/regionmanip.rs

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
use middle::subst::{ParamSpace, Subst, Substs};
1414
use middle::ty;
1515
use middle::ty_fold;
16-
use middle::ty_fold::TypeFolder;
16+
use middle::ty_fold::{TypeFolder, TypeFoldable};
1717

1818
use syntax::ast;
1919

@@ -23,31 +23,34 @@ use util::ppaux::Repr;
2323

2424
// Helper functions related to manipulating region types.
2525

26-
pub fn replace_late_bound_regions_in_fn_sig(
27-
tcx: &ty::ctxt,
28-
fn_sig: &ty::FnSig,
29-
mapf: |ty::BoundRegion| -> ty::Region)
30-
-> (HashMap<ty::BoundRegion,ty::Region>, ty::FnSig) {
31-
debug!("replace_late_bound_regions_in_fn_sig({})", fn_sig.repr(tcx));
26+
pub fn replace_late_bound_regions<T>(
27+
tcx: &ty::ctxt,
28+
binder_id: ast::NodeId,
29+
value: &T,
30+
map_fn: |ty::BoundRegion| -> ty::Region)
31+
-> (HashMap<ty::BoundRegion,ty::Region>, T)
32+
where T : TypeFoldable + Repr
33+
{
34+
debug!("replace_late_bound_regions(binder_id={}, value={})",
35+
binder_id, value.repr(tcx));
3236

3337
let mut map = HashMap::new();
34-
let fn_sig = {
35-
let mut f = ty_fold::RegionFolder::regions(tcx, |r| {
36-
debug!("region r={}", r.to_string());
38+
let new_value = {
39+
let mut folder = ty_fold::RegionFolder::regions(tcx, |r| {
3740
match r {
38-
ty::ReLateBound(s, br) if s == fn_sig.binder_id => {
39-
* match map.entry(br) {
40-
Vacant(entry) => entry.set(mapf(br)),
41-
Occupied(entry) => entry.into_mut(),
41+
ty::ReLateBound(s, br) if s == binder_id => {
42+
match map.entry(br) {
43+
Vacant(entry) => *entry.set(map_fn(br)),
44+
Occupied(entry) => *entry.into_mut(),
4245
}
4346
}
4447
_ => r
4548
}
4649
});
47-
ty_fold::super_fold_sig(&mut f, fn_sig)
50+
value.fold_with(&mut folder)
4851
};
4952
debug!("resulting map: {}", map);
50-
(map, fn_sig)
53+
(map, new_value)
5154
}
5255

5356
pub enum WfConstraint {

src/librustc/middle/typeck/check/wf.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ use middle::ty;
1515
use middle::ty_fold::{TypeFolder, TypeFoldable};
1616
use middle::typeck::astconv::AstConv;
1717
use middle::typeck::check::{FnCtxt, Inherited, blank_fn_ctxt, vtable2, regionck};
18-
use middle::typeck::check::regionmanip::replace_late_bound_regions_in_fn_sig;
18+
use middle::typeck::check::regionmanip::replace_late_bound_regions;
1919
use middle::typeck::CrateCtxt;
2020
use util::ppaux::Repr;
2121

@@ -373,8 +373,8 @@ impl<'cx,'tcx> TypeFolder<'tcx> for BoundsChecker<'cx,'tcx> {
373373
self.binding_count += 1;
374374

375375
let (_, fn_sig) =
376-
replace_late_bound_regions_in_fn_sig(
377-
self.fcx.tcx(), fn_sig,
376+
replace_late_bound_regions(
377+
self.fcx.tcx(), fn_sig.binder_id, fn_sig,
378378
|br| ty::ReFree(ty::FreeRegion{scope_id: self.scope_id,
379379
bound_region: br}));
380380

src/librustc/middle/typeck/infer/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ use middle::ty::{TyVid, IntVid, FloatVid, RegionVid};
2828
use middle::ty;
2929
use middle::ty_fold;
3030
use middle::ty_fold::{TypeFolder, TypeFoldable};
31-
use middle::typeck::check::regionmanip::replace_late_bound_regions_in_fn_sig;
31+
use middle::typeck::check::regionmanip::replace_late_bound_regions;
3232
use std::cell::{RefCell};
3333
use std::collections::HashMap;
3434
use std::rc::Rc;
@@ -962,7 +962,7 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
962962
HashMap<ty::BoundRegion,
963963
ty::Region>) {
964964
let (map, fn_sig) =
965-
replace_late_bound_regions_in_fn_sig(self.tcx, fsig, |br| {
965+
replace_late_bound_regions(self.tcx, fsig.binder_id, fsig, |br| {
966966
let rvar = self.next_region_var(
967967
BoundRegionInFnType(trace.origin.span(), br));
968968
debug!("Bound region {} maps to {}",

src/librustc/middle/typeck/infer/sub.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
use middle::ty::{BuiltinBounds};
1313
use middle::ty;
1414
use middle::ty::TyVar;
15-
use middle::typeck::check::regionmanip::replace_late_bound_regions_in_fn_sig;
15+
use middle::typeck::check::regionmanip::replace_late_bound_regions;
1616
use middle::typeck::infer::combine::*;
1717
use middle::typeck::infer::{cres, CresCompare};
1818
use middle::typeck::infer::equate::Equate;
@@ -189,7 +189,7 @@ impl<'f, 'tcx> Combine<'tcx> for Sub<'f, 'tcx> {
189189
// Second, we instantiate each bound region in the supertype with a
190190
// fresh concrete region.
191191
let (skol_map, b_sig) = {
192-
replace_late_bound_regions_in_fn_sig(self.fields.infcx.tcx, b, |br| {
192+
replace_late_bound_regions(self.fields.infcx.tcx, b.binder_id, b, |br| {
193193
let skol = self.fields.infcx.region_vars.new_skolemized(br);
194194
debug!("Bound region {} skolemized to {}",
195195
bound_region_to_string(self.fields.infcx.tcx, "", false, br),

0 commit comments

Comments
 (0)