Skip to content

Commit 6b6ed2e

Browse files
committed
reject external lifetimes as invalid arguments
1 parent f4940e4 commit 6b6ed2e

File tree

3 files changed

+50
-4
lines changed

3 files changed

+50
-4
lines changed

compiler/rustc_borrowck/src/region_infer/opaque_types.rs

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ use rustc_trait_selection::traits::ObligationCtxt;
1818

1919
use crate::session_diagnostics::LifetimeMismatchOpaqueParam;
2020
use crate::session_diagnostics::NonGenericOpaqueTypeParam;
21+
use crate::universal_regions::RegionClassification;
2122

2223
use super::RegionInferenceContext;
2324

@@ -162,10 +163,15 @@ impl<'tcx> RegionInferenceContext<'tcx> {
162163
NllRegionVariableOrigin::FreeRegion => self
163164
.universal_regions
164165
.universal_regions()
165-
.filter(|&ur| self.universal_region_relations.equal(vid, ur))
166-
// FIXME(aliemjay): universal regions with no `external_name`
167-
// are extenal closure regions, which should be rejected eventually.
168-
.find_map(|ur| self.definitions[ur].external_name),
166+
.filter(|&ur| {
167+
// See [rustc-dev-guide chapter] § "Closure restrictions".
168+
!matches!(
169+
self.universal_regions.region_classification(ur),
170+
Some(RegionClassification::External)
171+
)
172+
})
173+
.find(|&ur| self.universal_region_relations.equal(vid, ur))
174+
.map(|ur| self.definitions[ur].external_name.unwrap()),
169175
NllRegionVariableOrigin::Placeholder(placeholder) => {
170176
Some(ty::Region::new_placeholder(infcx.tcx, placeholder))
171177
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
#![feature(type_alias_impl_trait)]
2+
3+
mod case1 {
4+
type Opaque<'x> = impl Sized + 'x;
5+
fn foo<'s>() -> Opaque<'s> {
6+
let _ = || { let _: Opaque<'s> = (); };
7+
//~^ ERROR expected generic lifetime parameter, found `'_`
8+
}
9+
}
10+
11+
mod case2 {
12+
type Opaque<'x> = impl Sized + 'x;
13+
fn foo<'s>() -> Opaque<'s> {
14+
let _ = || -> Opaque<'s> {};
15+
//~^ ERROR expected generic lifetime parameter, found `'_`
16+
}
17+
}
18+
19+
fn main() {}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
error[E0792]: expected generic lifetime parameter, found `'_`
2+
--> $DIR/defined-in-closure-external-lifetime.rs:6:29
3+
|
4+
LL | type Opaque<'x> = impl Sized + 'x;
5+
| -- this generic parameter must be used with a generic lifetime parameter
6+
LL | fn foo<'s>() -> Opaque<'s> {
7+
LL | let _ = || { let _: Opaque<'s> = (); };
8+
| ^^^^^^^^^^
9+
10+
error[E0792]: expected generic lifetime parameter, found `'_`
11+
--> $DIR/defined-in-closure-external-lifetime.rs:14:34
12+
|
13+
LL | type Opaque<'x> = impl Sized + 'x;
14+
| -- this generic parameter must be used with a generic lifetime parameter
15+
LL | fn foo<'s>() -> Opaque<'s> {
16+
LL | let _ = || -> Opaque<'s> {};
17+
| ^^
18+
19+
error: aborting due to 2 previous errors
20+
21+
For more information about this error, try `rustc --explain E0792`.

0 commit comments

Comments
 (0)