OSDN Git Service

* c-decl.c (grokdeclarator): Allow for function definition where
authorjsm28 <jsm28@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 16 Aug 2004 20:35:21 +0000 (20:35 +0000)
committerjsm28 <jsm28@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 16 Aug 2004 20:35:21 +0000 (20:35 +0000)
innermost declarator has attributes.

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

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@86075 138bc75d-0d04-0410-961f-82ee72b054a4

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

index 85d5500..9911777 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 c7ba8d2..e867ebb 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 b7d51b1..80561d3 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;
+}