@@ -645,31 +645,18 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
645645 /// parameter while `f` is running (and restored afterwards).
646646 fn collect_in_band_defs < T > (
647647 & mut self ,
648- parent_def_id : LocalDefId ,
649- anonymous_lifetime_mode : AnonymousLifetimeMode ,
650- f : impl FnOnce ( & mut Self ) -> ( Vec < hir:: GenericParam < ' hir > > , T ) ,
651- ) -> ( Vec < hir:: GenericParam < ' hir > > , T ) {
648+ f : impl FnOnce ( & mut Self ) -> T ,
649+ ) -> ( Vec < ( Span , ParamName ) > , T ) {
652650 assert ! ( !self . is_collecting_in_band_lifetimes) ;
653651 assert ! ( self . lifetimes_to_define. is_empty( ) ) ;
654- let old_anonymous_lifetime_mode = self . anonymous_lifetime_mode ;
655-
656- self . anonymous_lifetime_mode = anonymous_lifetime_mode;
657652 self . is_collecting_in_band_lifetimes = true ;
658653
659- let ( in_band_ty_params , res) = f ( self ) ;
654+ let res = f ( self ) ;
660655
661656 self . is_collecting_in_band_lifetimes = false ;
662- self . anonymous_lifetime_mode = old_anonymous_lifetime_mode;
663-
664- let lifetimes_to_define = self . lifetimes_to_define . split_off ( 0 ) ;
665657
666- let params = lifetimes_to_define
667- . into_iter ( )
668- . map ( |( span, hir_name) | self . lifetime_to_generic_param ( span, hir_name, parent_def_id) )
669- . chain ( in_band_ty_params. into_iter ( ) )
670- . collect ( ) ;
671-
672- ( params, res)
658+ let lifetimes_to_define = std:: mem:: take ( & mut self . lifetimes_to_define ) ;
659+ ( lifetimes_to_define, res)
673660 }
674661
675662 /// Converts a lifetime into a new generic parameter.
@@ -784,27 +771,39 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
784771 anonymous_lifetime_mode : AnonymousLifetimeMode ,
785772 f : impl FnOnce ( & mut Self , & mut Vec < hir:: GenericParam < ' hir > > ) -> T ,
786773 ) -> ( hir:: Generics < ' hir > , T ) {
787- let ( in_band_defs, ( mut lowered_generics, res) ) =
788- self . with_in_scope_lifetime_defs ( & generics. params , |this| {
789- this. collect_in_band_defs ( parent_def_id, anonymous_lifetime_mode, |this| {
790- let mut params = Vec :: new ( ) ;
791- // Note: it is necessary to lower generics *before* calling `f`.
792- // When lowering `async fn`, there's a final step when lowering
793- // the return type that assumes that all in-scope lifetimes have
794- // already been added to either `in_scope_lifetimes` or
795- // `lifetimes_to_define`. If we swapped the order of these two,
796- // in-band-lifetimes introduced by generics or where-clauses
797- // wouldn't have been added yet.
798- let generics = this. lower_generics_mut (
799- generics,
800- ImplTraitContext :: Universal ( & mut params, this. current_hir_id_owner ) ,
801- ) ;
802- let res = f ( this, & mut params) ;
803- ( params, ( generics, res) )
774+ let ( lifetimes_to_define, ( mut lowered_generics, impl_trait_defs, res) ) = self
775+ . collect_in_band_defs ( |this| {
776+ this. with_anonymous_lifetime_mode ( anonymous_lifetime_mode, |this| {
777+ this. with_in_scope_lifetime_defs ( & generics. params , |this| {
778+ let mut impl_trait_defs = Vec :: new ( ) ;
779+ // Note: it is necessary to lower generics *before* calling `f`.
780+ // When lowering `async fn`, there's a final step when lowering
781+ // the return type that assumes that all in-scope lifetimes have
782+ // already been added to either `in_scope_lifetimes` or
783+ // `lifetimes_to_define`. If we swapped the order of these two,
784+ // in-band-lifetimes introduced by generics or where-clauses
785+ // wouldn't have been added yet.
786+ let generics = this. lower_generics_mut (
787+ generics,
788+ ImplTraitContext :: Universal (
789+ & mut impl_trait_defs,
790+ this. current_hir_id_owner ,
791+ ) ,
792+ ) ;
793+ let res = f ( this, & mut impl_trait_defs) ;
794+ ( generics, impl_trait_defs, res)
795+ } )
804796 } )
805797 } ) ;
806798
807- lowered_generics. params . extend ( in_band_defs) ;
799+ lowered_generics. params . extend (
800+ lifetimes_to_define
801+ . into_iter ( )
802+ . map ( |( span, hir_name) | {
803+ self . lifetime_to_generic_param ( span, hir_name, parent_def_id)
804+ } )
805+ . chain ( impl_trait_defs) ,
806+ ) ;
808807
809808 let lowered_generics = lowered_generics. into_generics ( self . arena ) ;
810809 ( lowered_generics, res)
0 commit comments