@@ -9,14 +9,14 @@ use rustc_errors::Applicability;
99use rustc_hir:: FnRetTy :: Return ;
1010use rustc_hir:: intravisit:: nested_filter:: { self as hir_nested_filter, NestedFilter } ;
1111use rustc_hir:: intravisit:: {
12- Visitor , VisitorExt , walk_fn_decl, walk_generic_args, walk_generics , walk_impl_item_ref , walk_param_bound ,
13- walk_poly_trait_ref, walk_trait_ref, walk_ty, walk_unambig_ty, walk_where_predicate,
12+ Visitor , VisitorExt , walk_fn_decl, walk_generic_args, walk_generic_param , walk_generics , walk_impl_item_ref ,
13+ walk_param_bound , walk_poly_trait_ref, walk_trait_ref, walk_ty, walk_unambig_ty, walk_where_predicate,
1414} ;
1515use rustc_hir:: {
1616 AmbigArg , BodyId , FnDecl , FnPtrTy , FnSig , GenericArg , GenericArgs , GenericBound , GenericParam , GenericParamKind ,
1717 Generics , HirId , Impl , ImplItem , ImplItemKind , Item , ItemKind , Lifetime , LifetimeKind , LifetimeParamKind , Node ,
18- PolyTraitRef , PredicateOrigin , TraitFn , TraitItem , TraitItemKind , Ty , TyKind , WhereBoundPredicate , WherePredicate ,
19- WherePredicateKind , lang_items,
18+ PolyTraitRef , PredicateOrigin , TraitFn , TraitItem , TraitItemKind , TraitRef , Ty , TyKind , WhereBoundPredicate ,
19+ WherePredicate , WherePredicateKind , lang_items,
2020} ;
2121use rustc_lint:: { LateContext , LateLintPass , LintContext } ;
2222use rustc_middle:: hir:: nested_filter as middle_nested_filter;
@@ -160,6 +160,10 @@ impl<'tcx> LateLintPass<'tcx> for Lifetimes {
160160 }
161161 }
162162
163+ fn check_poly_trait_ref ( & mut self , cx : & LateContext < ' tcx > , poly_trait_ref : & ' tcx PolyTraitRef < ' tcx > ) {
164+ report_extra_trait_object_lifetimes ( cx, poly_trait_ref. bound_generic_params , & poly_trait_ref. trait_ref ) ;
165+ }
166+
163167 fn check_impl_item ( & mut self , cx : & LateContext < ' tcx > , item : & ' tcx ImplItem < ' _ > ) {
164168 if let ImplItemKind :: Fn ( ref sig, id) = item. kind {
165169 let report_extra_lifetimes = trait_ref_of_method ( cx, item. owner_id ) . is_none ( ) ;
@@ -587,9 +591,8 @@ impl<'cx, 'tcx, F> LifetimeChecker<'cx, 'tcx, F>
587591where
588592 F : NestedFilter < ' tcx > ,
589593{
590- fn new ( cx : & ' cx LateContext < ' tcx > , generics : & ' tcx Generics < ' _ > ) -> LifetimeChecker < ' cx , ' tcx , F > {
591- let map = generics
592- . params
594+ fn new ( cx : & ' cx LateContext < ' tcx > , generic_params : & ' tcx [ GenericParam < ' _ > ] ) -> LifetimeChecker < ' cx , ' tcx , F > {
595+ let map = generic_params
593596 . iter ( )
594597 . filter_map ( |par| match par. kind {
595598 GenericParamKind :: Lifetime {
@@ -598,6 +601,7 @@ where
598601 _ => None ,
599602 } )
600603 . collect ( ) ;
604+
601605 Self {
602606 cx,
603607 map,
@@ -711,8 +715,36 @@ fn is_candidate_for_elision(fd: &FnDecl<'_>) -> bool {
711715 }
712716}
713717
718+ fn report_extra_trait_object_lifetimes < ' tcx > (
719+ cx : & LateContext < ' tcx > ,
720+ generic_params : & ' tcx [ GenericParam < ' _ > ] ,
721+ trait_ref : & ' tcx TraitRef < ' tcx > ,
722+ ) {
723+ let mut checker = LifetimeChecker :: < hir_nested_filter:: None > :: new ( cx, generic_params) ;
724+
725+ for param in generic_params {
726+ walk_generic_param ( & mut checker, param) ;
727+ }
728+
729+ walk_trait_ref ( & mut checker, trait_ref) ;
730+
731+ for ( def_id, usages) in checker. map {
732+ if usages
733+ . iter ( )
734+ . all ( |usage| usage. in_where_predicate && !usage. in_bounded_ty && !usage. in_generics_arg )
735+ {
736+ span_lint (
737+ cx,
738+ EXTRA_UNUSED_LIFETIMES ,
739+ cx. tcx . def_span ( def_id) ,
740+ "this lifetime isn't used in the type" ,
741+ ) ;
742+ }
743+ }
744+ }
745+
714746fn report_extra_lifetimes < ' tcx > ( cx : & LateContext < ' tcx > , func : & ' tcx FnDecl < ' _ > , generics : & ' tcx Generics < ' _ > ) {
715- let mut checker = LifetimeChecker :: < hir_nested_filter:: None > :: new ( cx, generics) ;
747+ let mut checker = LifetimeChecker :: < hir_nested_filter:: None > :: new ( cx, generics. params ) ;
716748
717749 walk_generics ( & mut checker, generics) ;
718750 walk_fn_decl ( & mut checker, func) ;
@@ -733,7 +765,7 @@ fn report_extra_lifetimes<'tcx>(cx: &LateContext<'tcx>, func: &'tcx FnDecl<'_>,
733765}
734766
735767fn report_extra_impl_lifetimes < ' tcx > ( cx : & LateContext < ' tcx > , impl_ : & ' tcx Impl < ' _ > ) {
736- let mut checker = LifetimeChecker :: < middle_nested_filter:: All > :: new ( cx, impl_. generics ) ;
768+ let mut checker = LifetimeChecker :: < middle_nested_filter:: All > :: new ( cx, impl_. generics . params ) ;
737769
738770 walk_generics ( & mut checker, impl_. generics ) ;
739771 if let Some ( of_trait) = impl_. of_trait {
0 commit comments