aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarek Polacek <polacek@redhat.com>2019-09-10 21:04:33 +0000
committerMarek Polacek <mpolacek@gcc.gnu.org>2019-09-10 21:04:33 +0000
commitd85569f63db86e656ecb79b81c74a906f27bf509 (patch)
tree78333e30ba6ed1884216dfdc8eb442aad4b91bdf
parentefc864927f57fa1a4aa8d1f22e4071343f0b8cbb (diff)
downloadgcc-d85569f63db86e656ecb79b81c74a906f27bf509.zip
gcc-d85569f63db86e656ecb79b81c74a906f27bf509.tar.gz
gcc-d85569f63db86e656ecb79b81c74a906f27bf509.tar.bz2
PR c++/91705 - constexpr evaluation rejects ++/-- on floats.
* constexpr.c (cxx_eval_increment_expression): Call fold_simple on the offset. * g++.dg/cpp1y/constexpr-incr2.C: New test. From-SVN: r275613
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/constexpr.c4
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/cpp1y/constexpr-incr2.C66
4 files changed, 81 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 2c48829..15b1fbf 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2019-09-10 Marek Polacek <polacek@redhat.com>
+
+ PR c++/91705 - constexpr evaluation rejects ++/-- on floats.
+ * constexpr.c (cxx_eval_increment_expression): Call fold_simple on
+ the offset.
+
2019-09-10 Paolo Carlini <paolo.carlini@oracle.com>
* decl.c (has_designator_problem): Use cp_expr_loc_or_input_loc
diff --git a/gcc/cp/constexpr.c b/gcc/cp/constexpr.c
index 6c547d6..58db691 100644
--- a/gcc/cp/constexpr.c
+++ b/gcc/cp/constexpr.c
@@ -4164,6 +4164,10 @@ cxx_eval_increment_expression (const constexpr_ctx *ctx, tree t,
tree offset = TREE_OPERAND (t, 1);
gcc_assert (TREE_CONSTANT (offset));
+ /* OFFSET is constant, but perhaps not constant enough. We need to
+ e.g. bash FLOAT_EXPRs to REAL_CSTs. */
+ offset = fold_simple (offset);
+
/* The operand as an lvalue. */
op = cxx_eval_constant_expression (ctx, op, true,
non_constant_p, overflow_p);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index c8779bb..464765d 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2019-09-10 Marek Polacek <polacek@redhat.com>
+
+ PR c++/91705 - constexpr evaluation rejects ++/-- on floats.
+ * g++.dg/cpp1y/constexpr-incr2.C: New test.
+
2019-09-10 David Edelsohn <dje.gcc@gmail.com>
* gfortran.dg/default_format_1.f90: Remove XFAIL AIX.
diff --git a/gcc/testsuite/g++.dg/cpp1y/constexpr-incr2.C b/gcc/testsuite/g++.dg/cpp1y/constexpr-incr2.C
new file mode 100644
index 0000000..0d22851
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp1y/constexpr-incr2.C
@@ -0,0 +1,66 @@
+// PR c++/91705 - constexpr evaluation rejects ++/-- on floats.
+// { dg-do compile { target c++14 } }
+
+#define SA(X) static_assert((X),#X)
+
+template <class T>
+constexpr T fn1(T t)
+{
+ return ++t;
+}
+
+constexpr float fn2(float t)
+{
+ return ++t;
+}
+
+template <class T>
+constexpr T fn3(T t)
+{
+ return --t;
+}
+
+constexpr float fn4(float t)
+{
+ return --t;
+}
+
+template <class T>
+constexpr T fn5(T t)
+{
+ return t++;
+}
+
+constexpr float fn6(float t)
+{
+ return t++;
+}
+
+template <class T>
+constexpr T fn7(T t)
+{
+ return t--;
+}
+
+constexpr float fn8(float t)
+{
+ return t--;
+}
+
+constexpr double r1 = fn1(2.0f);
+SA(r1 == 3);
+constexpr double r2 = fn2(2.0f);
+SA(r2 == 3);
+constexpr double r3 = fn3(2.0f);
+SA(r3 == 1);
+constexpr double r4 = fn4(2.0f);
+SA(r4 == 1);
+
+constexpr double r5 = fn5(2.0f);
+SA(r5 == 2);
+constexpr double r6 = fn6(2.0f);
+SA(r6 == 2);
+constexpr double r7 = fn7(2.0f);
+SA(r7 == 2);
+constexpr double r8 = fn8(2.0f);
+SA(r8 == 2);