re PR c/12738 (Missing function with 'static' block-scope declaration; unit-at-a...
authorGeoffrey Keating <geoffk@apple.com>
Mon, 30 Aug 2004 22:19:24 +0000 (22:19 +0000)
committerGeoffrey Keating <geoffk@gcc.gnu.org>
Mon, 30 Aug 2004 22:19:24 +0000 (22:19 +0000)
2004-08-30  Geoffrey Keating  <geoffk@apple.com>

PR 12738
PR 17205
Radar 3460526
Radar 3775729
* c-decl.c (grokdeclarator): Produce error for 'static' on local
function declaration.

Index: testsuite/ChangeLog
2004-08-30  Geoffrey Keating  <geoffk@apple.com>

* gcc.dg/funcdef-storage-1.c: New.
* gcc.c-torture/compile/920625-2.c: Don't use 'static' to declare
an extern function in local scope.
* gcc.c-torture/execute/20010605-1.c: Don't use 'static inline' to
declare an 'auto inline' function in local scope.
* gcc.dg/20011130-1.c: Likewise.
* gcc.c-torture/execute/nest-stdar-1.c: Don't use 'static' to declare
an 'auto' function in local scope.
* gcc.dg/20021014-1.c: Likewise.
* gcc.dg/20030331-2.c: Likewise.

From-SVN: r86807

gcc/ChangeLog
gcc/c-decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/compile/920625-2.c
gcc/testsuite/gcc.c-torture/execute/20010605-1.c
gcc/testsuite/gcc.c-torture/execute/nest-stdar-1.c
gcc/testsuite/gcc.dg/20011130-1.c
gcc/testsuite/gcc.dg/20021014-1.c
gcc/testsuite/gcc.dg/20030331-2.c
gcc/testsuite/gcc.dg/funcdef-storage-1.c [new file with mode: 0644]

index 00e61c6c32aaec3b6d21d880c88dbb76c11096d6..5ec3a32fc723e2c490241c822461626381ad7e91 100644 (file)
@@ -1,3 +1,12 @@
+2004-08-30  Geoffrey Keating  <geoffk@apple.com>
+
+       PR 12738
+       PR 17205
+       Radar 3460526
+       Radar 3775729
+       * c-decl.c (grokdeclarator): Produce error for 'static' on local
+       function declaration.
+
 2004-08-30  Richard Henderson  <rth@redhat.com>
 
        * expr.c (array_ref_element_size): Force aligned_size back to
index 7ef352e35412208c0537db8ea3dd5b154ff38172..b2f7bbe42d24e046f25855bebe89ccfce73ad7dd 100644 (file)
@@ -4664,26 +4664,29 @@ grokdeclarator (tree declarator, tree declspecs,
       }
     else if (TREE_CODE (type) == FUNCTION_TYPE)
       {
-       if (specbits & (1 << (int) RID_AUTO)
-           && (pedantic || current_scope == file_scope))
-         pedwarn ("invalid storage class for function `%s'", name);
-       if (specbits & (1 << (int) RID_REGISTER))
-         error ("invalid storage class for function `%s'", name);
-       if (specbits & (1 << (int) RID_THREAD))
+       if (specbits & (1 << (int) RID_REGISTER)
+           || specbits & (1 << (int) RID_THREAD))
          error ("invalid storage class for function `%s'", name);
-       /* Function declaration not at file scope.
-          Storage classes other than `extern' are not allowed
-          and `extern' makes no difference.  */
-       if (current_scope != file_scope
-           && (specbits & ((1 << (int) RID_STATIC) | (1 << (int) RID_INLINE)))
-           && pedantic)
-         pedwarn ("invalid storage class for function `%s'", name);
+       else if (current_scope != file_scope)
+         {
+           /* Function declaration not at file scope.  Storage
+              classes other than `extern' are not allowed, C99
+              6.7.1p5, and `extern' makes no difference.  However,
+              GCC allows 'auto', perhaps with 'inline', to support
+              nested functions.  */
+           if (specbits & (1 << (int) RID_AUTO))
+             {
+               if (pedantic)
+                 pedwarn ("invalid storage class for function `%s'", name);
+             }
+           if (specbits & (1 << (int) RID_STATIC))
+             error ("invalid storage class for function `%s'", name);
+         }
 
        decl = build_decl (FUNCTION_DECL, declarator, type);
        decl = build_decl_attribute_variant (decl, decl_attr);
 
-       DECL_LANG_SPECIFIC (decl)
-         = GGC_CNEW (struct lang_decl);
+       DECL_LANG_SPECIFIC (decl) = GGC_CNEW (struct lang_decl);
 
        if (pedantic && type_quals && ! DECL_IN_SYSTEM_HEADER (decl))
          pedwarn ("ISO C forbids qualified function types");
index 7f2e91dd3749b7a3519c1a8c2e84e3293d59cbbe..f3dde948c8330f12dbd975e6bb1ed88c58062cc6 100644 (file)
@@ -1,3 +1,16 @@
+2004-08-30  Geoffrey Keating  <geoffk@apple.com>
+
+       * gcc.dg/funcdef-storage-1.c: New.
+       * gcc.c-torture/compile/920625-2.c: Don't use 'static' to declare
+       an extern function in local scope.
+       * gcc.c-torture/execute/20010605-1.c: Don't use 'static inline' to
+       declare an 'auto inline' function in local scope.
+       * gcc.dg/20011130-1.c: Likewise.
+       * gcc.c-torture/execute/nest-stdar-1.c: Don't use 'static' to declare
+       an 'auto' function in local scope.
+       * gcc.dg/20021014-1.c: Likewise.
+       * gcc.dg/20030331-2.c: Likewise.
+
 2004-08-30  Tobias Schlueter  <tobias.schlueter@physik.uni-muenchen.de>
 
        * gfortran.dg/blockdata_1.f90: New test.
index 1466285f88e3d9f400248e969f4a48f94a4f423a..291e80d02101746d3ba5658d569d96549f957fc0 100644 (file)
@@ -23,7 +23,7 @@ trashQueryResult(Widget w, Boolean delete, caddr_t call_data)
 
   extern Cursor busy, left_ptr;
   extern String cwd;
-       static void freeReturnStruct(void);
+       extern void freeReturnStruct(void);
   String rmstring;
   int status;
   XedwListReturnStruct *tmp;
@@ -58,7 +58,7 @@ copyQueryResult(Widget w, Boolean copy, caddr_t call_data)
   extern void destroy_button_dialog();
   extern void changestate(Boolean);
   extern Cursor busy, left_ptr;
-  static void freeReturnStruct(void);
+  extern void freeReturnStruct(void);
   int execute(String, String, String, Boolean);
   extern String cwd;
   String copystring;
index 4bf230ba54ac27cc6e24f61ab6fb734b2ba58e24..c777af5bdc4ef17c563351bee21a44fb3bc38f77 100644 (file)
@@ -2,7 +2,7 @@ int main ()
 {
   int v = 42;
 
-  static inline int fff (int x)
+  inline int fff (int x)
     {
       return x*10;
     }
index 2c6108b52e60abcf7ea35ca9b360aeee36db6ee6..492670b5a1e729c5a2d32f98049ff6708120fc2a 100644 (file)
@@ -2,7 +2,7 @@
 
 main ()
 {
-  static double f (int x, ...)
+  double f (int x, ...)
     {
       va_list args;
       double a;
index 393f82a91fbdf10694fbef9dd4357c94cf5e3610..60a2738fc653c13bb94d6ee4966edaa5264d06f6 100644 (file)
@@ -9,7 +9,7 @@
 
 static int __attribute__((unused)) foo (int x)
 {
-  static inline int bar (int x)
+  inline int bar (int x)
     {
       int y;
       y = x;
index 67f88ae2f6b7d727e30b549cb26dbe193747fcf9..dd8614c9f093da1cb7d033d5462688146ef9965e 100644 (file)
@@ -10,7 +10,7 @@ extern void exit (int);
 
 int foo (void)
 {
-  static int bar (int x)
+  int bar (int x)
   {
     return x + 3;
   }
index 0509d8aad879f7399bc3fac55dbb6407bbd1d020..2fce78ea97c10bb94369fb3c7ae8fc7933f9643d 100644 (file)
@@ -6,7 +6,7 @@ int foo() {
   int yd;
   float in[1][yd];
  
-  static void bar() {
+  void bar() {
     printf("%p\n",in[0]);
   }
 }
diff --git a/gcc/testsuite/gcc.dg/funcdef-storage-1.c b/gcc/testsuite/gcc.dg/funcdef-storage-1.c
new file mode 100644 (file)
index 0000000..955dac2
--- /dev/null
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+
+void
+flarm(void)
+{
+  static void foo();  /* { dg-error "invalid storage class" } */
+
+  foo();
+}
+
+static void
+foo(void)
+{
+}