Skip to content

Commit 2be6107

Browse files
committed
Code up the new lifetime default rules, but leave them disabled
for now.
1 parent 2ad26e8 commit 2be6107

File tree

7 files changed

+90
-36
lines changed

7 files changed

+90
-36
lines changed

src/librustc/metadata/tydecode.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -843,15 +843,15 @@ fn parse_type_param_def_<'a, 'tcx, F>(st: &mut PState<'a, 'tcx>, conv: &mut F)
843843

844844
fn parse_object_lifetime_default<'a,'tcx, F>(st: &mut PState<'a,'tcx>,
845845
conv: &mut F)
846-
-> Option<ty::ObjectLifetimeDefault>
846+
-> ty::ObjectLifetimeDefault
847847
where F: FnMut(DefIdSource, ast::DefId) -> ast::DefId,
848848
{
849849
match next(st) {
850-
'n' => None,
851-
'a' => Some(ty::ObjectLifetimeDefault::Ambiguous),
850+
'a' => ty::ObjectLifetimeDefault::Ambiguous,
851+
'b' => ty::ObjectLifetimeDefault::BaseDefault,
852852
's' => {
853853
let region = parse_region_(st, conv);
854-
Some(ty::ObjectLifetimeDefault::Specific(region))
854+
ty::ObjectLifetimeDefault::Specific(region)
855855
}
856856
_ => panic!("parse_object_lifetime_default: bad input")
857857
}

src/librustc/metadata/tyencode.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -414,12 +414,12 @@ pub fn enc_type_param_def<'a, 'tcx>(w: &mut Encoder, cx: &ctxt<'a, 'tcx>,
414414

415415
fn enc_object_lifetime_default<'a, 'tcx>(w: &mut Encoder,
416416
cx: &ctxt<'a, 'tcx>,
417-
default: Option<ty::ObjectLifetimeDefault>)
417+
default: ty::ObjectLifetimeDefault)
418418
{
419419
match default {
420-
None => mywrite!(w, "n"),
421-
Some(ty::ObjectLifetimeDefault::Ambiguous) => mywrite!(w, "a"),
422-
Some(ty::ObjectLifetimeDefault::Specific(r)) => {
420+
ty::ObjectLifetimeDefault::Ambiguous => mywrite!(w, "a"),
421+
ty::ObjectLifetimeDefault::BaseDefault => mywrite!(w, "b"),
422+
ty::ObjectLifetimeDefault::Specific(r) => {
423423
mywrite!(w, "s");
424424
enc_region(w, cx, r);
425425
}

src/librustc/middle/ty.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2051,6 +2051,9 @@ pub enum ObjectLifetimeDefault {
20512051
/// `T:'a` constraints are found.
20522052
Ambiguous,
20532053

2054+
/// Use the base default, typically 'static, but in a fn body it is a fresh variable
2055+
BaseDefault,
2056+
20542057
/// Use the given region as the default.
20552058
Specific(Region),
20562059
}
@@ -2062,7 +2065,7 @@ pub struct TypeParameterDef<'tcx> {
20622065
pub space: subst::ParamSpace,
20632066
pub index: u32,
20642067
pub default: Option<Ty<'tcx>>,
2065-
pub object_lifetime_default: Option<ObjectLifetimeDefault>,
2068+
pub object_lifetime_default: ObjectLifetimeDefault,
20662069
}
20672070

20682071
#[derive(RustcEncodable, RustcDecodable, Clone, Debug)]
@@ -7764,6 +7767,7 @@ impl<'tcx> fmt::Debug for ObjectLifetimeDefault {
77647767
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
77657768
match *self {
77667769
ObjectLifetimeDefault::Ambiguous => write!(f, "Ambiguous"),
7770+
ObjectLifetimeDefault::BaseDefault => format!("BaseDefault"),
77677771
ObjectLifetimeDefault::Specific(ref r) => write!(f, "{:?}", r),
77687772
}
77697773
}

src/librustc/middle/ty_fold.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -369,6 +369,9 @@ impl<'tcx> TypeFoldable<'tcx> for ty::ObjectLifetimeDefault {
369369
ty::ObjectLifetimeDefault::Ambiguous =>
370370
ty::ObjectLifetimeDefault::Ambiguous,
371371

372+
ty::ObjectLifetimeDefault::BaseDefault =>
373+
ty::ObjectLifetimeDefault::BaseDefault,
374+
372375
ty::ObjectLifetimeDefault::Specific(r) =>
373376
ty::ObjectLifetimeDefault::Specific(r.fold_with(folder)),
374377
}

src/librustc_typeck/check/mod.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1876,14 +1876,18 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
18761876

18771877
impl<'a, 'tcx> RegionScope for FnCtxt<'a, 'tcx> {
18781878
fn object_lifetime_default(&self, span: Span) -> Option<ty::Region> {
1879+
Some(self.base_object_lifetime_default(span))
1880+
}
1881+
1882+
fn base_object_lifetime_default(&self, span: Span) -> ty::Region {
18791883
// RFC #599 specifies that object lifetime defaults take
18801884
// precedence over other defaults. But within a fn body we
18811885
// don't have a *default* region, rather we use inference to
18821886
// find the *correct* region, which is strictly more general
18831887
// (and anyway, within a fn body the right region may not even
18841888
// be something the user can write explicitly, since it might
18851889
// be some expression).
1886-
Some(self.infcx().next_region_var(infer::MiscVariable(span)))
1890+
self.infcx().next_region_var(infer::MiscVariable(span))
18871891
}
18881892

18891893
fn anon_regions(&self, span: Span, count: usize)

src/librustc_typeck/collect.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1535,8 +1535,7 @@ fn convert_typed_item<'a, 'tcx>(ccx: &CrateCtxt<'a, 'tcx>,
15351535
let object_lifetime_default_reprs: String =
15361536
scheme.generics.types.iter()
15371537
.map(|t| match t.object_lifetime_default {
1538-
Some(ty::ObjectLifetimeDefault::Specific(r)) =>
1539-
r.to_string(),
1538+
ty::ObjectLifetimeDefault::Specific(r) => r.to_string(),
15401539
d => format!("{:?}", d),
15411540
})
15421541
.collect::<Vec<String>>()
@@ -1640,7 +1639,7 @@ fn ty_generics_for_trait<'a, 'tcx>(ccx: &CrateCtxt<'a, 'tcx>,
16401639
name: special_idents::type_self.name,
16411640
def_id: local_def(param_id),
16421641
default: None,
1643-
object_lifetime_default: None,
1642+
object_lifetime_default: ty::ObjectLifetimeDefault::BaseDefault,
16441643
};
16451644

16461645
ccx.tcx.ty_param_defs.borrow_mut().insert(param_id, def.clone());
@@ -1925,19 +1924,20 @@ fn compute_object_lifetime_default<'a,'tcx>(ccx: &CrateCtxt<'a,'tcx>,
19251924
param_id: ast::NodeId,
19261925
param_bounds: &[ast::TyParamBound],
19271926
where_clause: &ast::WhereClause)
1928-
-> Option<ty::ObjectLifetimeDefault>
1927+
-> ty::ObjectLifetimeDefault
19291928
{
19301929
let inline_bounds = from_bounds(ccx, param_bounds);
19311930
let where_bounds = from_predicates(ccx, param_id, &where_clause.predicates);
19321931
let all_bounds: HashSet<_> = inline_bounds.into_iter()
19331932
.chain(where_bounds)
19341933
.collect();
19351934
return if all_bounds.len() > 1 {
1936-
Some(ty::ObjectLifetimeDefault::Ambiguous)
1935+
ty::ObjectLifetimeDefault::Ambiguous
1936+
} else if all_bounds.len() == 0 {
1937+
ty::ObjectLifetimeDefault::BaseDefault
19371938
} else {
1938-
all_bounds.into_iter()
1939-
.next()
1940-
.map(ty::ObjectLifetimeDefault::Specific)
1939+
ty::ObjectLifetimeDefault::Specific(
1940+
all_bounds.into_iter().next().unwrap())
19411941
};
19421942

19431943
fn from_bounds<'a,'tcx>(ccx: &CrateCtxt<'a,'tcx>,

src/librustc_typeck/rscope.rs

Lines changed: 61 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,13 @@ pub trait RegionScope {
3636
/// be derived from the object traits, what should we use? If
3737
/// `None` is returned, an explicit annotation is required.
3838
fn object_lifetime_default(&self, span: Span) -> Option<ty::Region>;
39+
40+
/// The "base" default is the initial default for a scope. This is
41+
/// 'static except for in fn bodies, where it is a fresh inference
42+
/// variable. You shouldn't call this except for as part of
43+
/// computing `object_lifetime_default` (in particular, in legacy
44+
/// modes, it may not be relevant).
45+
fn base_object_lifetime_default(&self, span: Span) -> ty::Region;
3946
}
4047

4148
// A scope in which all regions must be explicitly named. This is used
@@ -44,16 +51,20 @@ pub trait RegionScope {
4451
pub struct ExplicitRscope;
4552

4653
impl RegionScope for ExplicitRscope {
47-
fn object_lifetime_default(&self, _span: Span) -> Option<ty::Region> {
48-
Some(ty::ReStatic)
49-
}
50-
5154
fn anon_regions(&self,
5255
_span: Span,
5356
_count: usize)
5457
-> Result<Vec<ty::Region>, Option<Vec<(String, usize)>>> {
5558
Err(None)
5659
}
60+
61+
fn object_lifetime_default(&self, span: Span) -> Option<ty::Region> {
62+
Some(self.base_object_lifetime_default(span))
63+
}
64+
65+
fn base_object_lifetime_default(&self, _span: Span) -> ty::Region {
66+
ty::ReStatic
67+
}
5768
}
5869

5970
// Same as `ExplicitRscope`, but provides some extra information for diagnostics
@@ -66,17 +77,21 @@ impl UnelidableRscope {
6677
}
6778

6879
impl RegionScope for UnelidableRscope {
69-
fn object_lifetime_default(&self, _span: Span) -> Option<ty::Region> {
70-
Some(ty::ReStatic)
71-
}
72-
7380
fn anon_regions(&self,
7481
_span: Span,
7582
_count: usize)
7683
-> Result<Vec<ty::Region>, Option<Vec<(String, usize)>>> {
7784
let UnelidableRscope(ref v) = *self;
7885
Err(Some(v.clone()))
7986
}
87+
88+
fn object_lifetime_default(&self, span: Span) -> Option<ty::Region> {
89+
Some(self.base_object_lifetime_default(span))
90+
}
91+
92+
fn base_object_lifetime_default(&self, _span: Span) -> ty::Region {
93+
ty::ReStatic
94+
}
8095
}
8196

8297
// A scope in which omitted anonymous region defaults to
@@ -94,11 +109,15 @@ impl ElidableRscope {
94109
}
95110

96111
impl RegionScope for ElidableRscope {
97-
fn object_lifetime_default(&self, _span: Span) -> Option<ty::Region> {
112+
fn object_lifetime_default(&self, span: Span) -> Option<ty::Region> {
98113
// Per RFC #599, object-lifetimes default to 'static unless
99114
// overridden by context, and this takes precedence over
100115
// lifetime elision.
101-
Some(ty::ReStatic)
116+
Some(self.base_object_lifetime_default(span))
117+
}
118+
119+
fn base_object_lifetime_default(&self, _span: Span) -> ty::Region {
120+
ty::ReStatic
102121
}
103122

104123
fn anon_regions(&self,
@@ -131,11 +150,15 @@ impl BindingRscope {
131150
}
132151

133152
impl RegionScope for BindingRscope {
134-
fn object_lifetime_default(&self, _span: Span) -> Option<ty::Region> {
153+
fn object_lifetime_default(&self, span: Span) -> Option<ty::Region> {
135154
// Per RFC #599, object-lifetimes default to 'static unless
136155
// overridden by context, and this takes precedence over the
137-
// binding defaults.
138-
Some(ty::ReStatic)
156+
// binding defaults in a fn signature.
157+
Some(self.base_object_lifetime_default(span))
158+
}
159+
160+
fn base_object_lifetime_default(&self, _span: Span) -> ty::Region {
161+
ty::ReStatic
139162
}
140163

141164
fn anon_regions(&self,
@@ -150,12 +173,12 @@ impl RegionScope for BindingRscope {
150173
/// A scope which overrides the default object lifetime but has no other effect.
151174
pub struct ObjectLifetimeDefaultRscope<'r> {
152175
base_scope: &'r (RegionScope+'r),
153-
default: Option<ty::ObjectLifetimeDefault>,
176+
default: ty::ObjectLifetimeDefault,
154177
}
155178

156179
impl<'r> ObjectLifetimeDefaultRscope<'r> {
157180
pub fn new(base_scope: &'r (RegionScope+'r),
158-
default: Option<ty::ObjectLifetimeDefault>)
181+
default: ty::ObjectLifetimeDefault)
159182
-> ObjectLifetimeDefaultRscope<'r>
160183
{
161184
ObjectLifetimeDefaultRscope {
@@ -168,9 +191,25 @@ impl<'r> ObjectLifetimeDefaultRscope<'r> {
168191
impl<'r> RegionScope for ObjectLifetimeDefaultRscope<'r> {
169192
fn object_lifetime_default(&self, span: Span) -> Option<ty::Region> {
170193
match self.default {
171-
None => self.base_scope.object_lifetime_default(span),
172-
Some(ty::ObjectLifetimeDefault::Ambiguous) => None,
173-
Some(ty::ObjectLifetimeDefault::Specific(r)) => Some(r),
194+
ty::ObjectLifetimeDefault::Ambiguous =>
195+
None,
196+
197+
ty::ObjectLifetimeDefault::BaseDefault =>
198+
if false { // this will become the behavior in Rust 1.3
199+
Some(self.base_object_lifetime_default(span))
200+
} else {
201+
self.base_scope.object_lifetime_default(span)
202+
},
203+
204+
ty::ObjectLifetimeDefault::Specific(r) =>
205+
Some(r),
206+
}
207+
}
208+
209+
fn base_object_lifetime_default(&self, span: Span) -> ty::Region {
210+
assert!(false, "this code should not execute until Rust 1.3");
211+
self.base_scope.base_object_lifetime_default(span)
212+
}
174213
}
175214
}
176215

@@ -201,6 +240,10 @@ impl<'r> RegionScope for ShiftedRscope<'r> {
201240
.map(|r| ty_fold::shift_region(r, 1))
202241
}
203242

243+
fn base_object_lifetime_default(&self, span: Span) -> ty::Region {
244+
ty_fold::shift_region(self.base_scope.base_object_lifetime_default(span), 1)
245+
}
246+
204247
fn anon_regions(&self,
205248
span: Span,
206249
count: usize)

0 commit comments

Comments
 (0)