aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2019-06-07 17:08:26 -0400
committerJason Merrill <jason@gcc.gnu.org>2019-06-07 17:08:26 -0400
commit7a649ef59f9c32dd164a8e62b6eddb778cd7cb12 (patch)
treec0133a4dfda8d83caa31588f64debe04a1819739
parentc1b4c4f49131f16686ace6aa6b3291edd7048e82 (diff)
downloadgcc-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/ChangeLog7
-rw-r--r--gcc/cp/constexpr.c19
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);