stop sorting generic params
This commit is contained in:
parent
fcac11993c
commit
8a2e4262e8
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
}
|
||||
}));
|
||||
|
||||
|
|
Loading…
Reference in New Issue