https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87148
Jonathan Wakely <redi at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Keywords|needs-bisection |
CC| |msebor at gcc dot gnu.org
--- Comment #2 from Jonathan Wakely <redi at gcc dot gnu.org> ---
There is no reason to accept this code, the struct type is not valid in GNU C
and not valid in ISO C++.
This is a proper testcase that actually compiled with older versions of G++:
struct Tst{
char t[];
};
Tst* p = new Tst();
This was silently accepted until r231665 which correctly says:
87148.cc:2:11: error: flexible array member ‘Tst::t’ in an otherwise empty
‘struct Tst’
char t[];
^
87148.cc:1:8: note: in the definition of ‘struct Tst’
struct Tst{
^~~
87148.cc:4:18: error: value-initialization of incomplete type ‘char []’
Tst* p = new Tst();
^
Rejecting a struct with no members except a flexible/empty array member is the
right thing to do. G++ was wrong to accept them previously (it was far too
lenient in the nonsense it accepted as flexible array members).
If we fix the testcase:
struct Tst{
int i;
char t[];
};
Tst t = Tst();
Now we get the claimed error:
87148.c:5:13: error: value-initialization of incomplete type 'char []'
Tst t = Tst();
^
It seems reasonable to accept this, ignoring the array during initialization.
This started with r231665. CCing Martin who fixed all the bugs with
flexible/empty array members.