aboutsummaryrefslogtreecommitdiff
path: root/gcc/expr.c
diff options
context:
space:
mode:
authorBernd Schmidt <bernd.schmidt@analog.com>2006-05-17 09:42:23 +0000
committerBernd Schmidt <bernds@gcc.gnu.org>2006-05-17 09:42:23 +0000
commit33598a1b8e670a9e36b8be056c7f610cd26fe0be (patch)
treee16ce0c9aa6ac1149b1dee6fc39aeb596a11b8a3 /gcc/expr.c
parentaa0e52dbd5a20acf70b8f5f2ffa407cdfcb9f737 (diff)
downloadgcc-33598a1b8e670a9e36b8be056c7f610cd26fe0be.zip
gcc-33598a1b8e670a9e36b8be056c7f610cd26fe0be.tar.gz
gcc-33598a1b8e670a9e36b8be056c7f610cd26fe0be.tar.bz2
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
Diffstat (limited to 'gcc/expr.c')
-rw-r--r--gcc/expr.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/gcc/expr.c b/gcc/expr.c
index f59cc42..f0a05e9 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