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
This commit is contained in:
Jason Merrill 2019-06-07 17:08:26 -04:00 committed by Jason Merrill
parent c1b4c4f491
commit 7a649ef59f
2 changed files with 20 additions and 6 deletions

View file

@ -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> 2019-06-05 Martin Sebor <msebor@redhat.com>
PR c/90737 PR c/90737

View file

@ -4382,9 +4382,6 @@ cxx_eval_constant_expression (const constexpr_ctx *ctx, tree t,
bool *non_constant_p, bool *overflow_p, bool *non_constant_p, bool *overflow_p,
tree *jump_target /* = NULL */) tree *jump_target /* = NULL */)
{ {
constexpr_ctx new_ctx;
tree r = t;
if (jump_target && *jump_target) if (jump_target && *jump_target)
{ {
/* If we are jumping, ignore all statements/expressions except those /* 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; *non_constant_p = true;
return t; return t;
} }
STRIP_ANY_LOCATION_WRAPPER (t);
if (CONSTANT_CLASS_P (t)) if (CONSTANT_CLASS_P (t))
{ {
if (TREE_OVERFLOW (t)) if (TREE_OVERFLOW (t))
@ -4439,8 +4439,7 @@ cxx_eval_constant_expression (const constexpr_ctx *ctx, tree t,
} }
/* Avoid excessively long constexpr evaluations. */ /* Avoid excessively long constexpr evaluations. */
if (!location_wrapper_p (t) if (++*ctx->constexpr_ops_count >= constexpr_ops_limit)
&& ++*ctx->constexpr_ops_count >= constexpr_ops_limit)
{ {
if (!ctx->quiet) if (!ctx->quiet)
error_at (cp_expr_loc_or_loc (t, input_location), 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; return t;
} }
constexpr_ctx new_ctx;
tree r = t;
tree_code tcode = TREE_CODE (t); tree_code tcode = TREE_CODE (t);
switch (tcode) 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. */ /* This function does more aggressive folding than fold itself. */
r = build_fold_addr_expr_with_type (op, TREE_TYPE (t)); r = build_fold_addr_expr_with_type (op, TREE_TYPE (t));
if (TREE_CODE (r) == ADDR_EXPR && TREE_OPERAND (r, 0) == oldop) if (TREE_CODE (r) == ADDR_EXPR && TREE_OPERAND (r, 0) == oldop)
return t; {
ggc_free (r);
return t;
}
break; break;
} }
@ -5065,6 +5070,8 @@ cxx_eval_constant_expression (const constexpr_ctx *ctx, tree t,
r = op; r = op;
else if (tcode == UNARY_PLUS_EXPR) else if (tcode == UNARY_PLUS_EXPR)
r = fold_convert (TREE_TYPE (t), op); r = fold_convert (TREE_TYPE (t), op);
else if (VOID_TYPE_P (type))
r = void_node;
else else
r = fold_build1 (tcode, type, op); r = fold_build1 (tcode, type, op);