| // PR c++/67376 - [5/6 regression] Comparison with pointer to past-the-end |
| // of array fails inside constant expression |
| // { dg-do compile { target c++11 } } |
| |
| int a [2]; |
| |
| constexpr const int* pa[] = { |
| a, |
| a + 0, |
| a + 1, |
| a + 2, |
| &a [0], |
| &a [0] + 0, |
| &a [0] + 1, |
| &a [0] + 2, |
| &a [1], |
| &a [1] - 1, |
| &a [1] + 0, |
| &a [1] + 1, |
| &a [2] - 2, |
| &a [2] - 1, |
| &a [2] + 0 |
| }; |
| |
| #define Assert(e) static_assert ((e), #e) |
| |
| Assert (!(a == 0)); |
| Assert (!(a == (int*)0)); |
| Assert (!(a == nullptr)); |
| |
| Assert (a != 0); |
| Assert (a != (int*)0); |
| Assert (a != nullptr); |
| |
| Assert (!(0 == a)); |
| Assert (!((int*)0 == a)); |
| Assert (!(nullptr == a)); |
| |
| Assert (0 != a); |
| Assert ((int*)0 != a); |
| Assert (nullptr != a); |
| |
| bool constexpr test_eq (unsigned inx) |
| { |
| return inx ? pa [inx - 1] == 0 && 0 == pa [inx - 1] |
| && test_eq (inx - 1) : pa [inx] == 0 && 0 == pa [inx]; |
| } |
| |
| Assert (!test_eq (sizeof pa / sizeof *pa)); |
| |
| bool constexpr test_ne (unsigned inx) |
| { |
| return inx ? pa [inx - 1] != 0 && 0 != pa [inx - 1] |
| && test_ne (inx - 1) : pa [inx] != 0 && 0 != pa [inx]; |
| } |
| |
| Assert (test_ne (sizeof pa / sizeof *pa)); |