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.

Bootstrapped/regtested on x86_64-linux, ok for trunk?

2014-10-17  Marek Polacek  <pola...@redhat.com>

        PR c/63567
        * c-typeck.c (digest_init): Allow initializing objects with static
        storage duration with compound literals in non-pedantic mode.

        * gcc.dg/pr63567.c: New test.

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

        Marek

Reply via email to