@@ -647,31 +647,18 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
647647 /// parameter while `f` is running (and restored afterwards).
648648 fn collect_in_band_defs < T > (
649649 & mut self ,
650- parent_def_id : LocalDefId ,
651- anonymous_lifetime_mode : AnonymousLifetimeMode ,
652- f : impl FnOnce ( & mut Self ) -> ( Vec < hir:: GenericParam < ' hir > > , T ) ,
653- ) -> ( Vec < hir:: GenericParam < ' hir > > , T ) {
650+ f : impl FnOnce ( & mut Self ) -> T ,
651+ ) -> ( Vec < ( Span , ParamName ) > , T ) {
654652 assert ! ( !self . is_collecting_in_band_lifetimes) ;
655653 assert ! ( self . lifetimes_to_define. is_empty( ) ) ;
656- let old_anonymous_lifetime_mode = self . anonymous_lifetime_mode ;
657-
658- self . anonymous_lifetime_mode = anonymous_lifetime_mode;
659654 self . is_collecting_in_band_lifetimes = true ;
660655
661- let ( in_band_ty_params , res) = f ( self ) ;
656+ let res = f ( self ) ;
662657
663658 self . is_collecting_in_band_lifetimes = false ;
664- self . anonymous_lifetime_mode = old_anonymous_lifetime_mode;
665-
666- let lifetimes_to_define = self . lifetimes_to_define . split_off ( 0 ) ;
667659
668- let params = lifetimes_to_define
669- . into_iter ( )
670- . map ( |( span, hir_name) | self . lifetime_to_generic_param ( span, hir_name, parent_def_id) )
671- . chain ( in_band_ty_params. into_iter ( ) )
672- . collect ( ) ;
673-
674- ( params, res)
660+ let lifetimes_to_define = std:: mem:: take ( & mut self . lifetimes_to_define ) ;
661+ ( lifetimes_to_define, res)
675662 }
676663
677664 /// Converts a lifetime into a new generic parameter.
@@ -786,27 +773,39 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
786773 anonymous_lifetime_mode : AnonymousLifetimeMode ,
787774 f : impl FnOnce ( & mut Self , & mut Vec < hir:: GenericParam < ' hir > > ) -> T ,
788775 ) -> ( hir:: Generics < ' hir > , T ) {
789- let ( in_band_defs, ( mut lowered_generics, res) ) =
790- self . with_in_scope_lifetime_defs ( & generics. params , |this| {
791- this. collect_in_band_defs ( parent_def_id, anonymous_lifetime_mode, |this| {
792- let mut params = Vec :: new ( ) ;
793- // Note: it is necessary to lower generics *before* calling `f`.
794- // When lowering `async fn`, there's a final step when lowering
795- // the return type that assumes that all in-scope lifetimes have
796- // already been added to either `in_scope_lifetimes` or
797- // `lifetimes_to_define`. If we swapped the order of these two,
798- // in-band-lifetimes introduced by generics or where-clauses
799- // wouldn't have been added yet.
800- let generics = this. lower_generics_mut (
801- generics,
802- ImplTraitContext :: Universal ( & mut params, this. current_hir_id_owner ) ,
803- ) ;
804- let res = f ( this, & mut params) ;
805- ( params, ( generics, res) )
776+ let ( lifetimes_to_define, ( mut lowered_generics, impl_trait_defs, res) ) = self
777+ . collect_in_band_defs ( |this| {
778+ this. with_anonymous_lifetime_mode ( anonymous_lifetime_mode, |this| {
779+ this. with_in_scope_lifetime_defs ( & generics. params , |this| {
780+ let mut impl_trait_defs = Vec :: new ( ) ;
781+ // Note: it is necessary to lower generics *before* calling `f`.
782+ // When lowering `async fn`, there's a final step when lowering
783+ // the return type that assumes that all in-scope lifetimes have
784+ // already been added to either `in_scope_lifetimes` or
785+ // `lifetimes_to_define`. If we swapped the order of these two,
786+ // in-band-lifetimes introduced by generics or where-clauses
787+ // wouldn't have been added yet.
788+ let generics = this. lower_generics_mut (
789+ generics,
790+ ImplTraitContext :: Universal (
791+ & mut impl_trait_defs,
792+ this. current_hir_id_owner ,
793+ ) ,
794+ ) ;
795+ let res = f ( this, & mut impl_trait_defs) ;
796+ ( generics, impl_trait_defs, res)
797+ } )
806798 } )
807799 } ) ;
808800
809- lowered_generics. params . extend ( in_band_defs) ;
801+ lowered_generics. params . extend (
802+ lifetimes_to_define
803+ . into_iter ( )
804+ . map ( |( span, hir_name) | {
805+ self . lifetime_to_generic_param ( span, hir_name, parent_def_id)
806+ } )
807+ . chain ( impl_trait_defs) ,
808+ ) ;
810809
811810 let lowered_generics = lowered_generics. into_generics ( self . arena ) ;
812811 ( lowered_generics, res)
0 commit comments