Hi, On 12/01/2018 19:13, Jason Merrill wrote:
Hmm, I think dropping the attributes is reasonable for grokdeclarator to do as error-recovery, similarly to how it discards an ill-formed exception-specification. But let's assert seen_error() in that case.
Agreed. The below passes testing.
Thanks! Paolo. ///////////////////////
Index: cp/decl.c =================================================================== --- cp/decl.c (revision 256592) +++ cp/decl.c (working copy) @@ -11487,9 +11487,15 @@ grokdeclarator (const cp_declarator *declarator, && declarator->kind == cdk_id && declarator->std_attributes && attrlist != NULL) - /* [dcl.meaning]/1: The optional attribute-specifier-seq following - a declarator-id appertains to the entity that is declared. */ - *attrlist = chainon (*attrlist, declarator->std_attributes); + { + /* [dcl.meaning]/1: The optional attribute-specifier-seq following + a declarator-id appertains to the entity that is declared. */ + if (declarator->std_attributes != error_mark_node) + *attrlist = chainon (*attrlist, declarator->std_attributes); + else + /* We should have already diagnosed the issue (c++/78344). */ + gcc_assert (seen_error ()); + } /* Handle parameter packs. */ if (parameter_pack_p) Index: testsuite/g++.dg/cpp0x/alignas13.C =================================================================== --- testsuite/g++.dg/cpp0x/alignas13.C (nonexistent) +++ testsuite/g++.dg/cpp0x/alignas13.C (working copy) @@ -0,0 +1,5 @@ +// PR c++/78344 +// { dg-do compile { target c++11 } } + +alignas(double) int f alignas; // { dg-error "30:expected '\\('" } +alignas(double) int g alignas(double; // { dg-error "37:expected '\\)'" }