@@ -1928,10 +1928,10 @@ impl<'a, 'tcx> LifetimeContext<'a, 'tcx> {
1928
1928
}
1929
1929
1930
1930
fn visit_generic_param ( & mut self , param : & hir:: GenericParam ) {
1931
- if let hir:: GenericParam :: Lifetime ( ref lifetime_def ) = * param {
1932
- for l in & lifetime_def . bounds {
1933
- self . visit_lifetime ( l ) ;
1934
- }
1931
+ if let hir:: GenericParam :: Lifetime ( _ ) = * param {
1932
+ // FIXME(eddyb) Do we want this? It only makes a difference
1933
+ // if this `for<'a>` lifetime parameter is never used.
1934
+ self . have_bound_regions = true ;
1935
1935
}
1936
1936
1937
1937
intravisit:: walk_generic_param ( self , param) ;
@@ -2144,28 +2144,26 @@ impl<'a, 'tcx> LifetimeContext<'a, 'tcx> {
2144
2144
2145
2145
fn check_lifetime_params ( & mut self , old_scope : ScopeRef , params : & ' tcx [ hir:: GenericParam ] ) {
2146
2146
for ( i, lifetime_i) in params. lifetimes ( ) . enumerate ( ) {
2147
- for lifetime in params. lifetimes ( ) {
2148
- match lifetime. lifetime . name {
2149
- hir:: LifetimeName :: Static | hir:: LifetimeName :: Underscore => {
2150
- let lifetime = lifetime. lifetime ;
2151
- let name = lifetime. name . name ( ) ;
2152
- let mut err = struct_span_err ! (
2153
- self . tcx. sess,
2154
- lifetime. span,
2155
- E0262 ,
2156
- "invalid lifetime parameter name: `{}`" ,
2157
- name
2158
- ) ;
2159
- err. span_label (
2160
- lifetime. span ,
2161
- format ! ( "{} is a reserved lifetime name" , name) ,
2162
- ) ;
2163
- err. emit ( ) ;
2164
- }
2165
- hir:: LifetimeName :: Fresh ( _)
2166
- | hir:: LifetimeName :: Implicit
2167
- | hir:: LifetimeName :: Name ( _) => { }
2147
+ match lifetime_i. lifetime . name {
2148
+ hir:: LifetimeName :: Static | hir:: LifetimeName :: Underscore => {
2149
+ let lifetime = lifetime_i. lifetime ;
2150
+ let name = lifetime. name . name ( ) ;
2151
+ let mut err = struct_span_err ! (
2152
+ self . tcx. sess,
2153
+ lifetime. span,
2154
+ E0262 ,
2155
+ "invalid lifetime parameter name: `{}`" ,
2156
+ name
2157
+ ) ;
2158
+ err. span_label (
2159
+ lifetime. span ,
2160
+ format ! ( "{} is a reserved lifetime name" , name) ,
2161
+ ) ;
2162
+ err. emit ( ) ;
2168
2163
}
2164
+ hir:: LifetimeName :: Fresh ( _)
2165
+ | hir:: LifetimeName :: Implicit
2166
+ | hir:: LifetimeName :: Name ( _) => { }
2169
2167
}
2170
2168
2171
2169
// It is a hard error to shadow a lifetime within the same scope.
@@ -2347,31 +2345,18 @@ impl<'a, 'tcx> LifetimeContext<'a, 'tcx> {
2347
2345
| Region :: LateBound ( _, def_id, _)
2348
2346
| Region :: EarlyBound ( _, def_id, _) => {
2349
2347
// A lifetime declared by the user.
2350
- let def_local_id = self . tcx . hir . as_local_node_id ( def_id) . unwrap ( ) ;
2351
- if def_local_id == lifetime_ref. id {
2352
- // This is weird. Because the HIR defines a
2353
- // lifetime *definition* as wrapping a Lifetime,
2354
- // we wind up invoking this method also for the
2355
- // definitions in some cases (notably
2356
- // higher-ranked types). This means that a
2357
- // lifetime with one use (e.g., `for<'a> fn(&'a
2358
- // u32)`) wind up being counted as two uses. To
2359
- // avoid that, we just ignore the lifetime that
2360
- // corresponds to the definition.
2348
+ let track_lifetime_uses = self . track_lifetime_uses ( ) ;
2349
+ debug ! (
2350
+ "insert_lifetime: track_lifetime_uses={}" ,
2351
+ track_lifetime_uses
2352
+ ) ;
2353
+ if track_lifetime_uses && !self . lifetime_uses . contains_key ( & def_id) {
2354
+ debug ! ( "insert_lifetime: first use of {:?}" , def_id) ;
2355
+ self . lifetime_uses
2356
+ . insert ( def_id, LifetimeUseSet :: One ( lifetime_ref) ) ;
2361
2357
} else {
2362
- let track_lifetime_uses = self . track_lifetime_uses ( ) ;
2363
- debug ! (
2364
- "insert_lifetime: track_lifetime_uses={}" ,
2365
- track_lifetime_uses
2366
- ) ;
2367
- if track_lifetime_uses && !self . lifetime_uses . contains_key ( & def_id) {
2368
- debug ! ( "insert_lifetime: first use of {:?}" , def_id) ;
2369
- self . lifetime_uses
2370
- . insert ( def_id, LifetimeUseSet :: One ( lifetime_ref) ) ;
2371
- } else {
2372
- debug ! ( "insert_lifetime: many uses of {:?}" , def_id) ;
2373
- self . lifetime_uses . insert ( def_id, LifetimeUseSet :: Many ) ;
2374
- }
2358
+ debug ! ( "insert_lifetime: many uses of {:?}" , def_id) ;
2359
+ self . lifetime_uses . insert ( def_id, LifetimeUseSet :: Many ) ;
2375
2360
}
2376
2361
}
2377
2362
}
@@ -2424,31 +2409,20 @@ fn insert_late_bound_lifetimes(
2424
2409
let mut appears_in_where_clause = AllCollector {
2425
2410
regions : FxHashSet ( ) ,
2426
2411
} ;
2412
+ appears_in_where_clause. visit_generics ( generics) ;
2427
2413
2428
2414
for param in & generics. params {
2429
2415
match * param {
2430
2416
hir:: GenericParam :: Lifetime ( ref lifetime_def) => {
2431
2417
if !lifetime_def. bounds . is_empty ( ) {
2432
2418
// `'a: 'b` means both `'a` and `'b` are referenced
2433
- appears_in_where_clause. visit_generic_param ( param ) ;
2419
+ appears_in_where_clause. regions . insert ( lifetime_def . lifetime . name ) ;
2434
2420
}
2435
2421
}
2436
- hir:: GenericParam :: Type ( ref ty_param) => {
2437
- walk_list ! (
2438
- & mut appears_in_where_clause,
2439
- visit_ty_param_bound,
2440
- & ty_param. bounds
2441
- ) ;
2442
- }
2422
+ hir:: GenericParam :: Type ( _) => { }
2443
2423
}
2444
2424
}
2445
2425
2446
- walk_list ! (
2447
- & mut appears_in_where_clause,
2448
- visit_where_predicate,
2449
- & generics. where_clause. predicates
2450
- ) ;
2451
-
2452
2426
debug ! (
2453
2427
"insert_late_bound_lifetimes: appears_in_where_clause={:?}" ,
2454
2428
appears_in_where_clause. regions
0 commit comments