diff mbox

[C] Enable initializing statics with COMPOUND_LITERAL_EXPR in C99 (PR c/63567)

Message ID 20141017112544.GR10501@redhat.com
State New
Headers show

Commit Message

Marek Polacek Oct. 17, 2014, 11:25 a.m. UTC
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  <polacek@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.


	Marek

Comments

Joseph Myers Oct. 17, 2014, 3:53 p.m. UTC | #1
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 mbox

Patch

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