[Bug c++/71537] GCC rejects consetxpr boolean conversions and comparisons on the result of pointer arithmetic.

msebor at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Tue Jun 14 23:27:00 GMT 2016


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71537

Martin Sebor <msebor at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Keywords|                            |rejects-valid
             Status|UNCONFIRMED                 |NEW
   Last reconfirmed|                            |2016-06-14
                 CC|                            |jakub at gcc dot gnu.org,
                   |                            |msebor at gcc dot gnu.org
             Blocks|                            |55004
     Ever confirmed|0                           |1
      Known to fail|                            |4.9.3, 5.3.0, 6.1.0, 7.0

--- Comment #1 from Martin Sebor <msebor at gcc dot gnu.org> ---
Confirmed, though only the xxx initialization is rejected with GCC 5 and later,
the array case works (4.9.3 rejects both xx and xxx).  It looks like the
fold_comparison function that handles these operations for arrays isn't
prepared to do the same for a string literal.  Below is the test with the
failing case simplified to converting a POINTER_PLUS expression directly to
bool.  (The -Waddress warning should probably get its own bug.)

I CC Jakub who has been making improvements in this area lately (bug 71448 and
bug 67376 before it).

$ cat t.C && /home/msebor/build/gcc-trunk-svn/gcc/xgcc -B
/home/msebor/build/gcc-trunk-svn/gcc -Wall -Wextra -Wpedantic t.C
constexpr int n[42] = {1};
constexpr int x = n ? 1 : 0;           // Accepted
constexpr int xx = n + 1 ? 1 : 0;      // Accepted 
constexpr int xxx = "abc" + 1 ? 1 : 0; // Rejected

constexpr bool b = "abc" + 1;          // Rejected (#2)
t.C:2:27: warning: the address of ‘n’ will always evaluate as ‘true’
[-Waddress]
 constexpr int x = n ? 1 : 0; // Accepted.
                           ^
t.C:4:37: error: ‘((((const char*)"abc") + 1u) != 0u)’ is not a constant
expression
 constexpr int xxx = "abc" + 1 ? 1 : 0; // Rejected
                                     ^
t.C:6:28: error: ‘((((const char*)"abc") + 1u) != 0u)’ is not a constant
expression
 constexpr bool b = "abc" + 1;          // Rejected (#2)
                            ^


Referenced Bugs:

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=55004
[Bug 55004] [meta-bug] constexpr issues


More information about the Gcc-bugs mailing list