https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68489
Martin Sebor <msebor at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|UNCONFIRMED |NEW Last reconfirmed| |2016-02-01 Ever confirmed|0 |1 Known to fail| |6.0 --- Comment #1 from Martin Sebor <msebor at gcc dot gnu.org> --- Bug 28865 provides useful background on this problem. GCC (in C mode) used to accept definitions of initialized array objects of structures with flexible array members. That feature was removed in response to bug 28865 which pointed out that the size of such objects (emitted into the assembly in the form of the .size directive) is incorrect. G++ 6.0 suffers from both of these problems because it accepts definitions of such objects. Prior versions rejected such code. The following test case demonstrates the consequences of this problem: $ cat t.c && /home/msebor/build/gcc-trunk-git/gcc/xgcc -B/home/msebor/build/gcc-trunk-git/gcc -Wall -Wextra -Wpedantic -std=c++11 -xc++ t.c && ./a.out struct S { char x; int y []; }; struct S s[2] = { { 1, { 2, 3 } }, { 4, { 5, 6 } } }; int main (void) { __builtin_printf ("sizeof s = %zu\n" "s[0] @%p = { %hhi, { %i, %i } }\n" "s[1] @%p = { %hhi, { %i, %i } }\n", sizeof (struct S), &s [0], s[0].x, s[0].y [0], s[0].y [1], &s [1], s[1].x, s[1].y [0], s[1].y [1]); if ( s [0].x != 1 || s [0].y [0] != 2 || s [0].y [1] != 3 || s [1].x != 4 || s [1].y [0] != 5 || s [1].y [1] != 6) __builtin_abort (); } t.c:6:1: warning: initialization of a flexible array member [-Wpedantic] }; ^ t.c:6:1: warning: initialization of a flexible array member [-Wpedantic] t.c: In function ‘int main()’: t.c:14:61: warning: format ‘%p’ expects argument of type ‘void*’, but argument 3 has type ‘S*’ [-Wformat=] &s [1], s[1].x, s[1].y [0], s[1].y [1]); ^ t.c:14:61: warning: format ‘%p’ expects argument of type ‘void*’, but argument 7 has type ‘S*’ [-Wformat=] sizeof s = 4 s[0] @0x601048 = { 1, { 2, 3 } } s[1] @0x60104c = { 2, { 3, 4 } } Aborted (core dumped)