Patchwork PR c++/54955 - Fail to parse alignas expr at the beginning of a declaration

login
register
mail settings
Submitter Dodji Seketeli
Date Oct. 27, 2012, 7:49 a.m.
Message ID <87fw50e4nj.fsf@redhat.com>
Download mbox | patch
Permalink /patch/194604/
State New
Headers show

Comments

Dodji Seketeli - Oct. 27, 2012, 7:49 a.m.
Jason Merrill <jason@redhat.com> writes:

> On 10/26/2012 01:37 PM, Dodji Seketeli wrote:
>>   cp_next_tokens_can_be_std_attribute_p (cp_parser *parser)
>>   {
>> -  return cp_nth_tokens_can_be_std_attribute_p (parser, 1);
>> +  cp_token *token = cp_lexer_peek_token (parser->lexer);
>> +
>> +  return (cxx_dialect >= cxx0x
>> +	  (token->type == CPP_KEYWORD && token->keyword == RID_ALIGNAS)
>> +	  || cp_nth_tokens_can_be_std_attribute_p (parser, 1));
>
> Shouldn't this change be in cp_nth_tokens... rather than here?

Like this? (tested like the previous patch)

gcc/cp

	PR c++/54955
	* parser.c (cp_nth_tokens_can_be_std_attribute_p): Recognize the
	'Alignas' keyword as the beginning of a c++11 attribute specifier.
	Update the comment of the function.
	(cp_next_tokens_can_be_gnu_attribute_p): Update the comment of the
	function.

gcc/testsuite/

	PR c++/54955
	* g++.dg/cpp0x/gen-attrs-48-2.C: New test.
---
 gcc/cp/parser.c                             | 11 ++++++-----
 gcc/testsuite/g++.dg/cpp0x/gen-attrs-48-2.C |  4 ++++
 2 files changed, 10 insertions(+), 5 deletions(-)
 create mode 100644 gcc/testsuite/g++.dg/cpp0x/gen-attrs-48-2.C
Jason Merrill - Oct. 30, 2012, 3:09 p.m.
OK.

Jason

Patch

diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index 9403563..f2642ab 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -20324,7 +20324,7 @@  cp_next_tokens_can_be_gnu_attribute_p (cp_parser *parser)
 }
 
 /* Return TRUE iff the next tokens in the stream are possibly the
-   beginning of a standard C++-11 attribute.  */
+   beginning of a standard C++-11 attribute specifier.  */
 
 static bool
 cp_next_tokens_can_be_std_attribute_p (cp_parser *parser)
@@ -20333,7 +20333,7 @@  cp_next_tokens_can_be_std_attribute_p (cp_parser *parser)
 }
 
 /* Return TRUE iff the next Nth tokens in the stream are possibly the
-   beginning of a standard C++-11 attribute.  */
+   beginning of a standard C++-11 attribute specifier.  */
 
 static bool
 cp_nth_tokens_can_be_std_attribute_p (cp_parser *parser, size_t n)
@@ -20341,9 +20341,10 @@  cp_nth_tokens_can_be_std_attribute_p (cp_parser *parser, size_t n)
   cp_token *token = cp_lexer_peek_nth_token (parser->lexer, n);
 
   return (cxx_dialect >= cxx0x
-	  && token->type == CPP_OPEN_SQUARE
-	  && (token = cp_lexer_peek_nth_token (parser->lexer, n + 1))
-	  && token->type == CPP_OPEN_SQUARE);
+	  && ((token->type == CPP_KEYWORD && token->keyword == RID_ALIGNAS)
+	      || (token->type == CPP_OPEN_SQUARE
+		  && (token = cp_lexer_peek_nth_token (parser->lexer, n + 1))
+		  && token->type == CPP_OPEN_SQUARE)));
 }
 
 /* Return TRUE iff the next Nth tokens in the stream are possibly the
diff --git a/gcc/testsuite/g++.dg/cpp0x/gen-attrs-48-2.C b/gcc/testsuite/g++.dg/cpp0x/gen-attrs-48-2.C
new file mode 100644
index 0000000..3cc5897
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/gen-attrs-48-2.C
@@ -0,0 +1,4 @@ 
+// Origin: PR c++/54955
+// { dg-do compile { target c++11 } }
+
+alignas(double) int f;