This PR is about not very clear error message when one tries to add attributes *after* the declarator in a function definition. cc1plus already handles this well, so I used the same message.
Regtested/bootstrapped on x86_64-linux, ok for trunk? 2014-04-24 Marek Polacek <pola...@redhat.com> PR c/60915 * c-parser.c (c_parser_declaration_or_fndef): Give better error if function-definition has an attribute after the declarator. * gcc.dg/pr60915.c: New test. diff --git gcc/c/c-parser.c gcc/c/c-parser.c index 0deab84..a76a7cc 100644 --- gcc/c/c-parser.c +++ gcc/c/c-parser.c @@ -1688,7 +1688,19 @@ c_parser_declaration_or_fndef (c_parser *parser, bool fndef_ok, if (c_parser_next_token_is_keyword (parser, RID_ASM)) asm_name = c_parser_simple_asm_expr (parser); if (c_parser_next_token_is_keyword (parser, RID_ATTRIBUTE)) - postfix_attrs = c_parser_attributes (parser); + { + postfix_attrs = c_parser_attributes (parser); + if (c_parser_next_token_is (parser, CPP_OPEN_BRACE)) + { + /* This means there is an attribute specifier after + the declarator in a function definition. Provide + some more information for the user. */ + error_at (here, "attributes are not allowed on a " + "function-definition"); + c_parser_skip_to_end_of_block_or_statement (parser); + return; + } + } if (c_parser_next_token_is (parser, CPP_EQ)) { tree d; diff --git gcc/testsuite/gcc.dg/pr60915.c gcc/testsuite/gcc.dg/pr60915.c index e69de29..73a6717 100644 --- gcc/testsuite/gcc.dg/pr60915.c +++ gcc/testsuite/gcc.dg/pr60915.c @@ -0,0 +1,7 @@ +/* PR c/60915 */ +/* { dg-do compile } */ + +void /* { dg-error "attributes are not allowed on a function-definition" } */ +foo (void) __attribute__((__visibility__("default"))) +{ +} Marek