Skip to content

Commit 37b1f6c

Browse files
committed
Auto merge of #42482 - eddyb:issue-42467, r=nikomatsakis
rustc: T: 'empty always holds for all types. Fixes #42467 by special-casing `ReEmpty` to always hold, even for parameters. The reason this is the case is that `ReEmpty` is the result of inferring a region variable with no constraints attached to it, so there is no lifetime a type would contain which would be strictly shorter. r? @nikomatsakis
2 parents 89fceaa + ec7195f commit 37b1f6c

File tree

2 files changed

+39
-0
lines changed

2 files changed

+39
-0
lines changed

src/librustc/infer/region_inference/mod.rs

+7
Original file line numberDiff line numberDiff line change
@@ -1201,6 +1201,13 @@ impl<'a, 'gcx, 'tcx> RegionVarBindings<'a, 'gcx, 'tcx> {
12011201
for verify in self.verifys.borrow().iter() {
12021202
debug!("collect_errors: verify={:?}", verify);
12031203
let sub = normalize(self.tcx, var_data, verify.region);
1204+
1205+
// This was an inference variable which didn't get
1206+
// constrained, therefore it can be assume to hold.
1207+
if let ty::ReEmpty = *sub {
1208+
continue;
1209+
}
1210+
12041211
if verify.bound.is_met(region_rels, var_data, sub) {
12051212
continue;
12061213
}

src/test/run-pass/issue-42467.rs

+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
// Copyright 2017 The Rust Project Developers. See the COPYRIGHT
2+
// file at the top-level directory of this distribution and at
3+
// http://rust-lang.org/COPYRIGHT.
4+
//
5+
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6+
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7+
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8+
// option. This file may not be copied, modified, or distributed
9+
// except according to those terms.
10+
11+
struct Foo<T>(T);
12+
13+
struct IntoIter<T>(T);
14+
15+
impl<'a, T: 'a> Iterator for IntoIter<T> {
16+
type Item = ();
17+
18+
fn next(&mut self) -> Option<()> {
19+
None
20+
}
21+
}
22+
23+
impl<T> IntoIterator for Foo<T> {
24+
type Item = ();
25+
type IntoIter = IntoIter<T>;
26+
27+
fn into_iter(self) -> IntoIter<T> {
28+
IntoIter(self.0)
29+
}
30+
}
31+
32+
fn main() {}

0 commit comments

Comments
 (0)