diff options
author | Richard Biener <rguenther@suse.de> | 2017-02-02 08:55:44 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2017-02-02 08:55:44 +0000 |
commit | 27de0fab0f2aed57cd81d9bfefa913b2665b5b88 (patch) | |
tree | f286389cb4d5499e9c0f5c378b920d0b8af7730e /gcc | |
parent | d8d58893e4b12de87af384ec2bc45342e0238ce8 (diff) | |
download | gcc-27de0fab0f2aed57cd81d9bfefa913b2665b5b88.zip gcc-27de0fab0f2aed57cd81d9bfefa913b2665b5b88.tar.gz gcc-27de0fab0f2aed57cd81d9bfefa913b2665b5b88.tar.bz2 |
re PR c++/14179 (out of memory while parsing array with many initializers)
2017-02-02 Richard Biener <rguenther@suse.de>
PR cp/14179
* cp-gimplify.c (cp_fold): When folding a CONSTRUCTOR copy
it lazily on the first changed element only and copy it
fully upfront, only storing changed elements.
From-SVN: r245118
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/cp/cp-gimplify.c | 14 |
2 files changed, 12 insertions, 9 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index fbea09a..96136af 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2017-02-02 Richard Biener <rguenther@suse.de> + + PR cp/14179 + * cp-gimplify.c (cp_fold): When folding a CONSTRUCTOR copy + it lazily on the first changed element only and copy it + fully upfront, only storing changed elements. + 2017-02-02 Paolo Carlini <paolo.carlini@oracle.com> PR c++/69637 diff --git a/gcc/cp/cp-gimplify.c b/gcc/cp/cp-gimplify.c index 1364703..3eec940 100644 --- a/gcc/cp/cp-gimplify.c +++ b/gcc/cp/cp-gimplify.c @@ -2358,30 +2358,26 @@ cp_fold (tree x) { unsigned i; constructor_elt *p; - bool changed = false; vec<constructor_elt, va_gc> *elts = CONSTRUCTOR_ELTS (x); vec<constructor_elt, va_gc> *nelts = NULL; - vec_safe_reserve (nelts, vec_safe_length (elts)); FOR_EACH_VEC_SAFE_ELT (elts, i, p) { tree op = cp_fold (p->value); - constructor_elt e = { p->index, op }; - nelts->quick_push (e); if (op != p->value) { if (op == error_mark_node) { x = error_mark_node; - changed = false; + vec_free (nelts); break; } - changed = true; + if (nelts == NULL) + nelts = elts->copy (); + (*nelts)[i].value = op; } } - if (changed) + if (nelts) x = build_constructor (TREE_TYPE (x), nelts); - else - vec_free (nelts); break; } case TREE_VEC: |