From: Jason Merrill Date: Wed, 2 Mar 2016 02:32:44 +0000 (-0500) Subject: re PR c++/51489 (constexpr not working consistently) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=c8a66fc97b4c4167bfc71a5017d61e7ed51d4177;p=gcc.git 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 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 3a24cc9392b..e8be35d1a73 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 2016-03-01 Jason Merrill + 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. diff --git a/gcc/cp/constexpr.c b/gcc/cp/constexpr.c index a21997ab97a..bcb129f22c4 100644 --- a/gcc/cp/constexpr.c +++ b/gcc/cp/constexpr.c @@ -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; diff --git a/gcc/testsuite/g++.dg/cpp1y/constexpr-array4.C b/gcc/testsuite/g++.dg/cpp1y/constexpr-array4.C new file mode 100644 index 00000000000..fc010470359 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1y/constexpr-array4.C @@ -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());