From 0f57194bfccc05e07b48e8ccd60d3653c6d65c9a Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Tue, 6 Dec 2016 10:24:36 +0100 Subject: [PATCH] re PR c++/71537 (GCC rejects consetxpr boolean conversions and comparisons on the result of pointer arithmetic.) PR c++/71537 * fold-const.c (fold_comparison): Assume CONSTANT_CLASS_P (base0) plus offset is non-zero. For maybe_nonzero_address decl base0, require indirect_base0. * g++.dg/cpp0x/constexpr-71537.C: New test. From-SVN: r243286 --- gcc/ChangeLog | 5 +++++ gcc/fold-const.c | 18 ++++++++++-------- gcc/testsuite/ChangeLog | 3 +++ gcc/testsuite/g++.dg/cpp0x/constexpr-71537.C | 18 ++++++++++++++++++ 4 files changed, 36 insertions(+), 8 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp0x/constexpr-71537.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 9ed8f5f8295..aef86e3566c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,10 @@ 2016-12-06 Jakub Jelinek + PR c++/71537 + * fold-const.c (fold_comparison): Assume CONSTANT_CLASS_P (base0) + plus offset is non-zero. For maybe_nonzero_address decl base0, + require indirect_base0. + PR c++/71537 * fold-const-call.c (fold_const_call_1): Remove memchr handling here. (fold_const_call) 0 - /* Avoid folding references to struct members at offset 0 to - prevent tests like '&ptr->firstmember == 0' from getting - eliminated. When ptr is null, although the -> expression - is strictly speaking invalid, GCC retains it as a matter - of QoI. See PR c/44555. */ - && (offset0 == NULL_TREE && bitpos0 != 0) + else if (((DECL_P (base0) + && maybe_nonzero_address (base0) > 0 + /* Avoid folding references to struct members at offset 0 to + prevent tests like '&ptr->firstmember == 0' from getting + eliminated. When ptr is null, although the -> expression + is strictly speaking invalid, GCC retains it as a matter + of QoI. See PR c/44555. */ + && (offset0 == NULL_TREE && bitpos0 != 0)) + || CONSTANT_CLASS_P (base0)) + && indirect_base0 /* The caller guarantees that when one of the arguments is constant (i.e., null in this case) it is second. */ && integer_zerop (arg1)) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index b44993b956b..7aa429fca28 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2016-12-06 Jakub Jelinek + PR c++/71537 + * g++.dg/cpp0x/constexpr-71537.C: New test. + PR c++/71537 * g++.dg/cpp0x/constexpr-memchr.C: New test. diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-71537.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-71537.C new file mode 100644 index 00000000000..3d5ac349225 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-71537.C @@ -0,0 +1,18 @@ +// PR c++/71537 +// { dg-do compile { target c++11 } } + +constexpr int n[42] = {1}; +constexpr int x1 = n ? 1 : 0; +constexpr int x2 = n + 1 ? 1 : 0; +constexpr int x3 = "abc" ? 1 : 0; +constexpr int x4 = "abc" + 1 ? 1 : 0; +constexpr bool x5 = "abc" + 1; +constexpr bool x6 = "abc" + 4; +constexpr bool x7 = n + 42; +static_assert (x1 == 1, ""); +static_assert (x2 == 1, ""); +static_assert (x3 == 1, ""); +static_assert (x4 == 1, ""); +static_assert (x5, ""); +static_assert (x6, ""); +static_assert (x7, ""); -- 2.30.2