Commit 1e027956 by Richard Biener Committed by Richard Biener

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
parent c337f361
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> 2018-02-09 Jason Merrill <jason@redhat.com>
PR c++/84036 - ICE with variadic capture. PR c++/84036 - ICE with variadic capture.
......
...@@ -2885,7 +2885,6 @@ cxx_eval_vec_init_1 (const constexpr_ctx *ctx, tree atype, tree init, ...@@ -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)); unsigned HOST_WIDE_INT max = tree_to_uhwi (array_type_nelts_top (atype));
verify_ctor_sanity (ctx, atype); verify_ctor_sanity (ctx, atype);
vec<constructor_elt, va_gc> **p = &CONSTRUCTOR_ELTS (ctx->ctor); vec<constructor_elt, va_gc> **p = &CONSTRUCTOR_ELTS (ctx->ctor);
vec_alloc (*p, max + 1);
bool pre_init = false; bool pre_init = false;
unsigned HOST_WIDE_INT i; unsigned HOST_WIDE_INT i;
...@@ -2978,13 +2977,14 @@ cxx_eval_vec_init_1 (const constexpr_ctx *ctx, tree atype, tree init, ...@@ -2978,13 +2977,14 @@ cxx_eval_vec_init_1 (const constexpr_ctx *ctx, tree atype, tree init,
{ {
if (new_ctx.ctor != ctx->ctor) if (new_ctx.ctor != ctx->ctor)
eltinit = new_ctx.ctor; eltinit = new_ctx.ctor;
for (i = 1; i < max; ++i) tree range = build2 (RANGE_EXPR, size_type_node,
{ build_int_cst (size_type_node, 1),
idx = build_int_cst (size_type_node, i); build_int_cst (size_type_node, max - 1));
CONSTRUCTOR_APPEND_ELT (*p, idx, unshare_constructor (eltinit)); CONSTRUCTOR_APPEND_ELT (*p, range, unshare_constructor (eltinit));
}
break; break;
} }
else if (i == 0)
vec_safe_reserve (*p, max);
} }
if (!*non_constant_p) if (!*non_constant_p)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment