re PR c/63567 (Linux kernel build error due to non-static initializers)
authorMarek Polacek <polacek@redhat.com>
Fri, 17 Oct 2014 21:02:54 +0000 (21:02 +0000)
committerMarek Polacek <mpolacek@gcc.gnu.org>
Fri, 17 Oct 2014 21:02:54 +0000 (21:02 +0000)
PR c/63567
* c-typeck.c (digest_init): Allow initializing objects with static
storage duration with compound literals even in C99 and add pedwarn
for it.

* gcc.dg/pr61096-1.c: Change dg-error into dg-warning.
* gcc.dg/pr63567-1.c: New test.
* gcc.dg/pr63567-2.c: New test.

From-SVN: r216416

gcc/c/ChangeLog
gcc/c/c-typeck.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr61096-1.c
gcc/testsuite/gcc.dg/pr63567-1.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/pr63567-2.c [new file with mode: 0644]

index 294b4ef54ad561e8abd2dd8a813349635c262167..35b8dcd968e5e1cb1c8a2ce566a62cdf055f8f9d 100644 (file)
@@ -1,3 +1,10 @@
+2014-10-17  Marek Polacek  <polacek@redhat.com>
+
+       PR c/63567
+       * c-typeck.c (digest_init): Allow initializing objects with static
+       storage duration with compound literals even in C99 and add pedwarn
+       for it.
+
 2014-10-17  Marek Polacek  <polacek@redhat.com>
 
        PR c/63543
index 324736acdf4812597161a6de6a83293cd2a0e697..0dd33668d29c6de0f2f3ea1118a1d9520b8a58a0 100644 (file)
@@ -6683,13 +6683,15 @@ 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)
          && TREE_CODE (inside_init) == COMPOUND_LITERAL_EXPR)
        {
          /* As an extension, allow initializing objects with static storage
             duration with compound literals (which are then treated just as
             the brace enclosed list they contain).  Also allow this for
             vectors, as we can only assign them with compound literals.  */
+         if (flag_isoc99 && code != VECTOR_TYPE)
+           pedwarn_init (init_loc, OPT_Wpedantic, "initializer element "
+                         "is not constant");
          tree decl = COMPOUND_LITERAL_EXPR_DECL (inside_init);
          inside_init = DECL_INITIAL (decl);
        }
index 29ed3e6956ddc342da40d9bf1773315b273b3949..ea148476a96231398524e94810c8a1782d68b71a 100644 (file)
@@ -1,3 +1,10 @@
+2014-10-17  Marek Polacek  <polacek@redhat.com>
+
+       PR c/63567
+       * gcc.dg/pr61096-1.c: Change dg-error into dg-warning.
+       * gcc.dg/pr63567-1.c: New test.
+       * gcc.dg/pr63567-2.c: New test.
+
 2014-10-17  Marek Polacek  <polacek@redhat.com>
 
        PR c/63543
index 3f7d60c0e5dd98beb872c55655dbc8f4a3ace76d..fa8932f8b6dcdbd0fd24cc8242d487933e317cfd 100644 (file)
@@ -23,7 +23,7 @@ char w1[] = L"foo"; /* { dg-error "13:char-array initialized from wide string" }
 __WCHAR_TYPE__ w2[] = "foo"; /* { dg-error "23:wide character array initialized from non-wide string" } */
 __WCHAR_TYPE__ w3[] = U"foo"; /* { dg-error "23:wide character array initialized from incompatible wide string" } */
 schar a1[] = "foo"; /* { dg-error "14:array of inappropriate type initialized from string constant" } */
-int a2[] = (int[]) { 1 }; /* { dg-error "12:array initialized from non-constant array expression" } */
+int a2[] = (int[]) { 1 }; /* { dg-warning "12:initializer element is not constant" } */
 
 int a3 = e; /* { dg-error "10:initializer element is not constant" } */
 int a4 = (e, 1); /* { dg-error "10:initializer element is not constant" } */
diff --git a/gcc/testsuite/gcc.dg/pr63567-1.c b/gcc/testsuite/gcc.dg/pr63567-1.c
new file mode 100644 (file)
index 0000000..97da171
--- /dev/null
@@ -0,0 +1,10 @@
+/* PR c/63567 */
+/* { dg-do compile } */
+/* { dg-options "" } */
+
+/* Allow initializing objects with static storage duration with
+   compound literals even.  This is being used in Linux kernel.  */
+
+struct T { int i; };
+struct S { struct T t; };
+static struct S s = (struct S) { .t = { 42 } };
diff --git a/gcc/testsuite/gcc.dg/pr63567-2.c b/gcc/testsuite/gcc.dg/pr63567-2.c
new file mode 100644 (file)
index 0000000..5ea2b37
--- /dev/null
@@ -0,0 +1,10 @@
+/* PR c/63567 */
+/* { dg-do compile } */
+/* { dg-options "-pedantic" } */
+
+/* Allow initializing objects with static storage duration with
+   compound literals.  This is being used in Linux kernel.  */
+
+struct T { int i; };
+struct S { struct T t; };
+static struct S s = (struct S) { .t = { 42 } }; /* { dg-warning "initializer element is not constant" } */