On 9/5/25 19:58, Jonathan Wakely wrote:
On Fri, 5 Sept 2025 at 16:26, Jonathan Wakely <jwak...@redhat.com> wrote:

On Thu, 4 Sept 2025 at 13:22, Luc Grosheintz <luc.groshei...@gmail.com> wrote:

A usecase for P2781R9 is more ergonomic creation of span and mdspan with
mixed static and dynamic extents, e.g.:

     span(ptr, cw<3>)
     extents(cw<3>, 5, cw<7>)
     mdspan(ptr, cw<3>, 5, cw<7>)

should be deduced as:
     span<..., 3>
     extents<..., 3, dyn, 7>
     mdspan<..., extents<..., 3, dyn, 7>>

The change required is to strip cv-qualifiers and references from
`_Tp::value`, because of:

     template<_CwFixedValue _X, typename>
       struct constant_wrapper : _CwOperators
       {
         static constexpr const auto& value = _X._M_data;

libstdc++-v3/ChangeLog:

         * include/std/span (__integral_constant_like): Allow the member
         `value` of a constant wrapping type to be a const reference of
         an integer.
         * testsuite/23_containers/mdspan/extents/misc.cc: Add test for
         cw and constant_wrapper.
         * testsuite/23_containers/mdspan/mdspan.cc: Ditto.
         * testsuite/23_containers/span/deduction.cc: Ditto.

Signed-off-by: Luc Grosheintz <luc.groshei...@gmail.com>
---
  libstdc++-v3/include/std/span                 |  3 ++-
  .../23_containers/mdspan/extents/misc.cc      | 22 +++++++++++++-----
  .../testsuite/23_containers/mdspan/mdspan.cc  | 23 +++++++++++++------
  .../testsuite/23_containers/span/deduction.cc | 20 +++++++++++++++-
  4 files changed, 53 insertions(+), 15 deletions(-)

diff --git a/libstdc++-v3/include/std/span b/libstdc++-v3/include/std/span
index 44f9b36a7ef..f9aa3c77e8e 100644
--- a/libstdc++-v3/include/std/span
+++ b/libstdc++-v3/include/std/span
@@ -480,7 +480,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
    namespace __detail
    {
      template<typename _Tp>
-      concept __integral_constant_like = is_integral_v<decltype(_Tp::value)>
+      concept __integral_constant_like =
+       is_integral_v<remove_cvref_t<decltype(_Tp::value)>>
         && !is_same_v<bool, remove_const_t<decltype(_Tp::value)>>

We also need remove_cvref_t on this line for the not-bool check, so
that constant_wrapper<bool&> doesn't match here, but I haven't opened
an LWG issue about that yet, so we can fix that later.

I've created https://cplusplus.github.io/LWG/issue4351 now.


Here's a patch to apply the change:
https://gcc.gnu.org/pipermail/libstdc++/2025-September/063315.html

if you prefer to squash it into this commit, let me know.

Reply via email to