From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2181) id 10F363858D1E; Wed, 4 Jan 2023 11:54:23 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 10F363858D1E DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1672833263; bh=3CU1GBhfJ7leKrRX2qQRNwxrU5wAiygAuSbS27Z920w=; h=From:To:Subject:Date:From; b=VqDKCewOHKFFBBIXmw7MnjPRzVgVX0yLo1sohUModxRhYhaaGGIkX6JWbkx4j1nBe G76d8dizgEb8XxHQpAKwNNmYNsYinFVRSxyUUISHEBrmG6yTDtlGCimPN54zHIaSix 4Vi8cwHyqcshg3mjCF5fmAC/DWCMysbDLsjaNSzE= MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: Jonathan Wakely To: gcc-cvs@gcc.gnu.org, libstdc++-cvs@gcc.gnu.org Subject: [gcc r13-4991] libstdc++: Fix std::array::data() to be a constant expression [PR108258] X-Act-Checkin: gcc X-Git-Author: Jonathan Wakely X-Git-Refname: refs/heads/master X-Git-Oldrev: ebc449119442501c927ede0e83697eaece72223e X-Git-Newrev: 1530a9b1f45a7ceb333f3e1abad65e587679690f Message-Id: <20230104115423.10F363858D1E@sourceware.org> Date: Wed, 4 Jan 2023 11:54:23 +0000 (GMT) List-Id: https://gcc.gnu.org/g:1530a9b1f45a7ceb333f3e1abad65e587679690f commit r13-4991-g1530a9b1f45a7ceb333f3e1abad65e587679690f Author: Jonathan Wakely Date: Wed Jan 4 11:49:19 2023 +0000 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: --- 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 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() );