From 8a2e4262e88bede44cfc5a3ab54e5b88442d6ed2 Mon Sep 17 00:00:00 2001 From: Bastian Kauschke Date: Thu, 23 Jul 2020 10:15:02 +0200 Subject: [PATCH] stop sorting generic params --- src/librustc_ast_lowering/lib.rs | 15 +-------------- src/librustc_typeck/collect.rs | 21 +++++---------------- 2 files changed, 6 insertions(+), 30 deletions(-) diff --git a/src/librustc_ast_lowering/lib.rs b/src/librustc_ast_lowering/lib.rs index b5d3beb4f8a..b631686324b 100644 --- a/src/librustc_ast_lowering/lib.rs +++ b/src/librustc_ast_lowering/lib.rs @@ -936,20 +936,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> { }) }); - let mut lowered_params: Vec<_> = - lowered_generics.params.into_iter().chain(in_band_defs).collect(); - - // FIXME(const_generics): the compiler doesn't always cope with - // unsorted generic parameters at the moment, so we make sure - // that they're ordered correctly here for now. (When we chain - // the `in_band_defs`, we might make the order unsorted.) - lowered_params.sort_by_key(|param| match param.kind { - hir::GenericParamKind::Lifetime { .. } => ParamKindOrd::Lifetime, - hir::GenericParamKind::Type { .. } => ParamKindOrd::Type, - hir::GenericParamKind::Const { .. } => ParamKindOrd::Const, - }); - - lowered_generics.params = lowered_params.into(); + lowered_generics.params = lowered_generics.params.into_iter().chain(in_band_defs).collect(); let lowered_generics = lowered_generics.into_generics(self.arena); (lowered_generics, res) diff --git a/src/librustc_typeck/collect.rs b/src/librustc_typeck/collect.rs index cb9348a9521..5953863cb3c 100644 --- a/src/librustc_typeck/collect.rs +++ b/src/librustc_typeck/collect.rs @@ -1362,13 +1362,9 @@ fn generics_of(tcx: TyCtxt<'_>, def_id: DefId) -> ty::Generics { let type_start = own_start - has_self as u32 + params.len() as u32; let mut i = 0; - // FIXME(const_generics): a few places in the compiler expect generic params - // to be in the order lifetimes, then type params, then const params. - // - // To prevent internal errors in case const parameters are supplied before - // type parameters we first add all type params, then all const params. - params.extend(ast_generics.params.iter().filter_map(|param| { - if let GenericParamKind::Type { ref default, synthetic, .. } = param.kind { + params.extend(ast_generics.params.iter().filter_map(|param| match param.kind { + GenericParamKind::Lifetime { .. } => None, + GenericParamKind::Type { ref default, synthetic, .. } => { if !allow_defaults && default.is_some() { if !tcx.features().default_type_parameter_fallback { tcx.struct_span_lint_hir( @@ -1378,7 +1374,7 @@ fn generics_of(tcx: TyCtxt<'_>, def_id: DefId) -> ty::Generics { |lint| { lint.build( "defaults for type parameters are only allowed in \ - `struct`, `enum`, `type`, or `trait` definitions.", + `struct`, `enum`, `type`, or `trait` definitions.", ) .emit(); }, @@ -1403,13 +1399,8 @@ fn generics_of(tcx: TyCtxt<'_>, def_id: DefId) -> ty::Generics { }; i += 1; Some(param_def) - } else { - None } - })); - - params.extend(ast_generics.params.iter().filter_map(|param| { - if let GenericParamKind::Const { .. } = param.kind { + GenericParamKind::Const { .. } => { let param_def = ty::GenericParamDef { index: type_start + i as u32, name: param.name.ident().name, @@ -1419,8 +1410,6 @@ fn generics_of(tcx: TyCtxt<'_>, def_id: DefId) -> ty::Generics { }; i += 1; Some(param_def) - } else { - None } }));