diff options
author | Jason Merrill <jason@redhat.com> | 2014-11-26 13:20:18 -0500 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2014-11-26 13:20:18 -0500 |
commit | cabaf50ac511cdedd2710faf87c126996483c3e5 (patch) | |
tree | c3737897fd5b3f665b18c4e29372e8d35f6ea1df | |
parent | c06dcc4734ffbc3c761595eba14b71bbce888eb1 (diff) | |
download | gcc-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
-rw-r--r-- | gcc/cp/ChangeLog | 3 | ||||
-rw-r--r-- | gcc/cp/constexpr.c | 13 |
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), |