@@ -760,7 +760,7 @@ impl CheckAttrVisitor<'tcx> {
760760 target : Target ,
761761 item : Option < ItemLike < ' _ > > ,
762762 ) -> bool {
763- let is_function = matches ! ( target, Target :: Fn | Target :: Method ( ..) | Target :: ForeignFn ) ;
763+ let is_function = matches ! ( target, Target :: Fn | Target :: Method ( ..) ) ;
764764 if !is_function {
765765 self . tcx
766766 . sess
@@ -776,55 +776,64 @@ impl CheckAttrVisitor<'tcx> {
776776 Some ( it) => it,
777777 } ;
778778
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 ;
779818 let mut invalid_args = vec ! [ ] ;
780819 for meta in list {
781820 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 ;
828837 }
829838 } else {
830839 invalid_args. push ( meta. span ( ) ) ;
0 commit comments