re PR c++/63925 (ICE with C++14 constexpr when trying to constexprify std::min)
authorJason Merrill <jason@redhat.com>
Tue, 18 Nov 2014 19:09:55 +0000 (14:09 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Tue, 18 Nov 2014 19:09:55 +0000 (14:09 -0500)
PR c++/63925
* constexpr.c (cxx_eval_increment_expression): Use POINTER_PLUS_EXPR.

From-SVN: r217731

gcc/cp/ChangeLog
gcc/cp/constexpr.c
gcc/testsuite/g++.dg/cpp1y/constexpr-incr1.C

index 28d8796842d6e52ef55a7c73532625a82ae14ac9..0628b4221d9adb92db468310c9fa2909f8ee521f 100644 (file)
@@ -1,5 +1,8 @@
 2014-11-18  Jason Merrill  <jason@redhat.com>
 
+       PR c++/63925
+       * constexpr.c (cxx_eval_increment_expression): Use POINTER_PLUS_EXPR.
+
        PR c++/63934
        * constexpr.c (cxx_eval_call_expression): Check DECL_CONSTRUCTOR_P
        rather than VOID_TYPE_P.
index 4325caa0672d5eac7535724dba0b7b7795b5c6f8..5abea14ae393b319e8024f0a26b1b770ff9d008c 100644 (file)
@@ -2566,8 +2566,17 @@ cxx_eval_increment_expression (const constexpr_ctx *ctx, tree t,
 
   /* The modified value.  */
   bool inc = (code == PREINCREMENT_EXPR || code == POSTINCREMENT_EXPR);
-  tree mod = fold_build2 (inc ? PLUS_EXPR : MINUS_EXPR,
-                         type, val, offset);
+  tree mod;
+  if (POINTER_TYPE_P (type))
+    {
+      /* The middle end requires pointers to use POINTER_PLUS_EXPR.  */
+      offset = convert_to_ptrofftype (offset);
+      if (!inc)
+       offset = fold_build1 (NEGATE_EXPR, TREE_TYPE (offset), offset);
+      mod = fold_build2 (POINTER_PLUS_EXPR, type, val, offset);
+    }
+  else
+    mod = fold_build2 (inc ? PLUS_EXPR : MINUS_EXPR, type, val, offset);
   VERIFY_CONSTANT (mod);
 
   /* Storing the modified value.  */
index 2b099c821e0bb4fc027c2eb6d608c903d1edf72c..ecd7c047c851c43d0d260163808d5f8f54ed9e8f 100644 (file)
@@ -1,4 +1,5 @@
 // { dg-do compile { target c++14 } }
+#define SA(X) static_assert((X),#X)
 
 constexpr int f (int i)
 {
@@ -8,6 +9,15 @@ constexpr int f (int i)
   return x;
 }
 
+constexpr int* g (int* p)
+{
+  ++p;
+  return p;
+}
+
 constexpr int i = f(42);
-#define SA(X) static_assert((X),#X)
 SA(i==44);
+
+int array[4];
+constexpr int* p = g(array);
+SA(p == &array[1]);