diff options
author | Bernd Schmidt <bernd.schmidt@analog.com> | 2006-05-17 09:42:23 +0000 |
---|---|---|
committer | Bernd Schmidt <bernds@gcc.gnu.org> | 2006-05-17 09:42:23 +0000 |
commit | 33598a1b8e670a9e36b8be056c7f610cd26fe0be (patch) | |
tree | e16ce0c9aa6ac1149b1dee6fc39aeb596a11b8a3 /gcc/expr.c | |
parent | aa0e52dbd5a20acf70b8f5f2ffa407cdfcb9f737 (diff) | |
download | gcc-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.c | 13 |
1 files changed, 13 insertions, 0 deletions
@@ -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 |