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");
    }
}

Reply via email to