@@ -810,23 +810,31 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
810
810
/// name resolver owing to lifetime elision; this also populates the resolver's node-id->def-id
811
811
/// map, so that later calls to `opt_node_id_to_def_id` that refer to these extra lifetime
812
812
/// parameters will be successful.
813
- #[ instrument( level = "debug" , skip( self ) ) ]
813
+ #[ instrument( level = "debug" , skip( self , in_binder ) ) ]
814
814
#[ inline]
815
- fn lower_lifetime_binder (
815
+ fn lower_lifetime_binder < R > (
816
816
& mut self ,
817
817
binder : NodeId ,
818
818
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 {
821
821
let extra_lifetimes = self . resolver . take_extra_lifetime_params ( binder) ;
822
822
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 ( ) ;
826
834
let generic_params = self . arena . alloc_from_iter ( generic_params) ;
827
835
debug ! ( ?generic_params) ;
828
836
829
- generic_params
837
+ in_binder ( self , generic_params)
830
838
}
831
839
832
840
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> {
1236
1244
hir:: TyKind :: Rptr ( lifetime, self . lower_mt ( mt, itctx) )
1237
1245
}
1238
1246
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
+ } )
1247
1256
}
1248
1257
TyKind :: Never => hir:: TyKind :: Never ,
1249
1258
TyKind :: Tup ( ref tys) => hir:: TyKind :: Tup (
@@ -2140,10 +2149,14 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
2140
2149
p : & PolyTraitRef ,
2141
2150
itctx : & mut ImplTraitContext ,
2142
2151
) -> 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
+ )
2147
2160
}
2148
2161
2149
2162
fn lower_mt ( & mut self , mt : & MutTy , itctx : & mut ImplTraitContext ) -> hir:: MutTy < ' hir > {
0 commit comments