@@ -1314,31 +1314,6 @@ impl<'hir> LoweringContext<'_, 'hir> {
13141314 }
13151315 }
13161316
1317- let mut lowered_generics = self . lower_generics_mut ( generics, itctx) ;
1318- let res = f ( self ) ;
1319-
1320- let extra_lifetimes = self . resolver . take_extra_lifetime_params ( parent_node_id) ;
1321- let impl_trait_defs = std:: mem:: take ( & mut self . impl_trait_defs ) ;
1322- lowered_generics. params . extend (
1323- extra_lifetimes
1324- . into_iter ( )
1325- . filter_map ( |( ident, node_id, res) | {
1326- self . lifetime_res_to_generic_param ( ident, node_id, res)
1327- } )
1328- . chain ( impl_trait_defs. into_iter ( ) ) ,
1329- ) ;
1330- let impl_trait_bounds = std:: mem:: take ( & mut self . impl_trait_bounds ) ;
1331- lowered_generics. predicates . extend ( impl_trait_bounds. into_iter ( ) ) ;
1332-
1333- let lowered_generics = lowered_generics. into_generics ( self . arena ) ;
1334- ( lowered_generics, res)
1335- }
1336-
1337- pub ( super ) fn lower_generics_mut (
1338- & mut self ,
1339- generics : & Generics ,
1340- itctx : ImplTraitContext ,
1341- ) -> GenericsCtor < ' hir > {
13421317 // Error if `?Trait` bounds in where clauses don't refer directly to type parameters.
13431318 // Note: we used to clone these bounds directly onto the type parameter (and avoid lowering
13441319 // these into hir when we lower thee where clauses), but this makes it quite difficult to
@@ -1386,7 +1361,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
13861361 }
13871362 }
13881363
1389- let mut predicates = SmallVec :: new ( ) ;
1364+ let mut predicates: SmallVec < [ hir :: WherePredicate < ' hir > ; 4 ] > = SmallVec :: new ( ) ;
13901365 predicates. extend ( generics. params . iter ( ) . filter_map ( |param| {
13911366 let bounds = self . lower_param_bounds ( & param. bounds , itctx) ;
13921367 self . lower_generic_bound_predicate (
@@ -1405,13 +1380,34 @@ impl<'hir> LoweringContext<'_, 'hir> {
14051380 . map ( |predicate| self . lower_where_predicate ( predicate) ) ,
14061381 ) ;
14071382
1408- GenericsCtor {
1409- params : self . lower_generic_params_mut ( & generics. params ) . collect ( ) ,
1410- predicates,
1411- has_where_clause : !generics. where_clause . predicates . is_empty ( ) ,
1412- where_clause_span : self . lower_span ( generics. where_clause . span ) ,
1413- span : self . lower_span ( generics. span ) ,
1414- }
1383+ let mut params: Vec < _ > = self . lower_generic_params_mut ( & generics. params ) . collect ( ) ;
1384+ let has_where_clause = !generics. where_clause . predicates . is_empty ( ) ;
1385+ let where_clause_span = self . lower_span ( generics. where_clause . span ) ;
1386+ let span = self . lower_span ( generics. span ) ;
1387+ let res = f ( self ) ;
1388+
1389+ let extra_lifetimes = self . resolver . take_extra_lifetime_params ( parent_node_id) ;
1390+ let impl_trait_defs = std:: mem:: take ( & mut self . impl_trait_defs ) ;
1391+ params. extend (
1392+ extra_lifetimes
1393+ . into_iter ( )
1394+ . filter_map ( |( ident, node_id, res) | {
1395+ self . lifetime_res_to_generic_param ( ident, node_id, res)
1396+ } )
1397+ . chain ( impl_trait_defs. into_iter ( ) ) ,
1398+ ) ;
1399+ let impl_trait_bounds = std:: mem:: take ( & mut self . impl_trait_bounds ) ;
1400+ predicates. extend ( impl_trait_bounds. into_iter ( ) ) ;
1401+
1402+ let lowered_generics = self . arena . alloc ( hir:: Generics {
1403+ params : self . arena . alloc_from_iter ( params) ,
1404+ predicates : self . arena . alloc_from_iter ( predicates) ,
1405+ has_where_clause,
1406+ where_clause_span,
1407+ span,
1408+ } ) ;
1409+
1410+ ( lowered_generics, res)
14151411 }
14161412
14171413 pub ( super ) fn lower_generic_bound_predicate (
@@ -1527,24 +1523,3 @@ impl<'hir> LoweringContext<'_, 'hir> {
15271523 }
15281524 }
15291525}
1530-
1531- /// Helper struct for delayed construction of Generics.
1532- pub ( super ) struct GenericsCtor < ' hir > {
1533- pub ( super ) params : SmallVec < [ hir:: GenericParam < ' hir > ; 4 ] > ,
1534- pub ( super ) predicates : SmallVec < [ hir:: WherePredicate < ' hir > ; 4 ] > ,
1535- has_where_clause : bool ,
1536- where_clause_span : Span ,
1537- span : Span ,
1538- }
1539-
1540- impl < ' hir > GenericsCtor < ' hir > {
1541- pub ( super ) fn into_generics ( self , arena : & ' hir Arena < ' hir > ) -> & ' hir hir:: Generics < ' hir > {
1542- arena. alloc ( hir:: Generics {
1543- params : arena. alloc_from_iter ( self . params ) ,
1544- predicates : arena. alloc_from_iter ( self . predicates ) ,
1545- has_where_clause : self . has_where_clause ,
1546- where_clause_span : self . where_clause_span ,
1547- span : self . span ,
1548- } )
1549- }
1550- }
0 commit comments