c-decl.c (grokdeclarator): Allow for function definition where innermost declarator...
authorJoseph Myers <jsm@polyomino.org.uk>
Mon, 16 Aug 2004 20:35:21 +0000 (21:35 +0100)
committerJoseph Myers <jsm28@gcc.gnu.org>
Mon, 16 Aug 2004 20:35:21 +0000 (21:35 +0100)
* c-decl.c (grokdeclarator): Allow for function definition where
innermost declarator has attributes.

testsuite:
* gcc.dg/funcdef-attr-1.c: New test.

From-SVN: r86075

gcc/ChangeLog
gcc/c-decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/funcdef-attr-1.c [new file with mode: 0644]

index 85d5500d36bd0e12d59dde162ee3402b6cbe3085..991177702ab68324b15e8711f94b8a2d7389f283 100644 (file)
@@ -1,3 +1,8 @@
+2004-08-16  Joseph S. Myers  <jsm@polyomino.org.uk>
+
+       * c-decl.c (grokdeclarator): Allow for function definition where
+       innermost declarator has attributes.
+
 2004-08-16  Fariborz Jahanian <fjahanian@apple.com>
 
        * except.c (get_exception_filter, build_post_landing_pads,
index c7ba8d20268e9830b9f78a116d75ec3c979388d1..e867ebb6c7227b92237f8c0e2701385d3b606c5c 100644 (file)
@@ -4176,12 +4176,17 @@ grokdeclarator (tree declarator, tree declspecs,
        }
       else if (TREE_CODE (declarator) == CALL_EXPR)
        {
-         /* Say it's a definition only for the CALL_EXPR closest to
-            the identifier.  */
-         bool really_funcdef = (funcdef_flag
-                                && (TREE_CODE (TREE_OPERAND (declarator, 0))
-                                    == IDENTIFIER_NODE));
+         /* Say it's a definition only for the declarator closest to
+            the identifier, apart possibly from some attributes.  */
+         bool really_funcdef = false;
          tree arg_types;
+         if (funcdef_flag)
+           {
+             tree t = TREE_OPERAND (declarator, 0);
+             while (TREE_CODE (t) == TREE_LIST)
+               t = TREE_VALUE (t);
+             really_funcdef = (TREE_CODE (t) == IDENTIFIER_NODE);
+           }
 
          /* Declaring a function type.
             Make sure we have a valid type for the function to return.  */
index b7d51b16f37da363fc70a6512ba588a5b9deaf09..80561d3ad0d9c7d12c867a5ee53c2cd1381403d8 100644 (file)
@@ -1,3 +1,7 @@
+2004-08-16  Joseph S. Myers  <jsm@polyomino.org.uk>
+
+       * gcc.dg/funcdef-attr-1.c: New test.
+
 2004-08-16  Janis Johnson  <janis187@us.ibm.com>
 
        * gcc.dg/altivec-17.c: New test.
diff --git a/gcc/testsuite/gcc.dg/funcdef-attr-1.c b/gcc/testsuite/gcc.dg/funcdef-attr-1.c
new file mode 100644 (file)
index 0000000..17249a0
--- /dev/null
@@ -0,0 +1,14 @@
+/* The declarator in a function definition should be able to take the
+   form of an attributed function declarator, not just a plain
+   function declarator.  This was formerly allowed by some of the code
+   but then the wrong constraint checks were made because other code
+   didn't recognise the declarator as being that of the function
+   definition.  */
+/* Origin: Joseph Myers <jsm@polyomino.org.uk>.  */
+
+int (__attribute__((const)) x) (a, b)
+     int a;
+     int b;
+{
+  return a + b;
+}