@@ -13,7 +13,7 @@ use rustc_ast::visit::{self, AssocCtxt, FnCtxt, FnKind, Visitor};
13
13
use rustc_ast:: walk_list;
14
14
use rustc_ast_pretty:: pprust;
15
15
use rustc_data_structures:: fx:: FxHashMap ;
16
- use rustc_errors:: { error_code, pluralize , struct_span_err, Applicability } ;
16
+ use rustc_errors:: { error_code, struct_span_err, Applicability } ;
17
17
use rustc_parse:: validate_attr;
18
18
use rustc_session:: lint:: builtin:: PATTERNS_IN_FNS_WITHOUT_BODY ;
19
19
use rustc_session:: lint:: LintBuffer ;
@@ -882,64 +882,43 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
882
882
if is_auto == IsAuto :: Yes {
883
883
// Auto traits cannot have generics, super traits nor contain items.
884
884
if !generics. params . is_empty ( ) {
885
- let spans: Vec < _ > = generics. params . iter ( ) . map ( |i| i. ident . span ) . collect ( ) ;
886
- let last = spans. iter ( ) . last ( ) . map ( |s| * s) ;
887
- let len = spans. len ( ) ;
888
885
let mut err = struct_span_err ! (
889
886
self . session,
890
- spans ,
887
+ generics . span ,
891
888
E0567 ,
892
889
"auto traits cannot have generic parameters"
893
890
) ;
894
- if let Some ( span) = last {
895
- err. span_label (
896
- span,
897
- & format ! (
898
- "cannot have {these} generic parameter{s}" ,
899
- these = if len == 1 { "this" } else { "these" } ,
900
- s = pluralize!( len)
901
- ) ,
902
- ) ;
903
- }
904
891
err. span_label (
905
892
item. ident . span ,
906
893
"auto trait cannot have generic parameters" ,
907
894
) ;
908
- err. span_suggestion_verbose (
895
+ err. span_suggestion (
909
896
generics. span ,
910
- "remove the parameters for the auto trait to be valid " ,
897
+ "remove the parameters" ,
911
898
String :: new ( ) ,
912
899
Applicability :: MachineApplicable ,
913
900
) ;
914
901
err. emit ( ) ;
915
902
}
916
903
if !bounds. is_empty ( ) {
917
- let spans: Vec < _ > = bounds. iter ( ) . map ( |b| b. span ( ) ) . collect ( ) ;
918
- let last = spans. iter ( ) . last ( ) . map ( |s| * s) ;
919
- let len = spans. len ( ) ;
904
+ let span = match & bounds[ ..] {
905
+ [ ] => unreachable ! ( ) ,
906
+ [ single] => single. span ( ) ,
907
+ [ first, .., last] => first. span ( ) . to ( last. span ( ) ) ,
908
+ } ;
920
909
let mut err = struct_span_err ! (
921
910
self . session,
922
- spans ,
911
+ span ,
923
912
E0568 ,
924
913
"auto traits cannot have super traits"
925
914
) ;
926
915
err. span_label ( item. ident . span , "auto trait cannot have super traits" ) ;
927
- if let Some ( span) = last {
928
- err. span_label (
929
- span,
930
- & format ! (
931
- "cannot have {these} super trait{s}" ,
932
- these = if len == 1 { "this" } else { "these" } ,
933
- s = pluralize!( len)
934
- ) ,
935
- ) ;
936
- err. span_suggestion_verbose (
937
- generics. span . shrink_to_hi ( ) . to ( span) ,
938
- "remove the super traits for the auto trait to be valid" ,
939
- String :: new ( ) ,
940
- Applicability :: MachineApplicable ,
941
- ) ;
942
- }
916
+ err. span_suggestion (
917
+ span,
918
+ "remove the super traits" ,
919
+ String :: new ( ) ,
920
+ Applicability :: MachineApplicable ,
921
+ ) ;
943
922
err. emit ( ) ;
944
923
}
945
924
if !trait_items. is_empty ( ) {
0 commit comments