CompCert icon indicating copy to clipboard operation
CompCert copied to clipboard

Support for gnu extension flexible array initializer

Open ubitux opened this issue 6 years ago • 2 comments

Example code:

#include <stdio.h>

struct int_def {
    const char *s;
    const int ints[];
};

static const struct int_def my_ints = {
    .s = "my ints",
    .ints = {0, 3, 7, 2, -1},
};

int main() {
    const struct int_def *def = &my_ints;
    const int *v = def->ints;

    printf("%s\n", def->s);
    while (*v != -1) {
        printf("%d\n", *v);
        v++;
    }
    return 0;
}

This is a common idiom used at the end of structures, making their size variable. This is the expected output on GCC or Clang:

my ints
0
3
7
2

With CompCert 3.4, it doesn't compile: error: initializer element is not a compile-time constant (wrong number of elements in array initializer)

ubitux avatar Jan 23 '19 14:01 ubitux

This is actually not standard C99 but rather a gnu extension. You also get a warning if you compile it with -pedantic and -std=c99 for both gcc and clang.

bschommer avatar Jan 28 '19 20:01 bschommer

I changed the title to reflect the real problem.

bschommer avatar Jan 28 '19 20:01 bschommer