diff options
author | Jason Merrill <jason@redhat.com> | 2019-06-07 17:08:26 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2019-06-07 17:08:26 -0400 |
commit | 7a649ef59f9c32dd164a8e62b6eddb778cd7cb12 (patch) | |
tree | c0133a4dfda8d83caa31588f64debe04a1819739 | |
parent | c1b4c4f49131f16686ace6aa6b3291edd7048e82 (diff) | |
download | gcc-7a649ef59f9c32dd164a8e62b6eddb778cd7cb12.zip gcc-7a649ef59f9c32dd164a8e62b6eddb778cd7cb12.tar.gz gcc-7a649ef59f9c32dd164a8e62b6eddb778cd7cb12.tar.bz2 |
Avoid constexpr garbage for implicit conversion to void.
* constexpr.c (cxx_eval_constant_expression): Call
STRIP_ANY_LOCATION_WRAPPER early.
[CONVERT_EXPR]: Don't build anything for conversion to void.
[ADDR_EXPR]: ggc_free unused ADDR_EXPR.
From-SVN: r272054
-rw-r--r-- | gcc/cp/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/cp/constexpr.c | 19 |
2 files changed, 20 insertions, 6 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 1489238..c072040 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2019-06-07 Jason Merrill <jason@redhat.com> + + * constexpr.c (cxx_eval_constant_expression): Call + STRIP_ANY_LOCATION_WRAPPER early. + [CONVERT_EXPR]: Don't build anything for conversion to void. + [ADDR_EXPR]: ggc_free unused ADDR_EXPR. + 2019-06-05 Martin Sebor <msebor@redhat.com> PR c/90737 diff --git a/gcc/cp/constexpr.c b/gcc/cp/constexpr.c index 15bfb6d..10afc41 100644 --- a/gcc/cp/constexpr.c +++ b/gcc/cp/constexpr.c @@ -4382,9 +4382,6 @@ cxx_eval_constant_expression (const constexpr_ctx *ctx, tree t, bool *non_constant_p, bool *overflow_p, tree *jump_target /* = NULL */) { - constexpr_ctx new_ctx; - tree r = t; - if (jump_target && *jump_target) { /* If we are jumping, ignore all statements/expressions except those @@ -4415,6 +4412,9 @@ cxx_eval_constant_expression (const constexpr_ctx *ctx, tree t, *non_constant_p = true; return t; } + + STRIP_ANY_LOCATION_WRAPPER (t); + if (CONSTANT_CLASS_P (t)) { if (TREE_OVERFLOW (t)) @@ -4439,8 +4439,7 @@ cxx_eval_constant_expression (const constexpr_ctx *ctx, tree t, } /* Avoid excessively long constexpr evaluations. */ - if (!location_wrapper_p (t) - && ++*ctx->constexpr_ops_count >= constexpr_ops_limit) + if (++*ctx->constexpr_ops_count >= constexpr_ops_limit) { if (!ctx->quiet) error_at (cp_expr_loc_or_loc (t, input_location), @@ -4452,6 +4451,9 @@ cxx_eval_constant_expression (const constexpr_ctx *ctx, tree t, return t; } + constexpr_ctx new_ctx; + tree r = t; + tree_code tcode = TREE_CODE (t); switch (tcode) { @@ -4752,7 +4754,10 @@ cxx_eval_constant_expression (const constexpr_ctx *ctx, tree t, /* This function does more aggressive folding than fold itself. */ r = build_fold_addr_expr_with_type (op, TREE_TYPE (t)); if (TREE_CODE (r) == ADDR_EXPR && TREE_OPERAND (r, 0) == oldop) - return t; + { + ggc_free (r); + return t; + } break; } @@ -5065,6 +5070,8 @@ cxx_eval_constant_expression (const constexpr_ctx *ctx, tree t, r = op; else if (tcode == UNARY_PLUS_EXPR) r = fold_convert (TREE_TYPE (t), op); + else if (VOID_TYPE_P (type)) + r = void_node; else r = fold_build1 (tcode, type, op); |