Skip to content

Commit a42950c

Browse files
committed
Unify replace_late_bound_regions_with_fresh_var and
`replace_late_bound_regions_with_fresh_reions` into one fn
1 parent d5e948b commit a42950c

File tree

11 files changed

+68
-74
lines changed

11 files changed

+68
-74
lines changed

src/librustc/lib.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ This API is completely unstable and subject to change.
2929
html_root_url = "http://doc.rust-lang.org/nightly/")]
3030

3131
#![feature(default_type_params, globs, if_let, import_shadowing, macro_rules, phase, quote)]
32-
#![feature(slicing_syntax, struct_variant, unsafe_destructor)]
32+
#![feature(slicing_syntax, struct_variant, tuple_indexing, unsafe_destructor)]
3333
#![feature(rustc_diagnostic_macros)]
3434

3535
extern crate arena;

src/librustc/middle/traits/select.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -1709,7 +1709,8 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
17091709
closure_type.sig.binder_id,
17101710
&closure_type.sig,
17111711
|br| self.infcx.next_region_var(
1712-
infer::LateBoundRegion(obligation.cause.span, br)));
1712+
infer::LateBoundRegion(obligation.cause.span, br,
1713+
infer::FnCall)));
17131714

17141715
let arguments_tuple = new_signature.inputs[0];
17151716
let trait_ref = Rc::new(ty::TraitRef {

src/librustc/middle/typeck/check/method/confirm.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -359,7 +359,8 @@ impl<'a,'tcx> ConfirmContext<'a,'tcx> {
359359
let fn_sig = bare_fn_ty.sig.subst(self.tcx(), all_substs);
360360
self.infcx().replace_late_bound_regions_with_fresh_var(fn_sig.binder_id,
361361
self.span,
362-
&fn_sig)
362+
infer::FnCall,
363+
&fn_sig).0
363364
}
364365

365366
fn add_obligations(&mut self,

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

+4-2
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,11 @@ use middle::ty;
1818
use middle::typeck::astconv::AstConv;
1919
use middle::typeck::check::{FnCtxt};
2020
use middle::typeck::check::{impl_self_ty};
21+
use middle::typeck::check::vtable;
2122
use middle::typeck::check::vtable::select_new_fcx_obligations;
23+
use middle::typeck::infer;
2224
use middle::typeck::{MethodCallee};
2325
use middle::typeck::{MethodParam, MethodTypeParam};
24-
use middle::typeck::check::vtable;
2526
use util::ppaux::{Repr, UserString};
2627

2728
use std::rc::Rc;
@@ -194,7 +195,8 @@ pub fn lookup_in_trait_adjusted<'a, 'tcx>(
194195
let fn_sig = bare_fn_ty.sig.subst(tcx, &trait_ref.substs);
195196
let fn_sig = fcx.infcx().replace_late_bound_regions_with_fresh_var(fn_sig.binder_id,
196197
span,
197-
&fn_sig);
198+
infer::FnCall,
199+
&fn_sig).0;
198200
let transformed_self_ty = fn_sig.inputs[0];
199201
let fty = ty::mk_bare_fn(tcx, ty::BareFnTy {
200202
sig: fn_sig,

src/librustc/middle/typeck/check/method/probe.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -845,7 +845,8 @@ impl<'a,'tcx> ProbeContext<'a,'tcx> {
845845
let xform_self_ty = method.fty.sig.inputs[0].subst(self.tcx(), substs);
846846
self.infcx().replace_late_bound_regions_with_fresh_var(method.fty.sig.binder_id,
847847
self.span,
848-
&xform_self_ty)
848+
infer::FnCall,
849+
&xform_self_ty).0
849850
}
850851
}
851852

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

+12-11
Original file line numberDiff line numberDiff line change
@@ -3054,9 +3054,12 @@ fn check_expr_with_unifier(fcx: &FnCtxt,
30543054

30553055
// Replace any bound regions that appear in the function
30563056
// signature with region variables
3057-
let (_, fn_sig) = replace_late_bound_regions(fcx.tcx(), fn_sig.binder_id, fn_sig, |br| {
3058-
fcx.infcx().next_region_var(infer::LateBoundRegion(call_expr.span, br))
3059-
});
3057+
let fn_sig =
3058+
fcx.infcx().replace_late_bound_regions_with_fresh_var(
3059+
fn_sig.binder_id,
3060+
call_expr.span,
3061+
infer::FnCall,
3062+
fn_sig).0;
30603063

30613064
// Call the generic checker.
30623065
check_argument_types(fcx,
@@ -3605,8 +3608,7 @@ fn check_expr_with_unifier(fcx: &FnCtxt,
36053608
expr: &ast::Expr,
36063609
lvalue_pref: LvaluePreference,
36073610
base: &ast::Expr,
3608-
field: &ast::SpannedIdent,
3609-
_tys: &[P<ast::Ty>]) {
3611+
field: &ast::SpannedIdent) {
36103612
let tcx = fcx.ccx.tcx;
36113613
check_expr_with_lvalue_pref(fcx, base, lvalue_pref);
36123614
let expr_t = structurally_resolved_type(fcx, expr.span,
@@ -3666,8 +3668,7 @@ fn check_expr_with_unifier(fcx: &FnCtxt,
36663668
expr: &ast::Expr,
36673669
lvalue_pref: LvaluePreference,
36683670
base: &ast::Expr,
3669-
idx: codemap::Spanned<uint>,
3670-
_tys: &[P<ast::Ty>]) {
3671+
idx: codemap::Spanned<uint>) {
36713672
let tcx = fcx.ccx.tcx;
36723673
check_expr_with_lvalue_pref(fcx, base, lvalue_pref);
36733674
let expr_t = structurally_resolved_type(fcx, expr.span,
@@ -4489,11 +4490,11 @@ fn check_expr_with_unifier(fcx: &FnCtxt,
44894490

44904491
fcx.require_expr_have_sized_type(expr, traits::StructInitializerSized);
44914492
}
4492-
ast::ExprField(ref base, ref field, ref tys) => {
4493-
check_field(fcx, expr, lvalue_pref, &**base, field, tys.as_slice());
4493+
ast::ExprField(ref base, ref field, _) => {
4494+
check_field(fcx, expr, lvalue_pref, &**base, field);
44944495
}
4495-
ast::ExprTupField(ref base, idx, ref tys) => {
4496-
check_tup_field(fcx, expr, lvalue_pref, &**base, idx, tys.as_slice());
4496+
ast::ExprTupField(ref base, idx, _) => {
4497+
check_tup_field(fcx, expr, lvalue_pref, &**base, idx);
44974498
}
44984499
ast::ExprIndex(ref base, ref idx) => {
44994500
check_expr_with_lvalue_pref(fcx, &**base, lvalue_pref);

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -1434,11 +1434,11 @@ impl<'a, 'tcx> ErrorReportingHelpers for InferCtxt<'a, 'tcx> {
14341434
infer::AddrOfSlice(_) => " for slice expression".to_string(),
14351435
infer::Autoref(_) => " for autoref".to_string(),
14361436
infer::Coercion(_) => " for automatic coercion".to_string(),
1437-
infer::LateBoundRegion(_, br) => {
1437+
infer::LateBoundRegion(_, br, infer::FnCall) => {
14381438
format!(" for {}in function call",
14391439
bound_region_to_string(self.tcx, "lifetime parameter ", true, br))
14401440
}
1441-
infer::BoundRegionInFnType(_, br) => {
1441+
infer::LateBoundRegion(_, br, infer::FnType) => {
14421442
format!(" for {}in function type",
14431443
bound_region_to_string(self.tcx, "lifetime parameter ", true, br))
14441444
}

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

+7-6
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,13 @@ use middle::ty;
1515
use middle::typeck::infer::combine::*;
1616
use middle::typeck::infer::lattice::*;
1717
use middle::typeck::infer::equate::Equate;
18+
use middle::typeck::infer::FnType;
19+
use middle::typeck::infer::fold_regions_in_sig;
1820
use middle::typeck::infer::lub::Lub;
21+
use middle::typeck::infer::region_inference::RegionMark;
1922
use middle::typeck::infer::sub::Sub;
2023
use middle::typeck::infer::{cres, InferCtxt};
2124
use middle::typeck::infer::{TypeTrace, Subtype};
22-
use middle::typeck::infer::fold_regions_in_sig;
23-
use middle::typeck::infer::region_inference::RegionMark;
2425
use syntax::ast::{Many, Once, MutImmutable, MutMutable};
2526
use syntax::ast::{NormalFn, UnsafeFn, NodeId};
2627
use syntax::ast::{Onceness, FnStyle};
@@ -140,12 +141,12 @@ impl<'f, 'tcx> Combine<'tcx> for Glb<'f, 'tcx> {
140141

141142
// Instantiate each bound region with a fresh region variable.
142143
let (a_with_fresh, a_map) =
143-
self.fields.infcx.replace_late_bound_regions_with_fresh_regions(
144-
self.trace(), a);
144+
self.fields.infcx.replace_late_bound_regions_with_fresh_var(
145+
a.binder_id, self.trace().span(), FnType, a);
145146
let a_vars = var_ids(self, &a_map);
146147
let (b_with_fresh, b_map) =
147-
self.fields.infcx.replace_late_bound_regions_with_fresh_regions(
148-
self.trace(), b);
148+
self.fields.infcx.replace_late_bound_regions_with_fresh_var(
149+
b.binder_id, self.trace().span(), FnType, b);
149150
let b_vars = var_ids(self, &b_map);
150151

151152
// Collect constraints.

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

+5-4
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ use middle::ty::RegionVid;
1313
use middle::ty;
1414
use middle::typeck::infer::combine::*;
1515
use middle::typeck::infer::equate::Equate;
16+
use middle::typeck::infer::FnType;
1617
use middle::typeck::infer::glb::Glb;
1718
use middle::typeck::infer::lattice::*;
1819
use middle::typeck::infer::sub::Sub;
@@ -126,11 +127,11 @@ impl<'f, 'tcx> Combine<'tcx> for Lub<'f, 'tcx> {
126127

127128
// Instantiate each bound region with a fresh region variable.
128129
let (a_with_fresh, a_map) =
129-
self.fields.infcx.replace_late_bound_regions_with_fresh_regions(
130-
self.trace(), a);
130+
self.fields.infcx.replace_late_bound_regions_with_fresh_var(
131+
a.binder_id, self.trace().span(), FnType, a);
131132
let (b_with_fresh, _) =
132-
self.fields.infcx.replace_late_bound_regions_with_fresh_regions(
133-
self.trace(), b);
133+
self.fields.infcx.replace_late_bound_regions_with_fresh_var(
134+
b.binder_id, self.trace().span(), FnType, b);
134135

135136
// Collect constraints.
136137
let sig0 = try!(super_fn_sigs(self, &a_with_fresh, &b_with_fresh));

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

+28-43
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ use syntax::ast;
3636
use syntax::codemap;
3737
use syntax::codemap::Span;
3838
use util::common::indent;
39-
use util::ppaux::{bound_region_to_string, ty_to_string};
39+
use util::ppaux::{ty_to_string};
4040
use util::ppaux::{trait_ref_to_string, Repr};
4141

4242
use self::coercion::Coerce;
@@ -222,6 +222,16 @@ pub enum SubregionOrigin {
222222
AutoBorrow(Span),
223223
}
224224

225+
/// Times when we replace late-bound regions with variables:
226+
#[deriving(Clone, Show)]
227+
pub enum LateBoundRegionConversionTime {
228+
/// when a fn is called
229+
FnCall,
230+
231+
/// when two fn types are compared
232+
FnType,
233+
}
234+
225235
/// Reasons to create a region inference variable
226236
///
227237
/// See `error_reporting.rs` for more details
@@ -251,11 +261,7 @@ pub enum RegionVariableOrigin {
251261

252262
// Region variables created for bound regions
253263
// in a function or method that is called
254-
LateBoundRegion(Span, ty::BoundRegion),
255-
256-
// Region variables created for bound regions
257-
// when doing subtyping/lub/glb computations
258-
BoundRegionInFnType(Span, ty::BoundRegion),
264+
LateBoundRegion(Span, ty::BoundRegion, LateBoundRegionConversionTime),
259265

260266
UpvarRegion(ty::UpvarId, Span),
261267

@@ -959,36 +965,20 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
959965
}
960966

961967
pub fn replace_late_bound_regions_with_fresh_var<T>(&self,
962-
binder_id: ast::NodeId,
963-
span: Span,
964-
value: &T)
965-
-> T
966-
where T : TypeFoldable + Repr
968+
binder_id: ast::NodeId,
969+
span: Span,
970+
lbrct: LateBoundRegionConversionTime,
971+
value: &T)
972+
-> (T, HashMap<ty::BoundRegion,ty::Region>)
973+
where T : TypeFoldable + Repr
967974
{
968-
let (_, value) = replace_late_bound_regions(
969-
self.tcx,
970-
binder_id,
971-
value,
972-
|br| self.next_region_var(LateBoundRegion(span, br)));
973-
value
974-
}
975-
976-
pub fn replace_late_bound_regions_with_fresh_regions(&self,
977-
trace: TypeTrace,
978-
fsig: &ty::FnSig)
979-
-> (ty::FnSig,
980-
HashMap<ty::BoundRegion,
981-
ty::Region>) {
982-
let (map, fn_sig) =
983-
replace_late_bound_regions(self.tcx, fsig.binder_id, fsig, |br| {
984-
let rvar = self.next_region_var(
985-
BoundRegionInFnType(trace.origin.span(), br));
986-
debug!("Bound region {} maps to {}",
987-
bound_region_to_string(self.tcx, "", false, br),
988-
rvar);
989-
rvar
990-
});
991-
(fn_sig, map)
975+
let (map, value) =
976+
replace_late_bound_regions(
977+
self.tcx,
978+
binder_id,
979+
value,
980+
|br| self.next_region_var(LateBoundRegion(span, br, lbrct)));
981+
(value, map)
992982
}
993983
}
994984

@@ -1170,8 +1160,7 @@ impl RegionVariableOrigin {
11701160
Autoref(a) => a,
11711161
Coercion(ref a) => a.span(),
11721162
EarlyBoundRegion(a, _) => a,
1173-
LateBoundRegion(a, _) => a,
1174-
BoundRegionInFnType(a, _) => a,
1163+
LateBoundRegion(a, _, _) => a,
11751164
BoundRegionInCoherence(_) => codemap::DUMMY_SP,
11761165
UpvarRegion(_, a) => a
11771166
}
@@ -1196,12 +1185,8 @@ impl Repr for RegionVariableOrigin {
11961185
EarlyBoundRegion(a, b) => {
11971186
format!("EarlyBoundRegion({},{})", a.repr(tcx), b.repr(tcx))
11981187
}
1199-
LateBoundRegion(a, b) => {
1200-
format!("LateBoundRegion({},{})", a.repr(tcx), b.repr(tcx))
1201-
}
1202-
BoundRegionInFnType(a, b) => {
1203-
format!("bound_regionInFnType({},{})", a.repr(tcx),
1204-
b.repr(tcx))
1188+
LateBoundRegion(a, b, c) => {
1189+
format!("LateBoundRegion({},{},{})", a.repr(tcx), b.repr(tcx), c)
12051190
}
12061191
BoundRegionInCoherence(a) => {
12071192
format!("bound_regionInCoherence({})", a.repr(tcx))

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

+3-2
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ 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;
19+
use middle::typeck::infer::FnType;
1920
use middle::typeck::infer::glb::Glb;
2021
use middle::typeck::infer::InferCtxt;
2122
use middle::typeck::infer::lub::Lub;
@@ -175,8 +176,8 @@ impl<'f, 'tcx> Combine<'tcx> for Sub<'f, 'tcx> {
175176
// First, we instantiate each bound region in the subtype with a fresh
176177
// region variable.
177178
let (a_sig, _) =
178-
self.fields.infcx.replace_late_bound_regions_with_fresh_regions(
179-
self.trace(), a);
179+
self.fields.infcx.replace_late_bound_regions_with_fresh_var(
180+
a.binder_id, self.trace().span(), FnType, a);
180181

181182
// Second, we instantiate each bound region in the supertype with a
182183
// fresh concrete region.

0 commit comments

Comments
 (0)