Hi!

Without this fix, we were letting in invalid error/warning attributes,
on function decls in addition to valid ones with STRING_CST argument also
attributes with various bogus arguments, and for e.g. VAR_DECLs which
shouldn't have any error/warning attributes those with STRING_CST arguments.

Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux, ok for
trunk?

2013-02-04  Jakub Jelinek  <ja...@redhat.com>

        PR middle-end/56167
        * c-common.c (handle_error_attribute): Fix condition.

        * gcc.dg/pr56167.c: New test.

--- gcc/c-family/c-common.c.jj  2013-01-30 19:01:11.000000000 +0100
+++ gcc/c-family/c-common.c     2013-02-01 08:46:07.741550116 +0100
@@ -6678,7 +6678,7 @@ handle_error_attribute (tree *node, tree
                        int ARG_UNUSED (flags), bool *no_add_attrs)
 {
   if (TREE_CODE (*node) == FUNCTION_DECL
-      || TREE_CODE (TREE_VALUE (args)) == STRING_CST)
+      && TREE_CODE (TREE_VALUE (args)) == STRING_CST)
     /* Do nothing else, just set the attribute.  We'll get at
        it later with lookup_attribute.  */
     ;
--- gcc/testsuite/gcc.dg/pr56167.c.jj   2013-02-01 08:50:11.268198682 +0100
+++ gcc/testsuite/gcc.dg/pr56167.c      2013-02-01 08:49:43.000000000 +0100
@@ -0,0 +1,15 @@
+/* PR middle-end/56167 */
+/* { dg-do compile } */
+
+extern void foo (void) __attribute__ ((error (0)));    /* { dg-warning 
"attribute ignored" } */
+extern void bar (void) __attribute__ ((warning (0)));  /* { dg-warning 
"attribute ignored" } */
+int var __attribute__ ((error ("foo")));               /* { dg-warning 
"attribute ignored" } */
+
+int
+main ()
+{
+  foo ();
+  bar ();
+  var++;
+  return 0;
+}

        Jakub

Reply via email to