From patchwork Sat Oct 27 07:49:04 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: PR c++/54955 - Fail to parse alignas expr at the beginning of a declaration From: Dodji Seketeli X-Patchwork-Id: 194604 Message-Id: <87fw50e4nj.fsf@redhat.com> To: Jason Merrill Cc: GCC Patches Date: Sat, 27 Oct 2012 09:49:04 +0200 Jason Merrill 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 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;