Skip to content

Commit 4f559f8

Browse files
committed
rustc_typeck: force users of RegionScope to get anon_region's one by one.
1 parent 154c202 commit 4f559f8

File tree

3 files changed

+39
-74
lines changed

3 files changed

+39
-74
lines changed

src/librustc_typeck/astconv.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -306,9 +306,8 @@ impl<'o, 'gcx: 'tcx, 'tcx> AstConv<'gcx, 'tcx>+'o {
306306
ast_region_to_region(self.tcx(), lifetime)
307307
}
308308

309-
None => self.tcx().mk_region(match rscope.anon_regions(default_span, 1) {
310-
Ok(rs) => rs[0],
311-
Err(params) => {
309+
None => {
310+
self.tcx().mk_region(rscope.anon_region(default_span).unwrap_or_else(|params| {
312311
let ampersand_span = Span { hi: default_span.lo, ..default_span};
313312

314313
let mut err = struct_span_err!(self.tcx().sess, ampersand_span, E0106,
@@ -320,8 +319,8 @@ impl<'o, 'gcx: 'tcx, 'tcx> AstConv<'gcx, 'tcx>+'o {
320319
}
321320
err.emit();
322321
ty::ReStatic
323-
}
324-
})
322+
}))
323+
}
325324
};
326325

327326
debug!("opt_ast_region_to_region(opt_lifetime={:?}) yields {:?}",
@@ -412,8 +411,9 @@ impl<'o, 'gcx: 'tcx, 'tcx> AstConv<'gcx, 'tcx>+'o {
412411
let regions = if expected_num_region_params == supplied_num_region_params {
413412
lifetimes.iter().map(|l| *ast_region_to_region(tcx, l)).collect()
414413
} else {
415-
let anon_regions =
416-
rscope.anon_regions(span, expected_num_region_params);
414+
let anon_regions = (0..expected_num_region_params).map(|_| {
415+
rscope.anon_region(span)
416+
}).collect::<Result<Vec<_>, _>>();
417417

418418
if supplied_num_region_params != 0 || anon_regions.is_err() {
419419
report_lifetime_number_error(tcx, span,

src/librustc_typeck/check/mod.rs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1466,11 +1466,9 @@ impl<'a, 'gcx, 'tcx> RegionScope for FnCtxt<'a, 'gcx, 'tcx> {
14661466
*self.next_region_var(infer::MiscVariable(span))
14671467
}
14681468

1469-
fn anon_regions(&self, span: Span, count: usize)
1470-
-> Result<Vec<ty::Region>, Option<Vec<ElisionFailureInfo>>> {
1471-
Ok((0..count).map(|_| {
1472-
*self.next_region_var(infer::MiscVariable(span))
1473-
}).collect())
1469+
fn anon_region(&self, span: Span)
1470+
-> Result<ty::Region, Option<Vec<ElisionFailureInfo>>> {
1471+
Ok(*self.next_region_var(infer::MiscVariable(span)))
14741472
}
14751473
}
14761474

src/librustc_typeck/rscope.rs

Lines changed: 29 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -33,18 +33,16 @@ pub type ElidedLifetime = Result<ty::Region, Option<Vec<ElisionFailureInfo>>>;
3333
/// Defines strategies for handling regions that are omitted. For
3434
/// example, if one writes the type `&Foo`, then the lifetime of
3535
/// this reference has been omitted. When converting this
36-
/// type, the generic functions in astconv will invoke `anon_regions`
36+
/// type, the generic functions in astconv will invoke `anon_region`
3737
/// on the provided region-scope to decide how to translate this
3838
/// omitted region.
3939
///
40-
/// It is not always legal to omit regions, therefore `anon_regions`
40+
/// It is not always legal to omit regions, therefore `anon_region`
4141
/// can return `Err(())` to indicate that this is not a scope in which
4242
/// regions can legally be omitted.
4343
pub trait RegionScope {
44-
fn anon_regions(&self,
45-
span: Span,
46-
count: usize)
47-
-> Result<Vec<ty::Region>, Option<Vec<ElisionFailureInfo>>>;
44+
fn anon_region(&self, span: Span)
45+
-> Result<ty::Region, Option<Vec<ElisionFailureInfo>>>;
4846

4947
/// If an object omits any explicit lifetime bound, and none can
5048
/// be derived from the object traits, what should we use? If
@@ -117,11 +115,9 @@ impl<R: RegionScope> RegionScope for MaybeWithAnonTypes<R> {
117115
self.base_scope.object_lifetime_default(span)
118116
}
119117

120-
fn anon_regions(&self,
121-
span: Span,
122-
count: usize)
123-
-> Result<Vec<ty::Region>, Option<Vec<ElisionFailureInfo>>> {
124-
self.base_scope.anon_regions(span, count)
118+
fn anon_region(&self, span: Span)
119+
-> Result<ty::Region, Option<Vec<ElisionFailureInfo>>> {
120+
self.base_scope.anon_region(span)
125121
}
126122

127123
fn base_object_lifetime_default(&self, span: Span) -> ty::Region {
@@ -139,10 +135,8 @@ impl<R: RegionScope> RegionScope for MaybeWithAnonTypes<R> {
139135
pub struct ExplicitRscope;
140136

141137
impl RegionScope for ExplicitRscope {
142-
fn anon_regions(&self,
143-
_span: Span,
144-
_count: usize)
145-
-> Result<Vec<ty::Region>, Option<Vec<ElisionFailureInfo>>> {
138+
fn anon_region(&self, _span: Span)
139+
-> Result<ty::Region, Option<Vec<ElisionFailureInfo>>> {
146140
Err(None)
147141
}
148142

@@ -165,12 +159,9 @@ impl UnelidableRscope {
165159
}
166160

167161
impl RegionScope for UnelidableRscope {
168-
fn anon_regions(&self,
169-
_span: Span,
170-
_count: usize)
171-
-> Result<Vec<ty::Region>, Option<Vec<ElisionFailureInfo>>> {
172-
let UnelidableRscope(ref v) = *self;
173-
Err(v.clone())
162+
fn anon_region(&self, _span: Span)
163+
-> Result<ty::Region, Option<Vec<ElisionFailureInfo>>> {
164+
Err(self.0.clone())
174165
}
175166

176167
fn object_lifetime_default(&self, span: Span) -> Option<ty::Region> {
@@ -208,12 +199,10 @@ impl RegionScope for ElidableRscope {
208199
ty::ReStatic
209200
}
210201

211-
fn anon_regions(&self,
212-
_span: Span,
213-
count: usize)
214-
-> Result<Vec<ty::Region>, Option<Vec<ElisionFailureInfo>>>
202+
fn anon_region(&self, _span: Span)
203+
-> Result<ty::Region, Option<Vec<ElisionFailureInfo>>>
215204
{
216-
Ok(vec![self.default; count])
205+
Ok(self.default)
217206
}
218207
}
219208

@@ -232,10 +221,8 @@ impl<'a, 'gcx: 'a + 'tcx, 'tcx: 'a> StaticRscope<'a, 'gcx, 'tcx> {
232221
}
233222

234223
impl<'a, 'gcx: 'a + 'tcx, 'tcx: 'a> RegionScope for StaticRscope<'a, 'gcx, 'tcx> {
235-
fn anon_regions(&self,
236-
span: Span,
237-
count: usize)
238-
-> Result<Vec<ty::Region>, Option<Vec<ElisionFailureInfo>>> {
224+
fn anon_region(&self, span: Span)
225+
-> Result<ty::Region, Option<Vec<ElisionFailureInfo>>> {
239226
if !self.tcx.sess.features.borrow().static_in_const {
240227
self.tcx
241228
.sess
@@ -244,7 +231,7 @@ impl<'a, 'gcx: 'a + 'tcx, 'tcx: 'a> RegionScope for StaticRscope<'a, 'gcx, 'tcx>
244231
`static_in_const` feature, see #35897")
245232
.emit();
246233
}
247-
Ok(vec![ty::ReStatic; count])
234+
Ok(ty::ReStatic)
248235
}
249236

250237
fn object_lifetime_default(&self, span: Span) -> Option<ty::Region> {
@@ -268,12 +255,6 @@ impl BindingRscope {
268255
anon_bindings: Cell::new(0),
269256
}
270257
}
271-
272-
fn next_region(&self) -> ty::Region {
273-
let idx = self.anon_bindings.get();
274-
self.anon_bindings.set(idx + 1);
275-
ty::ReLateBound(ty::DebruijnIndex::new(1), ty::BrAnon(idx))
276-
}
277258
}
278259

279260
impl RegionScope for BindingRscope {
@@ -288,12 +269,12 @@ impl RegionScope for BindingRscope {
288269
ty::ReStatic
289270
}
290271

291-
fn anon_regions(&self,
292-
_: Span,
293-
count: usize)
294-
-> Result<Vec<ty::Region>, Option<Vec<ElisionFailureInfo>>>
272+
fn anon_region(&self, _: Span)
273+
-> Result<ty::Region, Option<Vec<ElisionFailureInfo>>>
295274
{
296-
Ok((0..count).map(|_| self.next_region()).collect())
275+
let idx = self.anon_bindings.get();
276+
self.anon_bindings.set(idx + 1);
277+
Ok(ty::ReLateBound(ty::DebruijnIndex::new(1), ty::BrAnon(idx)))
297278
}
298279
}
299280

@@ -334,12 +315,10 @@ impl<'r> RegionScope for ObjectLifetimeDefaultRscope<'r> {
334315
self.base_scope.base_object_lifetime_default(span)
335316
}
336317

337-
fn anon_regions(&self,
338-
span: Span,
339-
count: usize)
340-
-> Result<Vec<ty::Region>, Option<Vec<ElisionFailureInfo>>>
318+
fn anon_region(&self, span: Span)
319+
-> Result<ty::Region, Option<Vec<ElisionFailureInfo>>>
341320
{
342-
self.base_scope.anon_regions(span, count)
321+
self.base_scope.anon_region(span)
343322
}
344323

345324
fn anon_type_scope(&self) -> Option<AnonTypeScope> {
@@ -369,22 +348,10 @@ impl<'r> RegionScope for ShiftedRscope<'r> {
369348
ty::fold::shift_region(self.base_scope.base_object_lifetime_default(span), 1)
370349
}
371350

372-
fn anon_regions(&self,
373-
span: Span,
374-
count: usize)
375-
-> Result<Vec<ty::Region>, Option<Vec<ElisionFailureInfo>>>
351+
fn anon_region(&self, span: Span)
352+
-> Result<ty::Region, Option<Vec<ElisionFailureInfo>>>
376353
{
377-
match self.base_scope.anon_regions(span, count) {
378-
Ok(mut v) => {
379-
for r in &mut v {
380-
*r = ty::fold::shift_region(*r, 1);
381-
}
382-
Ok(v)
383-
}
384-
Err(errs) => {
385-
Err(errs)
386-
}
387-
}
354+
self.base_scope.anon_region(span).map(|r| ty::fold::shift_region(r, 1))
388355
}
389356

390357
fn anon_type_scope(&self) -> Option<AnonTypeScope> {

0 commit comments

Comments
 (0)