Message ID | 20141017112544.GR10501@redhat.com |
---|---|
State | New |
Headers | show |
On Fri, 17 Oct 2014, Marek Polacek wrote: > Building Linux kernel failed with 'error: initializer element is not > constant', because they're initializing objects with static storage > duration with (T){ ...} - and that isn't permitted in gnu99/gnu11. > > I think the Right Thing is to allow some latitude here and enable it > even in gnu99/gnu11 unless -pedantic. In gnu89, this will work as > before even with -pedantic. The Right Thing is for -pedantic not to cause errors, only warnings (-pedantic-errors being needed for an error). So rather than having this conditional for whether to allow the extension at all, make the conditional code do a pedwarn (if flag_isoc99, otherwise there will already have been one for using a compound literal at all, and not for VECTOR_TYPE). (I don't believe this can affect the semantics of valid code; in this case of require_constant with a compound literal, we know the code is invalid in ISO C terms, so it's safe to diagnose it then interpret it in a sensible way.)
diff --git gcc/c/c-typeck.c gcc/c/c-typeck.c index 5c0697a..8ddf368 100644 --- gcc/c/c-typeck.c +++ gcc/c/c-typeck.c @@ -6676,7 +6676,7 @@ digest_init (location_t init_loc, tree type, tree init, tree origtype, inside_init = convert (type, inside_init); if (require_constant - && (code == VECTOR_TYPE || !flag_isoc99) + && (code == VECTOR_TYPE || !pedantic || !flag_isoc99) && TREE_CODE (inside_init) == COMPOUND_LITERAL_EXPR) { /* As an extension, allow initializing objects with static storage diff --git gcc/testsuite/gcc.dg/pr63567.c gcc/testsuite/gcc.dg/pr63567.c index e69de29..cf942ef 100644 --- gcc/testsuite/gcc.dg/pr63567.c +++ gcc/testsuite/gcc.dg/pr63567.c @@ -0,0 +1,11 @@ +/* PR c/63567 */ +/* { dg-do compile } */ +/* { dg-options "" } */ + +/* Allow initializing objects with static storage duration with + compound literals even in non-pedantic gnu99/gnu11. This is + being used in Linux kernel. */ + +struct T { int i; }; +struct S { struct T t; }; +static struct S s = (struct S) { .t = { 42 } };