@@ -717,35 +717,46 @@ impl<'a> AstValidator<'a> {
717
717
718
718
/// Checks that generic parameters are in the correct order,
719
719
/// which is lifetimes, then types and then consts. (`<'a, T, const N: usize>`)
720
- fn validate_generic_param_order < ' a > (
720
+ fn validate_generic_param_order (
721
721
sess : & Session ,
722
722
handler : & rustc_errors:: Handler ,
723
- generics : impl Iterator < Item = ( ParamKindOrd , Option < & ' a [ GenericBound ] > , Span , Option < String > ) > ,
723
+ generics : & [ GenericParam ] ,
724
724
span : Span ,
725
725
) {
726
726
let mut max_param: Option < ParamKindOrd > = None ;
727
727
let mut out_of_order = FxHashMap :: default ( ) ;
728
728
let mut param_idents = vec ! [ ] ;
729
729
730
- for ( kind, bounds, span, ident) in generics {
730
+ for param in generics {
731
+ let ident = Some ( param. ident . to_string ( ) ) ;
732
+ let ( kind, bounds, span) = ( & param. kind , Some ( & * param. bounds ) , param. ident . span ) ;
733
+ let ( ord_kind, ident) = match & param. kind {
734
+ GenericParamKind :: Lifetime => ( ParamKindOrd :: Lifetime , ident) ,
735
+ GenericParamKind :: Type { default : _ } => ( ParamKindOrd :: Type , ident) ,
736
+ GenericParamKind :: Const { ref ty, kw_span : _ } => {
737
+ let ty = pprust:: ty_to_string ( ty) ;
738
+ let unordered = sess. features_untracked ( ) . const_generics ;
739
+ ( ParamKindOrd :: Const { unordered } , Some ( format ! ( "const {}: {}" , param. ident, ty) ) )
740
+ }
741
+ } ;
731
742
if let Some ( ident) = ident {
732
- param_idents. push ( ( kind, bounds, param_idents. len ( ) , ident) ) ;
743
+ param_idents. push ( ( kind, ord_kind , bounds, param_idents. len ( ) , ident) ) ;
733
744
}
734
745
let max_param = & mut max_param;
735
746
match max_param {
736
- Some ( max_param) if * max_param > kind => {
737
- let entry = out_of_order. entry ( kind ) . or_insert ( ( * max_param, vec ! [ ] ) ) ;
747
+ Some ( max_param) if * max_param > ord_kind => {
748
+ let entry = out_of_order. entry ( ord_kind ) . or_insert ( ( * max_param, vec ! [ ] ) ) ;
738
749
entry. 1 . push ( span) ;
739
750
}
740
- Some ( _) | None => * max_param = Some ( kind ) ,
751
+ Some ( _) | None => * max_param = Some ( ord_kind ) ,
741
752
} ;
742
753
}
743
754
744
755
let mut ordered_params = "<" . to_string ( ) ;
745
756
if !out_of_order. is_empty ( ) {
746
- param_idents. sort_by_key ( |& ( po, _, i, _) | ( po, i) ) ;
757
+ param_idents. sort_by_key ( |& ( _ , po, _, i, _) | ( po, i) ) ;
747
758
let mut first = true ;
748
- for ( _, bounds, _, ident) in param_idents {
759
+ for ( kind , _, bounds, _, ident) in param_idents {
749
760
if !first {
750
761
ordered_params += ", " ;
751
762
}
@@ -756,6 +767,16 @@ fn validate_generic_param_order<'a>(
756
767
ordered_params += & pprust:: bounds_to_string ( & bounds) ;
757
768
}
758
769
}
770
+ match kind {
771
+ GenericParamKind :: Type { default : Some ( default) } => {
772
+ ordered_params += " = " ;
773
+ ordered_params += & pprust:: ty_to_string ( default) ;
774
+ }
775
+ GenericParamKind :: Type { default : None } => ( ) ,
776
+ GenericParamKind :: Lifetime => ( ) ,
777
+ // FIXME(const_generics:defaults)
778
+ GenericParamKind :: Const { ty : _, kw_span : _ } => ( ) ,
779
+ }
759
780
first = false ;
760
781
}
761
782
}
@@ -1150,22 +1171,7 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
1150
1171
validate_generic_param_order (
1151
1172
self . session ,
1152
1173
self . err_handler ( ) ,
1153
- generics. params . iter ( ) . map ( |param| {
1154
- let ident = Some ( param. ident . to_string ( ) ) ;
1155
- let ( kind, ident) = match & param. kind {
1156
- GenericParamKind :: Lifetime => ( ParamKindOrd :: Lifetime , ident) ,
1157
- GenericParamKind :: Type { default : _ } => ( ParamKindOrd :: Type , ident) ,
1158
- GenericParamKind :: Const { ref ty, kw_span : _ } => {
1159
- let ty = pprust:: ty_to_string ( ty) ;
1160
- let unordered = self . session . features_untracked ( ) . const_generics ;
1161
- (
1162
- ParamKindOrd :: Const { unordered } ,
1163
- Some ( format ! ( "const {}: {}" , param. ident, ty) ) ,
1164
- )
1165
- }
1166
- } ;
1167
- ( kind, Some ( & * param. bounds ) , param. ident . span , ident)
1168
- } ) ,
1174
+ & generics. params ,
1169
1175
generics. span ,
1170
1176
) ;
1171
1177
0 commit comments