diff options
author | Jakub Jelinek <jakub@redhat.com> | 2016-12-06 10:24:36 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2016-12-06 10:24:36 +0100 |
commit | 0f57194bfccc05e07b48e8ccd60d3653c6d65c9a (patch) | |
tree | 0be8f1ad83787cea9053f376cd058a980b2a2abe /gcc/fold-const.c | |
parent | 66972191ee05c5dd2d02e5d062fe1c942e42fcd7 (diff) | |
download | gcc-0f57194bfccc05e07b48e8ccd60d3653c6d65c9a.zip gcc-0f57194bfccc05e07b48e8ccd60d3653c6d65c9a.tar.gz gcc-0f57194bfccc05e07b48e8ccd60d3653c6d65c9a.tar.bz2 |
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
Diffstat (limited to 'gcc/fold-const.c')
-rw-r--r-- | gcc/fold-const.c | 18 |
1 files changed, 10 insertions, 8 deletions
diff --git a/gcc/fold-const.c b/gcc/fold-const.c index 6517188..c649e54 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -8419,14 +8419,16 @@ fold_comparison (location_t loc, enum tree_code code, tree type, below follow the C++ rules with the additional property that every object pointer compares greater than a null pointer. */ - 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) + 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)) |