@@ -249,6 +249,11 @@ pub(super) fn generics_of(tcx: TyCtxt<'_>, def_id: DefId) -> ty::Generics {
249
249
// Now create the real type and const parameters.
250
250
let type_start = own_start - has_self as u32 + params. len ( ) as u32 ;
251
251
let mut i = 0 ;
252
+ let mut next_index = || {
253
+ let prev = i;
254
+ i += 1 ;
255
+ prev as u32 + type_start
256
+ } ;
252
257
253
258
const TYPE_DEFAULT_NOT_ALLOWED : & ' static str = "defaults for type parameters are only allowed in \
254
259
`struct`, `enum`, `type`, or `trait` definitions";
@@ -278,15 +283,13 @@ pub(super) fn generics_of(tcx: TyCtxt<'_>, def_id: DefId) -> ty::Generics {
278
283
279
284
let kind = ty:: GenericParamDefKind :: Type { has_default : default. is_some ( ) , synthetic } ;
280
285
281
- let param_def = ty:: GenericParamDef {
282
- index : type_start + i as u32 ,
286
+ Some ( ty:: GenericParamDef {
287
+ index : next_index ( ) ,
283
288
name : param. name . ident ( ) . name ,
284
289
def_id : tcx. hir ( ) . local_def_id ( param. hir_id ) . to_def_id ( ) ,
285
290
pure_wrt_drop : param. pure_wrt_drop ,
286
291
kind,
287
- } ;
288
- i += 1 ;
289
- Some ( param_def)
292
+ } )
290
293
}
291
294
GenericParamKind :: Const { default, .. } => {
292
295
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 {
297
300
) ;
298
301
}
299
302
300
- let param_def = ty:: GenericParamDef {
301
- index : type_start + i as u32 ,
303
+ Some ( ty:: GenericParamDef {
304
+ index : next_index ( ) ,
302
305
name : param. name . ident ( ) . name ,
303
306
def_id : tcx. hir ( ) . local_def_id ( param. hir_id ) . to_def_id ( ) ,
304
307
pure_wrt_drop : param. pure_wrt_drop ,
305
308
kind : ty:: GenericParamDefKind :: Const { has_default : default. is_some ( ) } ,
306
- } ;
307
- i += 1 ;
308
- Some ( param_def)
309
+ } )
309
310
}
310
311
} ) ) ;
311
312
@@ -323,8 +324,8 @@ pub(super) fn generics_of(tcx: TyCtxt<'_>, def_id: DefId) -> ty::Generics {
323
324
& [ "<closure_kind>" , "<closure_signature>" , "<upvars>" ] [ ..]
324
325
} ;
325
326
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 ( ) ,
328
329
name : Symbol :: intern ( arg) ,
329
330
def_id,
330
331
pure_wrt_drop : false ,
@@ -337,7 +338,7 @@ pub(super) fn generics_of(tcx: TyCtxt<'_>, def_id: DefId) -> ty::Generics {
337
338
let parent_node = tcx. hir ( ) . get ( tcx. hir ( ) . get_parent_node ( hir_id) ) ;
338
339
if let Node :: Expr ( & Expr { kind : ExprKind :: ConstBlock ( _) , .. } ) = parent_node {
339
340
params. push ( ty:: GenericParamDef {
340
- index : type_start ,
341
+ index : next_index ( ) ,
341
342
name : Symbol :: intern ( "<const_ty>" ) ,
342
343
def_id,
343
344
pure_wrt_drop : false ,
0 commit comments