From cabaf50ac511cdedd2710faf87c126996483c3e5 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Wed, 26 Nov 2014 13:20:18 -0500 Subject: [PATCH] constexpr.c (cxx_eval_constant_expression): Avoid multiple evaluation. * constexpr.c (cxx_eval_constant_expression) [SAVE_EXPR]: Avoid multiple evaluation. From-SVN: r218093 --- gcc/cp/ChangeLog | 3 +++ gcc/cp/constexpr.c | 13 ++++++++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index e961169fea3..32092c418a1 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,8 @@ 2014-11-26 Jason Merrill + * 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. diff --git a/gcc/cp/constexpr.c b/gcc/cp/constexpr.c index 111ea5b1a01..ef9ef70d6e0 100644 --- a/gcc/cp/constexpr.c +++ b/gcc/cp/constexpr.c @@ -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), -- 2.30.2