@@ -361,17 +361,24 @@ enum GenericPosition {
361
361
362
362
fn validate_generics_order < ' a > (
363
363
handler : & errors:: Handler ,
364
- generics : impl Iterator < Item = ( ParamKindOrd , Span , Option < String > ) > ,
364
+ generics : impl Iterator <
365
+ Item = (
366
+ ParamKindOrd ,
367
+ Option < & ' a [ GenericBound ] > ,
368
+ Span ,
369
+ Option < String >
370
+ ) ,
371
+ > ,
365
372
pos : GenericPosition ,
366
373
span : Span ,
367
374
) {
368
375
let mut max_param: Option < ParamKindOrd > = None ;
369
376
let mut out_of_order = FxHashMap :: default ( ) ;
370
377
let mut param_idents = vec ! [ ] ;
371
378
372
- for ( kind, span, ident) in generics {
379
+ for ( kind, bounds , span, ident) in generics {
373
380
if let Some ( ident) = ident {
374
- param_idents. push ( ( kind, param_idents. len ( ) , ident) ) ;
381
+ param_idents. push ( ( kind, bounds , param_idents. len ( ) , ident) ) ;
375
382
}
376
383
let max_param = & mut max_param;
377
384
match max_param {
@@ -385,13 +392,19 @@ fn validate_generics_order<'a>(
385
392
386
393
let mut ordered_params = "<" . to_string ( ) ;
387
394
if !out_of_order. is_empty ( ) {
388
- param_idents. sort_by_key ( |& ( po, i, _) | ( po, i) ) ;
395
+ param_idents. sort_by_key ( |& ( po, _ , i, _) | ( po, i) ) ;
389
396
let mut first = true ;
390
- for ( _, _, ident) in param_idents {
397
+ for ( _, bounds , _, ident) in param_idents {
391
398
if !first {
392
399
ordered_params += ", " ;
393
400
}
394
401
ordered_params += & ident;
402
+ if let Some ( bounds) = bounds {
403
+ if !bounds. is_empty ( ) {
404
+ ordered_params += ": " ;
405
+ ordered_params += & pprust:: bounds_to_string ( & bounds) ;
406
+ }
407
+ }
395
408
first = false ;
396
409
}
397
410
}
@@ -701,7 +714,7 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
701
714
GenericArg :: Lifetime ( ..) => ParamKindOrd :: Lifetime ,
702
715
GenericArg :: Type ( ..) => ParamKindOrd :: Type ,
703
716
GenericArg :: Const ( ..) => ParamKindOrd :: Const ,
704
- } , arg. span ( ) , None )
717
+ } , None , arg. span ( ) , None )
705
718
} ) , GenericPosition :: Arg , generic_args. span ( ) ) ;
706
719
707
720
// Type bindings such as `Item=impl Debug` in `Iterator<Item=Debug>`
@@ -736,16 +749,16 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
736
749
}
737
750
738
751
validate_generics_order ( self . err_handler ( ) , generics. params . iter ( ) . map ( |param| {
739
- let span = param. ident . span ;
740
752
let ident = Some ( param. ident . to_string ( ) ) ;
741
- match & param. kind {
742
- GenericParamKind :: Lifetime { .. } => ( ParamKindOrd :: Lifetime , span , ident) ,
743
- GenericParamKind :: Type { .. } => ( ParamKindOrd :: Type , span , ident) ,
753
+ let ( kind , ident ) = match & param. kind {
754
+ GenericParamKind :: Lifetime { .. } => ( ParamKindOrd :: Lifetime , ident) ,
755
+ GenericParamKind :: Type { .. } => ( ParamKindOrd :: Type , ident) ,
744
756
GenericParamKind :: Const { ref ty } => {
745
757
let ty = pprust:: ty_to_string ( ty) ;
746
- ( ParamKindOrd :: Const , span , Some ( format ! ( "const {}: {}" , param. ident, ty) ) )
758
+ ( ParamKindOrd :: Const , Some ( format ! ( "const {}: {}" , param. ident, ty) ) )
747
759
}
748
- }
760
+ } ;
761
+ ( kind, Some ( & * param. bounds ) , param. ident . span , ident)
749
762
} ) , GenericPosition :: Param , generics. span ) ;
750
763
751
764
for predicate in & generics. where_clause . predicates {
0 commit comments