From: Richard Biener Date: Mon, 26 Nov 2018 15:53:48 +0000 (+0000) Subject: re PR c++/84281 (Heap grows indefinitely) X-Git-Tag: releases/gcc-7.4.0~15 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1a2397397d7893a6f6206da9b78a77ed21e828b2;p=thirdparty%2Fgcc.git re PR c++/84281 (Heap grows indefinitely) PR c++/84281 2018-02-12 Richard Biener * constexpr.c (cxx_eval_vec_init_1): Use a RANGE_EXPR to compact uniform constructors and delay allocating them fully. From-SVN: r266469 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 3392176ce26d..03c30c3b1229 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2018-11-26 Richard Biener + + PR c++/84281 + * constexpr.c (cxx_eval_vec_init_1): Use a RANGE_EXPR to compact + uniform constructors and delay allocating them fully. + 2018-11-26 Jason Merrill PR c++/87075 - ICE with constexpr array initialization. diff --git a/gcc/cp/constexpr.c b/gcc/cp/constexpr.c index 48e821903ac0..cfd6a3a0e6e1 100644 --- a/gcc/cp/constexpr.c +++ b/gcc/cp/constexpr.c @@ -2843,7 +2843,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 **p = &CONSTRUCTOR_ELTS (ctx->ctor); - vec_alloc (*p, max + 1); bool pre_init = false; unsigned HOST_WIDE_INT i; @@ -2939,13 +2938,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)