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
This commit is contained in:
parent
cafc9af2ea
commit
ac2f8d26b5
3 changed files with 25 additions and 3 deletions
|
@ -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.
|
||||
|
|
|
@ -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. */
|
||||
|
|
|
@ -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]);
|
||||
|
|
Loading…
Add table
Reference in a new issue