@@ -851,25 +851,32 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
851851 /// name resolver owing to lifetime elision; this also populates the resolver's node-id->def-id
852852 /// map, so that later calls to `opt_node_id_to_def_id` that refer to these extra lifetime
853853 /// parameters will be successful.
854- #[ instrument( level = "debug" , skip( self ) ) ]
854+ #[ instrument( level = "debug" , skip( self ) , ret ) ]
855855 #[ inline]
856856 fn lower_lifetime_binder (
857857 & mut self ,
858858 binder : NodeId ,
859859 generic_params : & [ GenericParam ] ,
860860 ) -> & ' hir [ hir:: GenericParam < ' hir > ] {
861- let mut generic_params: Vec < _ > = self
862- . lower_generic_params_mut ( generic_params, hir:: GenericParamSource :: Binder )
863- . collect ( ) ;
861+ // Start by creating params for extra lifetimes params, as this creates the definitions
862+ // that may be referred to by the AST inside `generic_params`.
864863 let extra_lifetimes = self . resolver . extra_lifetime_params ( binder) ;
865864 debug ! ( ?extra_lifetimes) ;
866- generic_params. extend ( extra_lifetimes. into_iter ( ) . filter_map ( |( ident, node_id, res) | {
867- self . lifetime_res_to_generic_param ( ident, node_id, res, hir:: GenericParamSource :: Binder )
868- } ) ) ;
869- let generic_params = self . arena . alloc_from_iter ( generic_params) ;
870- debug ! ( ?generic_params) ;
871-
872- generic_params
865+ let extra_lifetimes: Vec < _ > = extra_lifetimes
866+ . into_iter ( )
867+ . filter_map ( |( ident, node_id, res) | {
868+ self . lifetime_res_to_generic_param (
869+ ident,
870+ node_id,
871+ res,
872+ hir:: GenericParamSource :: Binder ,
873+ )
874+ } )
875+ . collect ( ) ;
876+ let arena = self . arena ;
877+ let explicit_generic_params =
878+ self . lower_generic_params_mut ( generic_params, hir:: GenericParamSource :: Binder ) ;
879+ arena. alloc_from_iter ( explicit_generic_params. chain ( extra_lifetimes. into_iter ( ) ) )
873880 }
874881
875882 fn with_dyn_type_scope < T > ( & mut self , in_scope : bool , f : impl FnOnce ( & mut Self ) -> T ) -> T {
0 commit comments