On Wed, 16 Oct 2013, Marek Polacek wrote: > This PR is about _Alignas in contexts like > char x[_Alignas (int) 20]; > C grammar does not allow _Alignas to be in an array declarator, yet we > don't issue any warning or an error. This patch implements a pedwarn > for this. I'm however highly unsure whether we want pedwarn, error, or > normal warning for this - currently we just DTRT and ignore the > _Alignas altogether.
I think this should be an error. I see this as a problem with how the parsing of array declarators uses c_parser_declspecs to parse a sequence of qualifiers and attributes, with scspec_ok=false and typespec_ok=false to ensure those kinds of specifiers can't occur in the list, but without any measure to exclude alignment specifiers. That is, I think c_parser_declspecs should gain an argument specifying whether alignment specifiers are OK, and the relevant calls from c_parser_direct_declarator_inner would pass false for that argument, and uses of alignment specifiers here would result in parse errors. (Incidentally, the comments in c-parser.c that are supposed to give the grammar accepted are missing the syntax of array-declarator.) > --- gcc/testsuite/gcc.dg/c1x-align-5.c.mp 2013-10-16 11:11:16.432690963 > +0200 > +++ gcc/testsuite/gcc.dg/c1x-align-5.c 2013-10-16 11:15:09.269514593 > +0200 > @@ -0,0 +1,17 @@ > +/* Test C1X alignment support. Test invalid code. */ > +/* { dg-do compile } */ > +/* { dg-options "-std=c1x -pedantic-errors" } */ > + > +static int > +foo (int a[_Alignas (0) 10]) /* { dg-error "meaningless in array declarator" > } */ > +{ > + return a[0]; > +} > + > +int > +main () > +{ > + int a[_Alignas (int) 10]; /* { dg-error "meaningless in array declarator" > } */ > + foo (a); > + return 0; > +} I think this should also be tested after "static" (given that there are two separate calls to c_parser_declspecs involved), as well as in an abstract declarator. -- Joseph S. Myers jos...@codesourcery.com