From: Jason Merrill Date: Wed, 26 Nov 2014 18:20:18 +0000 (-0500) Subject: constexpr.c (cxx_eval_constant_expression): Avoid multiple evaluation. X-Git-Tag: releases/gcc-5.1.0~2798 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=cabaf50ac511cdedd2710faf87c126996483c3e5;p=thirdparty%2Fgcc.git constexpr.c (cxx_eval_constant_expression): Avoid multiple evaluation. * constexpr.c (cxx_eval_constant_expression) [SAVE_EXPR]: Avoid multiple evaluation. From-SVN: r218093 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index e961169fea33..32092c418a15 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 111ea5b1a010..ef9ef70d6e0b 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),