@@ -249,6 +249,11 @@ pub(super) fn generics_of(tcx: TyCtxt<'_>, def_id: DefId) -> ty::Generics {
249249 // Now create the real type and const parameters.
250250 let type_start = own_start - has_self as u32 + params. len ( ) as u32 ;
251251 let mut i = 0 ;
252+ let mut next_index = || {
253+ let prev = i;
254+ i += 1 ;
255+ prev as u32 + type_start
256+ } ;
252257
253258 const TYPE_DEFAULT_NOT_ALLOWED : & ' static str = "defaults for type parameters are only allowed in \
254259 `struct`, `enum`, `type`, or `trait` definitions";
@@ -278,15 +283,13 @@ pub(super) fn generics_of(tcx: TyCtxt<'_>, def_id: DefId) -> ty::Generics {
278283
279284 let kind = ty:: GenericParamDefKind :: Type { has_default : default. is_some ( ) , synthetic } ;
280285
281- let param_def = ty:: GenericParamDef {
282- index : type_start + i as u32 ,
286+ Some ( ty:: GenericParamDef {
287+ index : next_index ( ) ,
283288 name : param. name . ident ( ) . name ,
284289 def_id : tcx. hir ( ) . local_def_id ( param. hir_id ) . to_def_id ( ) ,
285290 pure_wrt_drop : param. pure_wrt_drop ,
286291 kind,
287- } ;
288- i += 1 ;
289- Some ( param_def)
292+ } )
290293 }
291294 GenericParamKind :: Const { default, .. } => {
292295 if !matches ! ( allow_defaults, Defaults :: Allowed ) && default. is_some ( ) {
@@ -297,15 +300,13 @@ pub(super) fn generics_of(tcx: TyCtxt<'_>, def_id: DefId) -> ty::Generics {
297300 ) ;
298301 }
299302
300- let param_def = ty:: GenericParamDef {
301- index : type_start + i as u32 ,
303+ Some ( ty:: GenericParamDef {
304+ index : next_index ( ) ,
302305 name : param. name . ident ( ) . name ,
303306 def_id : tcx. hir ( ) . local_def_id ( param. hir_id ) . to_def_id ( ) ,
304307 pure_wrt_drop : param. pure_wrt_drop ,
305308 kind : ty:: GenericParamDefKind :: Const { has_default : default. is_some ( ) } ,
306- } ;
307- i += 1 ;
308- Some ( param_def)
309+ } )
309310 }
310311 } ) ) ;
311312
@@ -323,8 +324,8 @@ pub(super) fn generics_of(tcx: TyCtxt<'_>, def_id: DefId) -> ty::Generics {
323324 & [ "<closure_kind>" , "<closure_signature>" , "<upvars>" ] [ ..]
324325 } ;
325326
326- params. extend ( dummy_args. iter ( ) . enumerate ( ) . map ( |( i , & arg) | ty:: GenericParamDef {
327- index : type_start + i as u32 ,
327+ params. extend ( dummy_args. iter ( ) . map ( |& arg| ty:: GenericParamDef {
328+ index : next_index ( ) ,
328329 name : Symbol :: intern ( arg) ,
329330 def_id,
330331 pure_wrt_drop : false ,
@@ -337,7 +338,7 @@ pub(super) fn generics_of(tcx: TyCtxt<'_>, def_id: DefId) -> ty::Generics {
337338 let parent_node = tcx. hir ( ) . get ( tcx. hir ( ) . get_parent_node ( hir_id) ) ;
338339 if let Node :: Expr ( & Expr { kind : ExprKind :: ConstBlock ( _) , .. } ) = parent_node {
339340 params. push ( ty:: GenericParamDef {
340- index : type_start ,
341+ index : next_index ( ) ,
341342 name : Symbol :: intern ( "<const_ty>" ) ,
342343 def_id,
343344 pure_wrt_drop : false ,
0 commit comments