From 9cb3832d7bed353cb522ffd3e74b1962cb91789a Mon Sep 17 00:00:00 2001
From: pinskia <pinskia@138bc75d-0d04-0410-961f-82ee72b054a4>
Date: Thu, 3 Nov 2005 15:21:15 +0000
Subject: [PATCH] 2005-11-03  Andrew Pinski  <pinskia@physics.uc.edu>

        PR middle-end/24589
        * gimplify.c (gimplify_expr) <case CONSTRUCTOR>: Add the
        expressions to a statement list instead of gimplifying them.

2005-11-03  Andrew Pinski  <pinskia@physics.uc.edu>

        PR middle-end/24589
        * gcc.c-torture/execute/zero-struct-2.c: New test.




git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@106436 138bc75d-0d04-0410-961f-82ee72b054a4
---
 gcc/ChangeLog                                 |  6 ++++++
 gcc/gimplify.c                                | 11 +++++-----
 gcc/testsuite/ChangeLog                       |  5 +++++
 .../gcc.c-torture/execute/zero-struct-2.c     | 20 +++++++++++++++++++
 4 files changed, 37 insertions(+), 5 deletions(-)
 create mode 100644 gcc/testsuite/gcc.c-torture/execute/zero-struct-2.c

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 2e537361359f..e449baa16ecc 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2005-11-03  Andrew Pinski  <pinskia@physics.uc.edu>
+
+	PR middle-end/24589
+	* gimplify.c (gimplify_expr) <case CONSTRUCTOR>: Add the
+	expressions to a statement list instead of gimplifying them.
+
 2005-11-03  Eric Botcazou  <ebotcazou@libertysurf.fr>
 
 	PR rtl-optimization/23585
diff --git a/gcc/gimplify.c b/gcc/gimplify.c
index b7d891e041e4..52e70bdad5ea 100644
--- a/gcc/gimplify.c
+++ b/gcc/gimplify.c
@@ -4312,18 +4312,19 @@ gimplify_expr (tree *expr_p, tree *pre_p, tree *post_p,
 	    {
 	      unsigned HOST_WIDE_INT ix;
 	      constructor_elt *ce;
+	      tree temp = NULL_TREE;
 	      for (ix = 0;
 		   VEC_iterate (constructor_elt, CONSTRUCTOR_ELTS (*expr_p),
 				ix, ce);
 		   ix++)
 		if (TREE_SIDE_EFFECTS (ce->value))
-		  gimplify_expr (&ce->value, pre_p, post_p,
-				 gimple_test_f, fallback);
+		  append_to_statement_list (ce->value, &temp);
 
-	      *expr_p = NULL_TREE;
+	      *expr_p = temp;
+	      ret = GS_OK;
 	    }
-
-	  ret = GS_ALL_DONE;
+	  else
+	    ret = GS_ALL_DONE;
 	  break;
 
 	  /* The following are special cases that are not handled by the
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 82124c6a9d1c..ffb3ee094092 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2005-11-03  Andrew Pinski  <pinskia@physics.uc.edu>
+
+	PR middle-end/24589
+	* gcc.c-torture/execute/zero-struct-2.c: New test.
+
 2005-11-03  Andrew Pinski  <pinskia@physics.uc.edu>
 
 	PR c++/24582
diff --git a/gcc/testsuite/gcc.c-torture/execute/zero-struct-2.c b/gcc/testsuite/gcc.c-torture/execute/zero-struct-2.c
new file mode 100644
index 000000000000..ed1d5a027b33
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/execute/zero-struct-2.c
@@ -0,0 +1,20 @@
+void abort (void);
+int ii;
+typedef struct {} raw_spinlock_t;
+typedef struct {
+  raw_spinlock_t raw_lock;
+} spinlock_t;
+raw_spinlock_t one_raw_spinlock (void)
+{
+  raw_spinlock_t raw_lock;
+  ii++;
+  return raw_lock;
+}
+int main(void)
+{
+  spinlock_t lock = (spinlock_t) { .raw_lock = one_raw_spinlock() };
+  if (ii != 1)
+    abort ();
+  return 0;
+}
+
-- 
GitLab