OSDN Git Service

2009-05-11 Paolo Bonzini <bonzini@gnu.org>
authorbonzini <bonzini@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 11 May 2009 16:05:45 +0000 (16:05 +0000)
committerbonzini <bonzini@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 11 May 2009 16:05:45 +0000 (16:05 +0000)
PR tree-optimization/40026
* gimplify.c (gimplify_init_constructor): Change initial conditional
to assertion.  Rewrite TREE_OPERAND (*expr_p, 1) after
optimize_compound_literals_in_ctor.

testsuite:
2009-05-11  Paolo Bonzini  <bonzini@gnu.org>

* gcc.c-torture/compile/pr40026.c: New testcase.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@147386 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/gimplify.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/compile/pr40026.c [new file with mode: 0644]

index c07ab68..d50fee4 100644 (file)
@@ -1,3 +1,10 @@
+2009-05-11  Paolo Bonzini  <bonzini@gnu.org>
+
+       PR tree-optimization/40026
+       * gimplify.c (gimplify_init_constructor): Change initial conditional
+       to assertion.  Rewrite TREE_OPERAND (*expr_p, 1) after
+       optimize_compound_literals_in_ctor.
+
 2009-05-11  Nathan Sidwell  <nathan@codesourcery.com>
 
        * config/m68k/m68k-devices.def (52274, 52277, 5301x, 5225x, 51xx):
index 0c33dab..bff7cdd 100644 (file)
@@ -3643,14 +3643,11 @@ static enum gimplify_status
 gimplify_init_constructor (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p,
                           bool want_value, bool notify_temp_creation)
 {
-  tree object, new_ctor;
-  tree ctor = TREE_OPERAND (*expr_p, 1);
-  tree type = TREE_TYPE (ctor);
+  tree object, ctor, type;
   enum gimplify_status ret;
   VEC(constructor_elt,gc) *elts;
 
-  if (TREE_CODE (ctor) != CONSTRUCTOR)
-    return GS_UNHANDLED;
+  gcc_assert (TREE_CODE (TREE_OPERAND (*expr_p, 1)) == CONSTRUCTOR);
 
   if (!notify_temp_creation)
     {
@@ -3661,8 +3658,10 @@ gimplify_init_constructor (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p,
     }
 
   object = TREE_OPERAND (*expr_p, 0);
-  new_ctor = optimize_compound_literals_in_ctor (ctor);
-  elts = CONSTRUCTOR_ELTS (new_ctor);
+  ctor = TREE_OPERAND (*expr_p, 1) =
+    optimize_compound_literals_in_ctor (TREE_OPERAND (*expr_p, 1));
+  type = TREE_TYPE (ctor);
+  elts = CONSTRUCTOR_ELTS (ctor);
   ret = GS_ALL_DONE;
 
   switch (TREE_CODE (type))
index f8365a0..bb82336 100644 (file)
@@ -1,3 +1,7 @@
+2009-05-11  Paolo Bonzini  <bonzini@gnu.org>
+
+       * gcc.c-torture/compile/pr40026.c: New testcase.
+
 2009-05-11  Janus Weil  <janus@gcc.gnu.org>
 
        PR fortran/40089
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr40026.c b/gcc/testsuite/gcc.c-torture/compile/pr40026.c
new file mode 100644 (file)
index 0000000..0d08f0d
--- /dev/null
@@ -0,0 +1,15 @@
+typedef struct {
+    unsigned long bits;
+} S;
+struct T {
+    S span;
+    int flags;
+};
+
+struct T f(int x)
+{
+  return (struct T) {
+      .span = (S) { 0UL },
+      .flags = (x ? 256 : 0),
+  };
+}