re PR c++/14179 (out of memory while parsing array with many initializers)
authorRichard Biener <rguenther@suse.de>
Thu, 2 Feb 2017 08:55:44 +0000 (08:55 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Thu, 2 Feb 2017 08:55:44 +0000 (08:55 +0000)
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

gcc/cp/ChangeLog
gcc/cp/cp-gimplify.c

index fbea09af7fc47aaf221eef725b6c91bee41e2c15..96136af87eb282b284af2b54f8f5e25a6be6293c 100644 (file)
@@ -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
index 13647033f70fdab4959040e62885fb11dc025c2b..3eec9400fb04aaaf5d81bbf5d3bb48a9a515bcf7 100644 (file)
@@ -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: