@@ -1306,47 +1306,67 @@ fn generics_of(tcx: TyCtxt<'_>, def_id: DefId) -> &ty::Generics {
1306
1306
// Now create the real type and const parameters.
1307
1307
let type_start = own_start - has_self as u32 + params. len ( ) as u32 ;
1308
1308
let mut i = 0 ;
1309
- params. extend ( ast_generics. params . iter ( ) . filter_map ( |param| {
1310
- let kind = match param. kind {
1311
- GenericParamKind :: Type { ref default, synthetic, .. } => {
1312
- if !allow_defaults && default. is_some ( ) {
1313
- if !tcx. features ( ) . default_type_parameter_fallback {
1314
- tcx. struct_span_lint_hir (
1315
- lint:: builtin:: INVALID_TYPE_PARAM_DEFAULT ,
1316
- param. hir_id ,
1317
- param. span ,
1318
- |lint| {
1319
- lint. build (
1320
- "defaults for type parameters are only allowed in \
1321
- `struct`, `enum`, `type`, or `trait` definitions.",
1322
- )
1323
- . emit ( ) ;
1324
- } ,
1325
- ) ;
1326
- }
1327
- }
1328
1309
1329
- ty:: GenericParamDefKind :: Type {
1330
- has_default : default. is_some ( ) ,
1331
- object_lifetime_default : object_lifetime_defaults
1332
- . as_ref ( )
1333
- . map_or ( rl:: Set1 :: Empty , |o| o[ i] ) ,
1334
- synthetic,
1310
+ // FIXME(const_generics): a few places in the compiler expect generic params
1311
+ // to be in the order lifetimes, then type params, then const params.
1312
+ //
1313
+ // To prevent internal errors in case const parameters are supplied before
1314
+ // type parameters we first add all type params, then all const params.
1315
+ params. extend ( ast_generics. params . iter ( ) . filter_map ( |param| {
1316
+ if let GenericParamKind :: Type { ref default, synthetic, .. } = param. kind {
1317
+ if !allow_defaults && default. is_some ( ) {
1318
+ if !tcx. features ( ) . default_type_parameter_fallback {
1319
+ tcx. struct_span_lint_hir (
1320
+ lint:: builtin:: INVALID_TYPE_PARAM_DEFAULT ,
1321
+ param. hir_id ,
1322
+ param. span ,
1323
+ |lint| {
1324
+ lint. build (
1325
+ "defaults for type parameters are only allowed in \
1326
+ `struct`, `enum`, `type`, or `trait` definitions.",
1327
+ )
1328
+ . emit ( ) ;
1329
+ } ,
1330
+ ) ;
1335
1331
}
1336
1332
}
1337
- GenericParamKind :: Const { .. } => ty:: GenericParamDefKind :: Const ,
1338
- _ => return None ,
1339
- } ;
1340
1333
1341
- let param_def = ty:: GenericParamDef {
1342
- index : type_start + i as u32 ,
1343
- name : param. name . ident ( ) . name ,
1344
- def_id : tcx. hir ( ) . local_def_id ( param. hir_id ) ,
1345
- pure_wrt_drop : param. pure_wrt_drop ,
1346
- kind,
1347
- } ;
1348
- i += 1 ;
1349
- Some ( param_def)
1334
+ let kind = ty:: GenericParamDefKind :: Type {
1335
+ has_default : default. is_some ( ) ,
1336
+ object_lifetime_default : object_lifetime_defaults
1337
+ . as_ref ( )
1338
+ . map_or ( rl:: Set1 :: Empty , |o| o[ i] ) ,
1339
+ synthetic,
1340
+ } ;
1341
+
1342
+ let param_def = ty:: GenericParamDef {
1343
+ index : type_start + i as u32 ,
1344
+ name : param. name . ident ( ) . name ,
1345
+ def_id : tcx. hir ( ) . local_def_id ( param. hir_id ) ,
1346
+ pure_wrt_drop : param. pure_wrt_drop ,
1347
+ kind,
1348
+ } ;
1349
+ i += 1 ;
1350
+ Some ( param_def)
1351
+ } else {
1352
+ None
1353
+ }
1354
+ } ) ) ;
1355
+
1356
+ params. extend ( ast_generics. params . iter ( ) . filter_map ( |param| {
1357
+ if let GenericParamKind :: Const { .. } = param. kind {
1358
+ let param_def = ty:: GenericParamDef {
1359
+ index : type_start + i as u32 ,
1360
+ name : param. name . ident ( ) . name ,
1361
+ def_id : tcx. hir ( ) . local_def_id ( param. hir_id ) ,
1362
+ pure_wrt_drop : param. pure_wrt_drop ,
1363
+ kind : ty:: GenericParamDefKind :: Const ,
1364
+ } ;
1365
+ i += 1 ;
1366
+ Some ( param_def)
1367
+ } else {
1368
+ None
1369
+ }
1350
1370
} ) ) ;
1351
1371
1352
1372
// provide junk type parameter defs - the only place that
0 commit comments