From 33598a1b8e670a9e36b8be056c7f610cd26fe0be Mon Sep 17 00:00:00 2001
From: Bernd Schmidt <bernd.schmidt@analog.com>
Date: Wed, 17 May 2006 09:42:23 +0000
Subject: [PATCH] re PR middle-end/27620 (g++.dg/init/array15.C uses 4MB stack
 space)

	PR middle-end/27620
	* expr.c (safe_from_p): Handle CONSTRUCTOR again.

From-SVN: r113850
---
 gcc/ChangeLog |  5 +++++
 gcc/expr.c    | 13 +++++++++++++
 2 files changed, 18 insertions(+)

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 862e2bf72744..2f7034c9f004 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2005-05-17  Bernd Schmidt  <bernd.schmidt@analog.com>
+
+	PR middle-end/27620
+	* expr.c (safe_from_p): Handle CONSTRUCTOR again.
+
 2006-05-17  Jakub Jelinek  <jakub@redhat.com>
 
 	PR middle-end/27415
diff --git a/gcc/expr.c b/gcc/expr.c
index f59cc426a175..f0a05e907c45 100644
--- a/gcc/expr.c
+++ b/gcc/expr.c
@@ -6075,6 +6075,19 @@ safe_from_p (rtx x, tree exp, int top_p)
 		return safe_from_p (x, exp, 0);
 	    }
 	}
+      else if (TREE_CODE (exp) == CONSTRUCTOR)
+	{
+	  constructor_elt *ce;
+	  unsigned HOST_WIDE_INT idx;
+
+	  for (idx = 0;
+	       VEC_iterate (constructor_elt, CONSTRUCTOR_ELTS (exp), idx, ce);
+	       idx++)
+	    if ((ce->index != NULL_TREE && !safe_from_p (x, ce->index, 0))
+		|| !safe_from_p (x, ce->value, 0))
+	      return 0;
+	  return 1;
+	}
       else if (TREE_CODE (exp) == ERROR_MARK)
 	return 1;	/* An already-visited SAVE_EXPR? */
       else