mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-03-22 00:01:10 +08:00
re PR c++/51489 (constexpr not working consistently)
PR c++/51489 * constexpr.c (cxx_eval_binary_expression): Don't VERIFY_CONSTANT the operands. From-SVN: r233878
This commit is contained in:
parent
7f0e23e931
commit
c8a66fc97b
@ -1,5 +1,9 @@
|
||||
2016-03-01 Jason Merrill <jason@redhat.com>
|
||||
|
||||
PR c++/51489
|
||||
* constexpr.c (cxx_eval_binary_expression): Don't VERIFY_CONSTANT
|
||||
the operands.
|
||||
|
||||
PR c++/69995
|
||||
* constexpr.c (cxx_eval_call_expression): Unshare arg.
|
||||
(cxx_eval_constant_expression) [DECL_EXPR]: Unshare init.
|
||||
|
@ -1612,15 +1612,14 @@ cxx_eval_binary_expression (const constexpr_ctx *ctx, tree t,
|
||||
tree lhs, rhs;
|
||||
lhs = cxx_eval_constant_expression (ctx, orig_lhs, /*lval*/false,
|
||||
non_constant_p, overflow_p);
|
||||
/* Don't VERIFY_CONSTANT if this might be dealing with a pointer to
|
||||
a local array in a constexpr function. */
|
||||
bool ptr = POINTER_TYPE_P (TREE_TYPE (lhs));
|
||||
if (!ptr)
|
||||
VERIFY_CONSTANT (lhs);
|
||||
/* Don't VERIFY_CONSTANT here, it's unnecessary and will break pointer
|
||||
subtraction. */
|
||||
if (*non_constant_p)
|
||||
return t;
|
||||
rhs = cxx_eval_constant_expression (ctx, orig_rhs, /*lval*/false,
|
||||
non_constant_p, overflow_p);
|
||||
if (!ptr)
|
||||
VERIFY_CONSTANT (rhs);
|
||||
if (*non_constant_p)
|
||||
return t;
|
||||
|
||||
location_t loc = EXPR_LOCATION (t);
|
||||
enum tree_code code = TREE_CODE (t);
|
||||
@ -1653,6 +1652,9 @@ cxx_eval_binary_expression (const constexpr_ctx *ctx, tree t,
|
||||
}
|
||||
else if (cxx_eval_check_shift_p (loc, ctx, code, type, lhs, rhs))
|
||||
*non_constant_p = true;
|
||||
/* Don't VERIFY_CONSTANT if this might be dealing with a pointer to
|
||||
a local array in a constexpr function. */
|
||||
bool ptr = POINTER_TYPE_P (TREE_TYPE (lhs));
|
||||
if (!ptr)
|
||||
VERIFY_CONSTANT (r);
|
||||
return r;
|
||||
|
12
gcc/testsuite/g++.dg/cpp1y/constexpr-array4.C
Normal file
12
gcc/testsuite/g++.dg/cpp1y/constexpr-array4.C
Normal file
@ -0,0 +1,12 @@
|
||||
// { dg-do compile { target c++14 } }
|
||||
|
||||
constexpr bool g()
|
||||
{
|
||||
int ar[4] = { 1, 2, 3, 4 };
|
||||
auto e1 = ar;
|
||||
auto e4 = ar+3;
|
||||
return (e4-e1) == 3;
|
||||
}
|
||||
|
||||
#define SA(X) static_assert((X),#X)
|
||||
SA(g());
|
Loading…
x
Reference in New Issue
Block a user