aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2014-11-26 13:20:18 -0500
committerJason Merrill <jason@gcc.gnu.org>2014-11-26 13:20:18 -0500
commitcabaf50ac511cdedd2710faf87c126996483c3e5 (patch)
treec3737897fd5b3f665b18c4e29372e8d35f6ea1df /gcc
parentc06dcc4734ffbc3c761595eba14b71bbce888eb1 (diff)
downloadgcc-cabaf50ac511cdedd2710faf87c126996483c3e5.zip
gcc-cabaf50ac511cdedd2710faf87c126996483c3e5.tar.gz
gcc-cabaf50ac511cdedd2710faf87c126996483c3e5.tar.bz2
constexpr.c (cxx_eval_constant_expression): Avoid multiple evaluation.
* constexpr.c (cxx_eval_constant_expression) [SAVE_EXPR]: Avoid multiple evaluation. From-SVN: r218093
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog3
-rw-r--r--gcc/cp/constexpr.c13
2 files changed, 15 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index e961169..32092c4 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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.
diff --git a/gcc/cp/constexpr.c b/gcc/cp/constexpr.c
index 111ea5b..ef9ef70 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),