aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPaolo Bonzini <bonzini@gnu.org>2009-05-11 16:05:45 +0000
committerPaolo Bonzini <bonzini@gcc.gnu.org>2009-05-11 16:05:45 +0000
commitf5a1f0d01fa875ef6f2d895f990f4a2064b9d7f4 (patch)
tree87afb737192a4a6ae82fa278b87e9e7c4bd0c473 /gcc
parentc260f01fccf711d0915f7faa4c6a0f360cda2274 (diff)
downloadgcc-f5a1f0d01fa875ef6f2d895f990f4a2064b9d7f4.zip
gcc-f5a1f0d01fa875ef6f2d895f990f4a2064b9d7f4.tar.gz
gcc-f5a1f0d01fa875ef6f2d895f990f4a2064b9d7f4.tar.bz2
re PR middle-end/40026 (ICE during gimplify_init_constructor)
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. testsuite: 2009-05-11 Paolo Bonzini <bonzini@gnu.org> * gcc.c-torture/compile/pr40026.c: New testcase. From-SVN: r147386
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/gimplify.c13
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/pr40026.c15
4 files changed, 32 insertions, 7 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index c07ab68..d50fee4 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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):
diff --git a/gcc/gimplify.c b/gcc/gimplify.c
index 0c33dab..bff7cdd 100644
--- a/gcc/gimplify.c
+++ b/gcc/gimplify.c
@@ -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))
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index f8365a0..bb82336 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..0d08f0d
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/pr40026.c
@@ -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),
+ };
+}