https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69585
Bug ID: 69585 Summary: [C++ 11] parser errors mixing alignas, C++ 11 and GNU attributes on class declaration Product: gcc Version: 6.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: msebor at gcc dot gnu.org Target Milestone: --- The C++ parser seems to have trouble combining the C++11 alignas specifier and the GNU __attribute__ specifier in the same class declaration. It also doesn't like pairing C++11 attribute specifiers with GNU __attribute__. Pairing alignas and the C++ 11 [[attribute]] syntax seems to work. Clang does somewhat better (it handles GNU __attribute__ and C++11 [[attribute]] but it too chokes on alignas and GNU attributes and on C++ [[attribute]] and GNU __attribute__. The following example shows the problematic interactions between C++ 11 alignas, C++ 11 [[gnu::may_alias]], and GNU __attribute__((mayalias)). Since other similar syntactic combinations are accepted (such as the common inline and __attribute__((always_inline))), I expected alignas and __attribute__((whatever)) to be as well. I couldn't find anything about this restriction is in manual. $ cat v.c && /build/gcc-trunk/gcc/xgcc -B /build/gcc-trunk/gcc -O2 -S -Wall -Wextra -Wpedantic -Wuninitialized -std=c++11 -xc++ v.c struct __attribute__ ((aligned (2))) __attribute__ ((may_alias)) S1 { }; struct __attribute__ ((aligned (2))) [[gnu::may_alias]] S2 { }; struct alignas (2) __attribute__ ((may_alias)) S3 { }; struct alignas (2) [[gnu::may_alias]] S4 { }; struct __attribute__ ((may_alias)) __attribute__ ((aligned (2))) S1_2 { }; struct [[gnu::may_alias]] __attribute__ ((aligned (2))) S2_2 { }; struct __attribute__ ((may_alias)) alignas (2) S3_2 { }; struct [[gnu::may_alias]] alignas (2) S4_2 { }; v.c:4:38: error: expected identifier before ‘[’ token struct __attribute__ ((aligned (2))) [[gnu::may_alias]] ^ v.c:4:38: warning: attribute ignored [-Wattributes] v.c:4:38: note: an attribute that appertains to a type-specifier is ignored v.c:7:20: error: expected identifier before ‘__attribute__’ struct alignas (2) __attribute__ ((may_alias)) ^~~~~~~~~~~~~ v.c:17:27: error: expected identifier before ‘__attribute__’ struct [[gnu::may_alias]] __attribute__ ((aligned (2))) ^~~~~~~~~~~~~ v.c:20:36: error: expected identifier before ‘alignas’ struct __attribute__ ((may_alias)) alignas (2) ^~~~~~~ v.c:20:36: warning: attribute ignored [-Wattributes] v.c:20:36: note: an attribute that appertains to a type-specifier is ignored