Tested x86_64-linux. Pushed to trunk. -- >8 --
When I refactored the __array_traits helper I broke this. libstdc++-v3/ChangeLog: PR libstdc++/108258 * include/std/array (__array_traits<T, 0>::operator T*()): Add constexpr. * testsuite/23_containers/array/element_access/constexpr_c++17.cc: Check std::array<T, 0>::data(). --- libstdc++-v3/include/std/array | 2 +- .../array/element_access/constexpr_c++17.cc | 19 ++++++++++++++++--- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/libstdc++-v3/include/std/array b/libstdc++-v3/include/std/array index e26390e6f80..c50a201b032 100644 --- a/libstdc++-v3/include/std/array +++ b/libstdc++-v3/include/std/array @@ -69,7 +69,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION // Conversion to a pointer produces a null pointer. __attribute__((__always_inline__)) - operator _Tp*() const noexcept { return nullptr; } + constexpr operator _Tp*() const noexcept { return nullptr; } }; using _Is_swappable = true_type; diff --git a/libstdc++-v3/testsuite/23_containers/array/element_access/constexpr_c++17.cc b/libstdc++-v3/testsuite/23_containers/array/element_access/constexpr_c++17.cc index b6878fd0c59..b92aa5c04e2 100644 --- a/libstdc++-v3/testsuite/23_containers/array/element_access/constexpr_c++17.cc +++ b/libstdc++-v3/testsuite/23_containers/array/element_access/constexpr_c++17.cc @@ -34,21 +34,34 @@ constexpr std::size_t test01() auto v2 = a.at(2); auto v3 = a.front(); auto v4 = a.back(); - return v1 + v2 + v3 + v4; + auto v5 = *a.data(); + return v1 + v2 + v3 + v4 + v5; } static_assert( test01() == (55 + 66 + 0 + 2) ); constexpr std::size_t test02() { - // array + // const array typedef std::array<std::size_t, 6> array_type; const array_type a = { { 0, 55, 66, 99, 4115, 2 } }; auto v1 = a[1]; auto v2 = a.at(2); auto v3 = a.front(); auto v4 = a.back(); - return v1 + v2 + v3 + v4; + auto v5 = *a.data(); + return v1 + v2 + v3 + v4 + v5; } static_assert( test02() == (55 + 66 + 0 + 2) ); + +constexpr bool test_zero() +{ + // zero-sized array (PR libstdc++/108258) + std::array<int, 0> a{}; + auto v4 = a.data(); + // The standard says this is unspecified, it's null for our implementation: + return a.data() == nullptr; +} + +static_assert( test_zero() ); -- 2.39.0