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