@@ -808,23 +808,31 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
808808 /// name resolver owing to lifetime elision; this also populates the resolver's node-id->def-id
809809 /// map, so that later calls to `opt_node_id_to_def_id` that refer to these extra lifetime
810810 /// parameters will be successful.
811- #[ instrument( level = "debug" , skip( self ) ) ]
811+ #[ instrument( level = "debug" , skip( self , in_binder ) ) ]
812812 #[ inline]
813- fn lower_lifetime_binder (
813+ fn lower_lifetime_binder < R > (
814814 & mut self ,
815815 binder : NodeId ,
816816 generic_params : & [ GenericParam ] ,
817- ) -> & ' hir [ hir:: GenericParam < ' hir > ] {
818- let mut generic_params : Vec < _ > = self . lower_generic_params_mut ( generic_params ) . collect ( ) ;
817+ in_binder : impl FnOnce ( & mut Self , & ' hir [ hir:: GenericParam < ' hir > ] ) -> R ,
818+ ) -> R {
819819 let extra_lifetimes = self . resolver . take_extra_lifetime_params ( binder) ;
820820 debug ! ( ?extra_lifetimes) ;
821- generic_params. extend ( extra_lifetimes. into_iter ( ) . filter_map ( |( ident, node_id, res) | {
822- self . lifetime_res_to_generic_param ( ident, node_id, res)
823- } ) ) ;
821+ let extra_lifetimes: Vec < _ > = extra_lifetimes
822+ . into_iter ( )
823+ . filter_map ( |( ident, node_id, res) | {
824+ self . lifetime_res_to_generic_param ( ident, node_id, res)
825+ } )
826+ . collect ( ) ;
827+
828+ let generic_params: Vec < _ > = self
829+ . lower_generic_params_mut ( generic_params)
830+ . chain ( extra_lifetimes. into_iter ( ) )
831+ . collect ( ) ;
824832 let generic_params = self . arena . alloc_from_iter ( generic_params) ;
825833 debug ! ( ?generic_params) ;
826834
827- generic_params
835+ in_binder ( self , generic_params)
828836 }
829837
830838 fn with_dyn_type_scope < T > ( & mut self , in_scope : bool , f : impl FnOnce ( & mut Self ) -> T ) -> T {
@@ -1233,14 +1241,15 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
12331241 hir:: TyKind :: Rptr ( lifetime, self . lower_mt ( mt, itctx) )
12341242 }
12351243 TyKind :: BareFn ( ref f) => {
1236- let generic_params = self . lower_lifetime_binder ( t. id , & f. generic_params ) ;
1237- hir:: TyKind :: BareFn ( self . arena . alloc ( hir:: BareFnTy {
1238- generic_params,
1239- unsafety : self . lower_unsafety ( f. unsafety ) ,
1240- abi : self . lower_extern ( f. ext ) ,
1241- decl : self . lower_fn_decl ( & f. decl , None , FnDeclKind :: Pointer , None ) ,
1242- param_names : self . lower_fn_params_to_names ( & f. decl ) ,
1243- } ) )
1244+ self . lower_lifetime_binder ( t. id , & f. generic_params , |lctx, generic_params| {
1245+ hir:: TyKind :: BareFn ( lctx. arena . alloc ( hir:: BareFnTy {
1246+ generic_params,
1247+ unsafety : lctx. lower_unsafety ( f. unsafety ) ,
1248+ abi : lctx. lower_extern ( f. ext ) ,
1249+ decl : lctx. lower_fn_decl ( & f. decl , None , FnDeclKind :: Pointer , None ) ,
1250+ param_names : lctx. lower_fn_params_to_names ( & f. decl ) ,
1251+ } ) )
1252+ } )
12441253 }
12451254 TyKind :: Never => hir:: TyKind :: Never ,
12461255 TyKind :: Tup ( ref tys) => hir:: TyKind :: Tup (
@@ -2133,10 +2142,14 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
21332142 p : & PolyTraitRef ,
21342143 itctx : ImplTraitContext ,
21352144 ) -> hir:: PolyTraitRef < ' hir > {
2136- let bound_generic_params =
2137- self . lower_lifetime_binder ( p. trait_ref . ref_id , & p. bound_generic_params ) ;
2138- let trait_ref = self . lower_trait_ref ( & p. trait_ref , itctx) ;
2139- hir:: PolyTraitRef { bound_generic_params, trait_ref, span : self . lower_span ( p. span ) }
2145+ self . lower_lifetime_binder (
2146+ p. trait_ref . ref_id ,
2147+ & p. bound_generic_params ,
2148+ |lctx, bound_generic_params| {
2149+ let trait_ref = lctx. lower_trait_ref ( & p. trait_ref , itctx) ;
2150+ hir:: PolyTraitRef { bound_generic_params, trait_ref, span : lctx. lower_span ( p. span ) }
2151+ } ,
2152+ )
21402153 }
21412154
21422155 fn lower_mt ( & mut self , mt : & MutTy , itctx : ImplTraitContext ) -> hir:: MutTy < ' hir > {
0 commit comments