@@ -1928,10 +1928,10 @@ impl<'a, 'tcx> LifetimeContext<'a, 'tcx> {
19281928 }
19291929
19301930 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 ;
19351935 }
19361936
19371937 intravisit:: walk_generic_param ( self , param) ;
@@ -2144,28 +2144,26 @@ impl<'a, 'tcx> LifetimeContext<'a, 'tcx> {
21442144
21452145 fn check_lifetime_params ( & mut self , old_scope : ScopeRef , params : & ' tcx [ hir:: GenericParam ] ) {
21462146 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 ( ) ;
21682163 }
2164+ hir:: LifetimeName :: Fresh ( _)
2165+ | hir:: LifetimeName :: Implicit
2166+ | hir:: LifetimeName :: Name ( _) => { }
21692167 }
21702168
21712169 // It is a hard error to shadow a lifetime within the same scope.
@@ -2347,31 +2345,18 @@ impl<'a, 'tcx> LifetimeContext<'a, 'tcx> {
23472345 | Region :: LateBound ( _, def_id, _)
23482346 | Region :: EarlyBound ( _, def_id, _) => {
23492347 // 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) ) ;
23612357 } 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 ) ;
23752360 }
23762361 }
23772362 }
@@ -2424,31 +2409,20 @@ fn insert_late_bound_lifetimes(
24242409 let mut appears_in_where_clause = AllCollector {
24252410 regions : FxHashSet ( ) ,
24262411 } ;
2412+ appears_in_where_clause. visit_generics ( generics) ;
24272413
24282414 for param in & generics. params {
24292415 match * param {
24302416 hir:: GenericParam :: Lifetime ( ref lifetime_def) => {
24312417 if !lifetime_def. bounds . is_empty ( ) {
24322418 // `'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 ) ;
24342420 }
24352421 }
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 ( _) => { }
24432423 }
24442424 }
24452425
2446- walk_list ! (
2447- & mut appears_in_where_clause,
2448- visit_where_predicate,
2449- & generics. where_clause. predicates
2450- ) ;
2451-
24522426 debug ! (
24532427 "insert_late_bound_lifetimes: appears_in_where_clause={:?}" ,
24542428 appears_in_where_clause. regions
0 commit comments