@@ -810,23 +810,31 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
810810/// name resolver owing to lifetime elision; this also populates the resolver's node-id->def-id 
811811/// map, so that later calls to `opt_node_id_to_def_id` that refer to these extra lifetime 
812812/// parameters will be successful. 
813- #[ instrument( level = "debug" ,  skip( self ) ) ]  
813+ #[ instrument( level = "debug" ,  skip( self ,  in_binder ) ) ]  
814814    #[ inline]  
815-     fn  lower_lifetime_binder ( 
815+     fn  lower_lifetime_binder < R > ( 
816816        & mut  self , 
817817        binder :  NodeId , 
818818        generic_params :  & [ GenericParam ] , 
819-     )  ->  & ' hir  [ hir:: GenericParam < ' hir > ]   { 
820-          let   mut  generic_params :   Vec < _ >  =  self . lower_generic_params_mut ( generic_params ) . collect ( ) ; 
819+          in_binder :   impl   FnOnce ( & mut   Self ,   & ' hir  [ hir:: GenericParam < ' hir > ] )  ->  R , 
820+     )  ->  R   { 
821821        let  extra_lifetimes = self . resolver . take_extra_lifetime_params ( binder) ; 
822822        debug ! ( ?extra_lifetimes) ; 
823-         generic_params. extend ( extra_lifetimes. into_iter ( ) . filter_map ( |( ident,  node_id,  res) | { 
824-             self . lifetime_res_to_generic_param ( ident,  node_id,  res) 
825-         } ) ) ; 
823+         let  extra_lifetimes:  Vec < _ >  = extra_lifetimes
824+             . into_iter ( ) 
825+             . filter_map ( |( ident,  node_id,  res) | { 
826+                 self . lifetime_res_to_generic_param ( ident,  node_id,  res) 
827+             } ) 
828+             . collect ( ) ; 
829+ 
830+         let  generic_params:  Vec < _ >  = self 
831+             . lower_generic_params_mut ( generic_params) 
832+             . chain ( extra_lifetimes. into_iter ( ) ) 
833+             . collect ( ) ; 
826834        let  generic_params = self . arena . alloc_from_iter ( generic_params) ; 
827835        debug ! ( ?generic_params) ; 
828836
829-         generic_params
837+         in_binder ( self ,   generic_params) 
830838    } 
831839
832840    fn  with_dyn_type_scope < T > ( & mut  self ,  in_scope :  bool ,  f :  impl  FnOnce ( & mut  Self )  -> T )  -> T  { 
@@ -1236,14 +1244,15 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
12361244                hir:: TyKind :: Rptr ( lifetime,  self . lower_mt ( mt,  itctx) ) 
12371245            } 
12381246            TyKind :: BareFn ( ref  f)  => { 
1239-                 let  generic_params = self . lower_lifetime_binder ( t. id ,  & f. generic_params ) ; 
1240-                 hir:: TyKind :: BareFn ( self . arena . alloc ( hir:: BareFnTy  { 
1241-                     generic_params, 
1242-                     unsafety :  self . lower_unsafety ( f. unsafety ) , 
1243-                     abi :  self . lower_extern ( f. ext ) , 
1244-                     decl :  self . lower_fn_decl ( & f. decl ,  None ,  FnDeclKind :: Pointer ,  None ) , 
1245-                     param_names :  self . lower_fn_params_to_names ( & f. decl ) , 
1246-                 } ) ) 
1247+                 self . lower_lifetime_binder ( t. id ,  & f. generic_params ,  |lctx,  generic_params| { 
1248+                     hir:: TyKind :: BareFn ( lctx. arena . alloc ( hir:: BareFnTy  { 
1249+                         generic_params, 
1250+                         unsafety :  lctx. lower_unsafety ( f. unsafety ) , 
1251+                         abi :  lctx. lower_extern ( f. ext ) , 
1252+                         decl :  lctx. lower_fn_decl ( & f. decl ,  None ,  FnDeclKind :: Pointer ,  None ) , 
1253+                         param_names :  lctx. lower_fn_params_to_names ( & f. decl ) , 
1254+                     } ) ) 
1255+                 } ) 
12471256            } 
12481257            TyKind :: Never  => hir:: TyKind :: Never , 
12491258            TyKind :: Tup ( ref  tys)  => hir:: TyKind :: Tup ( 
@@ -2140,10 +2149,14 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
21402149        p :  & PolyTraitRef , 
21412150        itctx :  & mut  ImplTraitContext , 
21422151    )  -> hir:: PolyTraitRef < ' hir >  { 
2143-         let  bound_generic_params =
2144-             self . lower_lifetime_binder ( p. trait_ref . ref_id ,  & p. bound_generic_params ) ; 
2145-         let  trait_ref = self . lower_trait_ref ( & p. trait_ref ,  itctx) ; 
2146-         hir:: PolyTraitRef  {  bound_generic_params,  trait_ref,  span :  self . lower_span ( p. span )  } 
2152+         self . lower_lifetime_binder ( 
2153+             p. trait_ref . ref_id , 
2154+             & p. bound_generic_params , 
2155+             |lctx,  bound_generic_params| { 
2156+                 let  trait_ref = lctx. lower_trait_ref ( & p. trait_ref ,  itctx) ; 
2157+                 hir:: PolyTraitRef  {  bound_generic_params,  trait_ref,  span :  lctx. lower_span ( p. span )  } 
2158+             } , 
2159+         ) 
21472160    } 
21482161
21492162    fn  lower_mt ( & mut  self ,  mt :  & MutTy ,  itctx :  & mut  ImplTraitContext )  -> hir:: MutTy < ' hir >  { 
0 commit comments