aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2018-02-12 07:31:56 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2018-02-12 07:31:56 +0000
commit1e027956d0baae2fbdeff5f4b6923a4e6c3db9bb (patch)
tree1dfb7387dd815e035113b489926ceeefa0a43928 /gcc
parentc337f3612f66f7bcf716dc84a7be89e0344109cc (diff)
downloadgcc-1e027956d0baae2fbdeff5f4b6923a4e6c3db9bb.zip
gcc-1e027956d0baae2fbdeff5f4b6923a4e6c3db9bb.tar.gz
gcc-1e027956d0baae2fbdeff5f4b6923a4e6c3db9bb.tar.bz2
re PR c++/84281 (Heap grows indefinitely)
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/constexpr.c12
2 files changed, 12 insertions, 6 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 9b87937..bb7e917 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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.
diff --git a/gcc/cp/constexpr.c b/gcc/cp/constexpr.c
index 7292441..d89bdd5 100644
--- a/gcc/cp/constexpr.c
+++ b/gcc/cp/constexpr.c
@@ -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)