@@ -760,7 +760,7 @@ impl CheckAttrVisitor<'tcx> {
760
760
target : Target ,
761
761
item : Option < ItemLike < ' _ > > ,
762
762
) -> bool {
763
- let is_function = matches ! ( target, Target :: Fn | Target :: Method ( ..) | Target :: ForeignFn ) ;
763
+ let is_function = matches ! ( target, Target :: Fn | Target :: Method ( ..) ) ;
764
764
if !is_function {
765
765
self . tcx
766
766
. sess
@@ -776,55 +776,64 @@ impl CheckAttrVisitor<'tcx> {
776
776
Some ( it) => it,
777
777
} ;
778
778
779
+ let ( decl, generics) = match item {
780
+ Some ( ItemLike :: Item ( Item {
781
+ kind : ItemKind :: Fn ( FnSig { decl, .. } , generics, _) ,
782
+ ..
783
+ } ) ) => ( decl, generics) ,
784
+ _ => bug ! ( "should be a function item" ) ,
785
+ } ;
786
+
787
+ for param in generics. params {
788
+ match param. kind {
789
+ hir:: GenericParamKind :: Const { .. } => { }
790
+ _ => {
791
+ self . tcx
792
+ . sess
793
+ . struct_span_err (
794
+ attr. span ,
795
+ "#[rustc_legacy_const_generics] functions must \
796
+ only have const generics",
797
+ )
798
+ . span_label ( param. span , "non-const generic parameter" )
799
+ . emit ( ) ;
800
+ return false ;
801
+ }
802
+ }
803
+ }
804
+
805
+ if list. len ( ) != generics. params . len ( ) {
806
+ self . tcx
807
+ . sess
808
+ . struct_span_err (
809
+ attr. span ,
810
+ "#[rustc_legacy_const_generics] must have one index for each generic parameter" ,
811
+ )
812
+ . span_label ( generics. span , "generic parameters" )
813
+ . emit ( ) ;
814
+ return false ;
815
+ }
816
+
817
+ let arg_count = decl. inputs . len ( ) as u128 + generics. params . len ( ) as u128 ;
779
818
let mut invalid_args = vec ! [ ] ;
780
819
for meta in list {
781
820
if let Some ( LitKind :: Int ( val, _) ) = meta. literal ( ) . map ( |lit| & lit. kind ) {
782
- if let Some ( ItemLike :: Item ( Item {
783
- kind : ItemKind :: Fn ( FnSig { decl, .. } , generics, _) ,
784
- ..
785
- } ) )
786
- | Some ( ItemLike :: ForeignItem ( ForeignItem {
787
- kind : ForeignItemKind :: Fn ( decl, _, generics) ,
788
- ..
789
- } ) ) = item
790
- {
791
- let arg_count = decl. inputs . len ( ) as u128 + generics. params . len ( ) as u128 ;
792
- for param in generics. params {
793
- match param. kind {
794
- hir:: GenericParamKind :: Const { .. } => { }
795
- _ => {
796
- self . tcx
797
- . sess
798
- . struct_span_err (
799
- meta. span ( ) ,
800
- "#[rustc_legacy_const_generics] functions must \
801
- only have const generics",
802
- )
803
- . span_label ( param. span , "non-const generic parameter" )
804
- . emit ( ) ;
805
- break ;
806
- }
807
- }
808
- }
809
- if * val >= arg_count {
810
- let span = meta. span ( ) ;
811
- self . tcx
812
- . sess
813
- . struct_span_err ( span, "index exceeds number of arguments" )
814
- . span_label (
815
- span,
816
- format ! (
817
- "there {} only {} argument{}" ,
818
- if arg_count != 1 { "are" } else { "is" } ,
819
- arg_count,
820
- pluralize!( arg_count)
821
- ) ,
822
- )
823
- . emit ( ) ;
824
- return false ;
825
- }
826
- } else {
827
- bug ! ( "should be a function item" ) ;
821
+ if * val >= arg_count {
822
+ let span = meta. span ( ) ;
823
+ self . tcx
824
+ . sess
825
+ . struct_span_err ( span, "index exceeds number of arguments" )
826
+ . span_label (
827
+ span,
828
+ format ! (
829
+ "there {} only {} argument{}" ,
830
+ if arg_count != 1 { "are" } else { "is" } ,
831
+ arg_count,
832
+ pluralize!( arg_count)
833
+ ) ,
834
+ )
835
+ . emit ( ) ;
836
+ return false ;
828
837
}
829
838
} else {
830
839
invalid_args. push ( meta. span ( ) ) ;
0 commit comments