@@ -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