diff mbox

[C] Improve error on attrs after declarator in a fndef (PR c/60915)

Message ID 20140424143106.GK2103@redhat.com
State New
Headers show

Commit Message

Marek Polacek April 24, 2014, 2:31 p.m. UTC
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  <polacek@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.


	Marek

Comments

Marc Glisse April 24, 2014, 6:25 p.m. UTC | #1
On Thu, 24 Apr 2014, Marek Polacek wrote:

> 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.

I thought you had an earlier version of the patch where, instead of 
"forbidden", you said "move the attribute" so users would know that 
writing the attribute *before* was fine? That sounded much better to me.
Jeff Law April 30, 2014, 9:21 p.m. UTC | #2
On 04/24/14 08:31, Marek Polacek wrote:
> 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  <polacek@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.
No strong opinions on which of the two is better.  Slight preference to 
sync with g++.  You choose.  Either is OK for the trunk.
jeff
diff mbox

Patch

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")))
+{
+}