From: Jonathan Wakely Date: Wed, 4 Jan 2023 11:49:19 +0000 (+0000) Subject: libstdc++: Fix std::array::data() to be a constant expression [PR108258] X-Git-Tag: basepoints/gcc-14~2216 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1530a9b1f45a7ceb333f3e1abad65e587679690f;p=thirdparty%2Fgcc.git libstdc++: Fix std::array::data() to be a constant expression [PR108258] When I refactored the __array_traits helper I broke this. libstdc++-v3/ChangeLog: PR libstdc++/108258 * include/std/array (__array_traits::operator T*()): Add constexpr. * testsuite/23_containers/array/element_access/constexpr_c++17.cc: Check std::array::data(). --- diff --git a/libstdc++-v3/include/std/array b/libstdc++-v3/include/std/array index e26390e6f805..c50a201b0325 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 b6878fd0c59a..b92aa5c04e23 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 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 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() );