On Wed, Feb 01, 2017 at 04:18:49PM +0100, Richard Biener wrote: > 2017-02-01 Richard Biener <rguent...@suse.de> > > PR cp/14179 > cp/ > * 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. > > Index: gcc/cp/cp-gimplify.c > =================================================================== > --- gcc/cp/cp-gimplify.c (revision 245096) > +++ gcc/cp/cp-gimplify.c (working copy) > @@ -2358,15 +2358,11 @@ 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) > @@ -2375,10 +2371,12 @@ cp_fold (tree x) > changed = false; > 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);
vec_free (nelts); doesn't make sense in this case though, so I'd also remove the last 2 lines. Jakub