File tree 3 files changed +50
-4
lines changed
compiler/rustc_borrowck/src/region_infer
tests/ui/type-alias-impl-trait
3 files changed +50
-4
lines changed Original file line number Diff line number Diff line change @@ -18,6 +18,7 @@ use rustc_trait_selection::traits::ObligationCtxt;
18
18
19
19
use crate :: session_diagnostics:: LifetimeMismatchOpaqueParam ;
20
20
use crate :: session_diagnostics:: NonGenericOpaqueTypeParam ;
21
+ use crate :: universal_regions:: RegionClassification ;
21
22
22
23
use super :: RegionInferenceContext ;
23
24
@@ -162,10 +163,15 @@ impl<'tcx> RegionInferenceContext<'tcx> {
162
163
NllRegionVariableOrigin :: FreeRegion => self
163
164
. universal_regions
164
165
. 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 ( ) ) ,
169
175
NllRegionVariableOrigin :: Placeholder ( placeholder) => {
170
176
Some ( ty:: Region :: new_placeholder ( infcx. tcx , placeholder) )
171
177
}
Original file line number Diff line number Diff line change
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 number Diff line number Diff line change
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`.
You can’t perform that action at this time.
0 commit comments