Skip to content

Commit afd6be7

Browse files
committed
reject external lifetimes as valid arguments
1 parent 2534296 commit afd6be7

File tree

3 files changed

+50
-2
lines changed

3 files changed

+50
-2
lines changed

compiler/rustc_borrowck/src/region_infer/opaque_types.rs

+10-2
Original file line numberDiff line numberDiff line change
@@ -80,8 +80,16 @@ impl<'tcx> RegionInferenceContext<'tcx> {
8080
NllRegionVariableOrigin::FreeRegion => self
8181
.universal_regions
8282
.universal_regions()
83-
.filter(|&ur| self.universal_region_relations.equal(vid, ur))
84-
.find_map(|ur| self.definitions[ur].external_name),
83+
.filter(|&ur| {
84+
use crate::universal_regions::RegionClassification as Class;
85+
matches!(
86+
self.universal_regions.region_classification(ur),
87+
Some(Class::Global | Class::Local)
88+
)
89+
})
90+
.filter(|&ur| ur != self.universal_regions.fr_fn_body)
91+
.find(|&ur| self.universal_region_relations.equal(vid, ur))
92+
.map(|ur| self.definitions[ur].external_name.unwrap()),
8593
NllRegionVariableOrigin::Placeholder(placeholder) => {
8694
Some(ty::Region::new_placeholder(infcx.tcx, placeholder))
8795
}
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() {}
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)