aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2014-11-18 16:14:49 -0500
committerJason Merrill <jason@gcc.gnu.org>2014-11-18 16:14:49 -0500
commitf899317ec285f038d1cd3a17e46b0639e7340af4 (patch)
tree32053be0975646ad372a1ec3fc94a0c44bcf9407
parent2bf86c845a89fce00ccb219adbf6002443b5b1cb (diff)
downloadgcc-f899317ec285f038d1cd3a17e46b0639e7340af4.zip
gcc-f899317ec285f038d1cd3a17e46b0639e7340af4.tar.gz
gcc-f899317ec285f038d1cd3a17e46b0639e7340af4.tar.bz2
re PR c++/63940 (C++ constexpr errors on AIX)
PR c++/63940 * constexpr.c (cxx_eval_binary_expression): Don't assume the expression was already folded. (cxx_eval_unary_expression): Likewise. From-SVN: r217738
-rw-r--r--gcc/cp/ChangeLog7
-rw-r--r--gcc/cp/constexpr.c29
2 files changed, 30 insertions, 6 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 2e18932..0759a57 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,10 @@
+2014-11-18 Jason Merrill <jason@redhat.com>
+
+ PR c++/63940
+ * constexpr.c (cxx_eval_binary_expression): Don't assume the
+ expression was already folded.
+ (cxx_eval_unary_expression): Likewise.
+
2014-11-18 Marc Glisse <marc.glisse@inria.fr>
PR libstdc++/43622
diff --git a/gcc/cp/constexpr.c b/gcc/cp/constexpr.c
index 5abea14..517bf23 100644
--- a/gcc/cp/constexpr.c
+++ b/gcc/cp/constexpr.c
@@ -1461,9 +1461,17 @@ cxx_eval_unary_expression (const constexpr_ctx *ctx, tree t,
addr, non_constant_p, overflow_p,
NULL);
VERIFY_CONSTANT (arg);
- if (arg == orig_arg)
- return t;
- r = fold_build1 (TREE_CODE (t), TREE_TYPE (t), arg);
+ location_t loc = EXPR_LOCATION (t);
+ enum tree_code code = TREE_CODE (t);
+ tree type = TREE_TYPE (t);
+ r = fold_unary_loc (loc, code, type, arg);
+ if (r == NULL_TREE)
+ {
+ if (arg == orig_arg)
+ r = t;
+ else
+ r = build1_loc (loc, code, type, arg);
+ }
VERIFY_CONSTANT (r);
return r;
}
@@ -1488,9 +1496,18 @@ cxx_eval_binary_expression (const constexpr_ctx *ctx, tree t,
allow_non_constant, addr,
non_constant_p, overflow_p, NULL);
VERIFY_CONSTANT (rhs);
- if (lhs == orig_lhs && rhs == orig_rhs)
- return t;
- r = fold_build2 (TREE_CODE (t), TREE_TYPE (t), lhs, rhs);
+
+ location_t loc = EXPR_LOCATION (t);
+ enum tree_code code = TREE_CODE (t);
+ tree type = TREE_TYPE (t);
+ r = fold_binary_loc (loc, code, type, lhs, rhs);
+ if (r == NULL_TREE)
+ {
+ if (lhs == orig_lhs && rhs == orig_rhs)
+ r = t;
+ else
+ r = build2_loc (loc, code, type, lhs, rhs);
+ }
VERIFY_CONSTANT (r);
return r;
}