https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81884
Bug ID: 81884 Summary: Invalid code generation with zero size arrays or flexible array members Product: gcc Version: 7.2.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: v at vsamko dot com Target Milestone: --- Code below prints 1 2 13 14 BUG DETECTED when compiled with "-Wfatal-errors -O3 bug2.cpp -o bug2 --save-temps -Wall", but outputs correct results when compiled with -O0, or if we comment out " x->eventTime = value_t(10);", or typedef "value_t" to uint64_t. Same problem if we use flexible array member (e.g. "uint64_t arr[]") instead of the zero length array. === typedef unsigned long uint64_t; struct value_t { uint64_t _count; value_t(uint64_t c) : _count(c) {} }; struct X { value_t eventTime; uint64_t arr[0]; }; X* x; __attribute__((noclone, noinline)) void initialize() { x->arr[0] = 11; x->arr[1] = 12; x->eventTime = value_t(10); x->arr[2] = 13; x->arr[3] = 14; } int main() { char buffer[sizeof(X) + sizeof(uint64_t)*4]; x = (X*)buffer; x->eventTime = value_t(999); x->arr[0] = 1; x->arr[1] = 2; x->arr[2] = 3; x->arr[3] = 4; initialize(); __builtin_printf("%lu %lu %lu %lu\n", x->arr[0], x->arr[1], x->arr[2], x->arr[3]); if (x->arr[0] != 11 || x->arr[1] != 12 || x->arr[2] != 13 || x->arr[3] != 14) { __builtin_printf("BUG DETECTED\n"); } else { __builtin_printf("NO BUG\n"); } }