From: Jason Merrill Date: Tue, 18 Nov 2014 19:09:55 +0000 (-0500) Subject: re PR c++/63925 (ICE with C++14 constexpr when trying to constexprify std::min) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=ac2f8d26b5a601186735d1341eaec7779e9fa7fe;p=gcc.git re PR c++/63925 (ICE with C++14 constexpr when trying to constexprify std::min) PR c++/63925 * constexpr.c (cxx_eval_increment_expression): Use POINTER_PLUS_EXPR. From-SVN: r217731 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 28d8796842d..0628b4221d9 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,8 @@ 2014-11-18 Jason Merrill + 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. diff --git a/gcc/cp/constexpr.c b/gcc/cp/constexpr.c index 4325caa0672..5abea14ae39 100644 --- a/gcc/cp/constexpr.c +++ b/gcc/cp/constexpr.c @@ -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. */ diff --git a/gcc/testsuite/g++.dg/cpp1y/constexpr-incr1.C b/gcc/testsuite/g++.dg/cpp1y/constexpr-incr1.C index 2b099c821e0..ecd7c047c85 100644 --- a/gcc/testsuite/g++.dg/cpp1y/constexpr-incr1.C +++ b/gcc/testsuite/g++.dg/cpp1y/constexpr-incr1.C @@ -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]);