@@ -874,25 +874,32 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
874
874
/// name resolver owing to lifetime elision; this also populates the resolver's node-id->def-id
875
875
/// map, so that later calls to `opt_node_id_to_def_id` that refer to these extra lifetime
876
876
/// parameters will be successful.
877
- #[ instrument( level = "debug" , skip( self ) ) ]
877
+ #[ instrument( level = "debug" , skip( self ) , ret ) ]
878
878
#[ inline]
879
879
fn lower_lifetime_binder (
880
880
& mut self ,
881
881
binder : NodeId ,
882
882
generic_params : & [ GenericParam ] ,
883
883
) -> & ' hir [ hir:: GenericParam < ' hir > ] {
884
- let mut generic_params: Vec < _ > = self
885
- . lower_generic_params_mut ( generic_params, hir:: GenericParamSource :: Binder )
886
- . collect ( ) ;
884
+ // Start by creating params for extra lifetimes params, as this creates the definitions
885
+ // that may be referred to by the AST inside `generic_params`.
887
886
let extra_lifetimes = self . resolver . extra_lifetime_params ( binder) ;
888
887
debug ! ( ?extra_lifetimes) ;
889
- generic_params. extend ( extra_lifetimes. into_iter ( ) . filter_map ( |( ident, node_id, res) | {
890
- self . lifetime_res_to_generic_param ( ident, node_id, res, hir:: GenericParamSource :: Binder )
891
- } ) ) ;
892
- let generic_params = self . arena . alloc_from_iter ( generic_params) ;
893
- debug ! ( ?generic_params) ;
894
-
895
- generic_params
888
+ let extra_lifetimes: Vec < _ > = extra_lifetimes
889
+ . into_iter ( )
890
+ . filter_map ( |( ident, node_id, res) | {
891
+ self . lifetime_res_to_generic_param (
892
+ ident,
893
+ node_id,
894
+ res,
895
+ hir:: GenericParamSource :: Binder ,
896
+ )
897
+ } )
898
+ . collect ( ) ;
899
+ let arena = self . arena ;
900
+ let explicit_generic_params =
901
+ self . lower_generic_params_mut ( generic_params, hir:: GenericParamSource :: Binder ) ;
902
+ arena. alloc_from_iter ( explicit_generic_params. chain ( extra_lifetimes. into_iter ( ) ) )
896
903
}
897
904
898
905
fn with_dyn_type_scope < T > ( & mut self , in_scope : bool , f : impl FnOnce ( & mut Self ) -> T ) -> T {
0 commit comments