@@ -893,7 +893,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
893893 // in-band-lifetimes introduced by generics or where-clauses
894894 // wouldn't have been added yet.
895895 let generics =
896- this. lower_generics ( generics, ImplTraitContext :: Universal ( & mut params) ) ;
896+ this. lower_generics_mut ( generics, ImplTraitContext :: Universal ( & mut params) ) ;
897897 let res = f ( this, & mut params) ;
898898 ( params, ( generics, res) )
899899 } )
@@ -914,6 +914,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
914914
915915 lowered_generics. params = lowered_params. into ( ) ;
916916
917+ let lowered_generics = lowered_generics. into_generics ( self . arena ) ;
917918 ( lowered_generics, res)
918919 }
919920
@@ -1224,28 +1225,25 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
12241225 } ;
12251226 hir:: TyKind :: Rptr ( lifetime, self . lower_mt ( mt, itctx) )
12261227 }
1227- TyKind :: BareFn ( ref f) => self . with_in_scope_lifetime_defs ( & f. generic_params , |this| {
1228- this. with_anonymous_lifetime_mode ( AnonymousLifetimeMode :: PassThrough , |this| {
1229- hir:: TyKind :: BareFn (
1230- this. arena . alloc ( hir:: BareFnTy {
1231- generic_params : this. arena . alloc_from_iter (
1232- this. lower_generic_params (
1233- & f. generic_params ,
1234- & NodeMap :: default ( ) ,
1235- ImplTraitContext :: disallowed ( ) ,
1236- )
1237- . into_iter ( ) ,
1228+ TyKind :: BareFn ( ref f) => {
1229+ self . with_in_scope_lifetime_defs ( & f. generic_params , |this| {
1230+ this. with_anonymous_lifetime_mode ( AnonymousLifetimeMode :: PassThrough , |this| {
1231+ hir:: TyKind :: BareFn ( this. arena . alloc ( hir:: BareFnTy {
1232+ generic_params : this. lower_generic_params (
1233+ & f. generic_params ,
1234+ & NodeMap :: default ( ) ,
1235+ ImplTraitContext :: disallowed ( ) ,
12381236 ) ,
12391237 unsafety : f. unsafety ,
12401238 abi : this. lower_extern ( f. ext ) ,
12411239 decl : this. lower_fn_decl ( & f. decl , None , false , None ) ,
12421240 param_names : this. arena . alloc_from_iter (
12431241 this. lower_fn_params_to_names ( & f. decl ) . into_iter ( ) ,
12441242 ) ,
1245- } ) ,
1246- )
1243+ } ) )
1244+ } )
12471245 } )
1248- } ) ,
1246+ }
12491247 TyKind :: Never => hir:: TyKind :: Never ,
12501248 TyKind :: Tup ( ref tys) => {
12511249 hir:: TyKind :: Tup ( self . arena . alloc_from_iter (
@@ -1414,12 +1412,13 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
14141412 opaque_ty_def_index,
14151413 & hir_bounds,
14161414 ) ;
1415+ let lifetime_defs = self . arena . alloc_from_iter ( lifetime_defs. into_iter ( ) ) ;
14171416
14181417 debug ! ( "lower_opaque_impl_trait: lifetimes={:#?}" , lifetimes, ) ;
14191418
14201419 debug ! ( "lower_opaque_impl_trait: lifetime_defs={:#?}" , lifetime_defs, ) ;
14211420
1422- self . with_hir_id_owner ( opaque_ty_node_id, |lctx| {
1421+ self . with_hir_id_owner ( opaque_ty_node_id, move |lctx| {
14231422 let opaque_ty_item = hir:: OpaqueTy {
14241423 generics : hir:: Generics {
14251424 params : lifetime_defs,
@@ -1978,7 +1977,11 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
19781977 hir_id : Some ( id) ,
19791978 res : Some ( self . lower_res ( res) ) ,
19801979 infer_args,
1981- args : if generic_args. is_empty ( ) { None } else { Some ( self . arena . alloc ( generic_args) ) } ,
1980+ args : if generic_args. is_empty ( ) {
1981+ None
1982+ } else {
1983+ Some ( self . arena . alloc ( generic_args. into_generic_args ( self . arena ) ) )
1984+ } ,
19821985 }
19831986 }
19841987
@@ -1987,15 +1990,15 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
19871990 data : & AngleBracketedArgs ,
19881991 param_mode : ParamMode ,
19891992 mut itctx : ImplTraitContext < ' _ , ' hir > ,
1990- ) -> ( hir :: GenericArgs < ' hir > , bool ) {
1993+ ) -> ( GenericArgsCtor < ' hir > , bool ) {
19911994 let & AngleBracketedArgs { ref args, ref constraints, .. } = data;
19921995 let has_non_lt_args = args. iter ( ) . any ( |arg| match arg {
19931996 ast:: GenericArg :: Lifetime ( _) => false ,
19941997 ast:: GenericArg :: Type ( _) => true ,
19951998 ast:: GenericArg :: Const ( _) => true ,
19961999 } ) ;
19972000 (
1998- hir :: GenericArgs {
2001+ GenericArgsCtor {
19992002 args : args. iter ( ) . map ( |a| self . lower_generic_arg ( a, itctx. reborrow ( ) ) ) . collect ( ) ,
20002003 bindings : self . arena . alloc_from_iter (
20012004 constraints. iter ( ) . map ( |b| self . lower_assoc_ty_constraint ( b, itctx. reborrow ( ) ) ) ,
@@ -2009,7 +2012,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
20092012 fn lower_parenthesized_parameter_data (
20102013 & mut self ,
20112014 data : & ParenthesizedArgs ,
2012- ) -> ( hir :: GenericArgs < ' hir > , bool ) {
2015+ ) -> ( GenericArgsCtor < ' hir > , bool ) {
20132016 // Switch to `PassThrough` mode for anonymous lifetimes; this
20142017 // means that we permit things like `&Ref<T>`, where `Ref` has
20152018 // a hidden lifetime parameter. This is needed for backwards
@@ -2024,15 +2027,15 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
20242027 FunctionRetTy :: Ty ( ty) => this. lower_ty ( & ty, ImplTraitContext :: disallowed ( ) ) ,
20252028 FunctionRetTy :: Default ( _) => this. arena . alloc ( this. ty_tup ( span, & [ ] ) ) ,
20262029 } ;
2027- let args = hir_vec ! [ GenericArg :: Type ( this. ty_tup( span, inputs) ) ] ;
2030+ let args = vec ! [ GenericArg :: Type ( this. ty_tup( span, inputs) ) ] ;
20282031 let binding = hir:: TypeBinding {
20292032 hir_id : this. next_id ( ) ,
20302033 ident : Ident :: with_dummy_span ( FN_OUTPUT_NAME ) ,
20312034 span : output_ty. span ,
20322035 kind : hir:: TypeBindingKind :: Equality { ty : output_ty } ,
20332036 } ;
20342037 (
2035- hir :: GenericArgs { args, bindings : arena_vec ! [ this; binding] , parenthesized : true } ,
2038+ GenericArgsCtor { args, bindings : arena_vec ! [ this; binding] , parenthesized : true } ,
20362039 false ,
20372040 )
20382041 } )
@@ -2310,12 +2313,10 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
23102313 debug ! ( "lower_async_fn_ret_ty: lifetimes_to_define={:#?}" , this. lifetimes_to_define) ;
23112314 debug ! ( "lower_async_fn_ret_ty: lifetime_params={:#?}" , lifetime_params) ;
23122315
2313- let generic_params = lifetime_params
2314- . iter ( )
2315- . map ( |( span, hir_name) | {
2316+ let generic_params =
2317+ this. arena . alloc_from_iter ( lifetime_params. iter ( ) . map ( |( span, hir_name) | {
23162318 this. lifetime_to_generic_param ( * span, * hir_name, opaque_ty_def_index)
2317- } )
2318- . collect ( ) ;
2319+ } ) ) ;
23192320
23202321 let opaque_ty_item = hir:: OpaqueTy {
23212322 generics : hir:: Generics {
@@ -2395,7 +2396,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
23952396
23962397 // "<Output = T>"
23972398 let future_params = self . arena . alloc ( hir:: GenericArgs {
2398- args : HirVec :: new ( ) ,
2399+ args : & [ ] ,
23992400 bindings : arena_vec ! [ self ; hir:: TypeBinding {
24002401 ident: Ident :: with_dummy_span( FN_OUTPUT_NAME ) ,
24012402 kind: hir:: TypeBindingKind :: Equality { ty: output_ty } ,
@@ -2474,18 +2475,27 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
24742475 hir:: Lifetime { hir_id : self . lower_node_id ( id) , span, name }
24752476 }
24762477
2477- fn lower_generic_params (
2478+ fn lower_generic_params_mut (
24782479 & mut self ,
24792480 params : & [ GenericParam ] ,
24802481 add_bounds : & NodeMap < Vec < GenericBound > > ,
24812482 mut itctx : ImplTraitContext < ' _ , ' hir > ,
2482- ) -> HirVec < hir:: GenericParam < ' hir > > {
2483+ ) -> Vec < hir:: GenericParam < ' hir > > {
24832484 params
24842485 . iter ( )
24852486 . map ( |param| self . lower_generic_param ( param, add_bounds, itctx. reborrow ( ) ) )
24862487 . collect ( )
24872488 }
24882489
2490+ fn lower_generic_params (
2491+ & mut self ,
2492+ params : & [ GenericParam ] ,
2493+ add_bounds : & NodeMap < Vec < GenericBound > > ,
2494+ itctx : ImplTraitContext < ' _ , ' hir > ,
2495+ ) -> & ' hir [ hir:: GenericParam < ' hir > ] {
2496+ self . arena . alloc_from_iter ( self . lower_generic_params_mut ( params, add_bounds, itctx) )
2497+ }
2498+
24892499 fn lower_generic_param (
24902500 & mut self ,
24912501 param : & GenericParam ,
@@ -2593,11 +2603,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
25932603 this. lower_trait_ref ( & p. trait_ref , itctx)
25942604 } ) ;
25952605
2596- hir:: PolyTraitRef {
2597- bound_generic_params : self . arena . alloc_from_iter ( bound_generic_params. into_iter ( ) ) ,
2598- trait_ref,
2599- span : p. span ,
2600- }
2606+ hir:: PolyTraitRef { bound_generic_params, trait_ref, span : p. span }
26012607 }
26022608
26032609 fn lower_mt ( & mut self , mt : & MutTy , itctx : ImplTraitContext < ' _ , ' hir > ) -> hir:: MutTy < ' hir > {
@@ -3304,3 +3310,24 @@ fn body_ids(bodies: &BTreeMap<hir::BodyId, hir::Body<'hir>>) -> Vec<hir::BodyId>
33043310 body_ids. sort_by_key ( |b| bodies[ b] . value . span ) ;
33053311 body_ids
33063312}
3313+
3314+ /// Helper struct for delayed construction of GenericArgs.
3315+ struct GenericArgsCtor < ' hir > {
3316+ args : Vec < hir:: GenericArg < ' hir > > ,
3317+ bindings : & ' hir [ hir:: TypeBinding < ' hir > ] ,
3318+ parenthesized : bool ,
3319+ }
3320+
3321+ impl GenericArgsCtor < ' hir > {
3322+ fn is_empty ( & self ) -> bool {
3323+ self . args . is_empty ( ) && self . bindings . is_empty ( ) && !self . parenthesized
3324+ }
3325+
3326+ fn into_generic_args ( self , arena : & ' hir Arena < ' hir > ) -> hir:: GenericArgs < ' hir > {
3327+ hir:: GenericArgs {
3328+ args : arena. alloc_from_iter ( self . args ) ,
3329+ bindings : self . bindings ,
3330+ parenthesized : self . parenthesized ,
3331+ }
3332+ }
3333+ }
0 commit comments