re PR c++/84281 (Heap grows indefinitely)
authorRichard Biener <rguenther@suse.de>
Mon, 12 Feb 2018 07:31:56 +0000 (07:31 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Mon, 12 Feb 2018 07:31:56 +0000 (07:31 +0000)
2018-02-12  Richard Biener  <rguenther@suse.de>

PR c++/84281
* constexpr.c (cxx_eval_vec_init_1): Use a RANGE_EXPR to compact
uniform constructors and delay allocating them fully.

From-SVN: r257580

gcc/cp/ChangeLog
gcc/cp/constexpr.c

index 9b8793751b987c0a5acf3c8cfb4bb0f605d7cd21..bb7e9173072456bbdec018fee94e05aebdb9241c 100644 (file)
@@ -1,3 +1,9 @@
+2018-02-12  Richard Biener  <rguenther@suse.de>
+
+       PR c++/84281
+       * constexpr.c (cxx_eval_vec_init_1): Use a RANGE_EXPR to compact
+       uniform constructors and delay allocating them fully.
+
 2018-02-09  Jason Merrill  <jason@redhat.com>
 
        PR c++/84036 - ICE with variadic capture.
index 729244127067186b93fddab856c0b0731d2263b3..d89bdd5a6a43bd903be728b0082314ab4a87deb7 100644 (file)
@@ -2885,7 +2885,6 @@ cxx_eval_vec_init_1 (const constexpr_ctx *ctx, tree atype, tree init,
   unsigned HOST_WIDE_INT max = tree_to_uhwi (array_type_nelts_top (atype));
   verify_ctor_sanity (ctx, atype);
   vec<constructor_elt, va_gc> **p = &CONSTRUCTOR_ELTS (ctx->ctor);
-  vec_alloc (*p, max + 1);
   bool pre_init = false;
   unsigned HOST_WIDE_INT i;
 
@@ -2978,13 +2977,14 @@ cxx_eval_vec_init_1 (const constexpr_ctx *ctx, tree atype, tree init,
        {
          if (new_ctx.ctor != ctx->ctor)
            eltinit = new_ctx.ctor;
-         for (i = 1; i < max; ++i)
-           {
-             idx = build_int_cst (size_type_node, i);
-             CONSTRUCTOR_APPEND_ELT (*p, idx, unshare_constructor (eltinit));
-           }
+         tree range = build2 (RANGE_EXPR, size_type_node,
+                              build_int_cst (size_type_node, 1),
+                              build_int_cst (size_type_node, max - 1));
+         CONSTRUCTOR_APPEND_ELT (*p, range, unshare_constructor (eltinit));
          break;
        }
+      else if (i == 0)
+       vec_safe_reserve (*p, max);
     }
 
   if (!*non_constant_p)