constexpr.c (cxx_eval_constant_expression): Avoid multiple evaluation.

* constexpr.c (cxx_eval_constant_expression) [SAVE_EXPR]: Avoid
	multiple evaluation.

From-SVN: r218093
This commit is contained in:
Jason Merrill 2014-11-26 13:20:18 -05:00 committed by Jason Merrill
parent c06dcc4734
commit cabaf50ac5
2 changed files with 15 additions and 1 deletions

View File

@ -1,5 +1,8 @@
2014-11-26 Jason Merrill <jason@redhat.com>
* constexpr.c (cxx_eval_constant_expression) [SAVE_EXPR]: Avoid
multiple evaluation.
* constexpr.c (cxx_eval_call_expression): Don't talk about
flowing off the end if we're already non-constant.

View File

@ -2974,11 +2974,22 @@ cxx_eval_constant_expression (const constexpr_ctx *ctx, tree t,
*jump_target = t;
break;
case SAVE_EXPR:
/* Avoid evaluating a SAVE_EXPR more than once. */
if (tree *p = ctx->values->get (t))
r = *p;
else
{
r = cxx_eval_constant_expression (ctx, TREE_OPERAND (t, 0), addr,
non_constant_p, overflow_p);
ctx->values->put (t, r);
}
break;
case NON_LVALUE_EXPR:
case TRY_CATCH_EXPR:
case CLEANUP_POINT_EXPR:
case MUST_NOT_THROW_EXPR:
case SAVE_EXPR:
case EXPR_STMT:
case EH_SPEC_BLOCK:
r = cxx_eval_constant_expression (ctx, TREE_OPERAND (t, 0),