On 10/31/25 11:09, Jonathan Wakely wrote:
On Fri, 31 Oct 2025 at 08:23, Luc Grosheintz wrote:

These three changes are needed to make <mdspan> compatible with Clang:

   - the type alias _Storage must occur before its first use.

   - the friend declarations of function must match exactly, including
   noexcept and constexpr.

Clang is correct here, GCC has a bug where it doesn't check the
declarations match.


   - the 'template' in typename T::template type<double>.

I think Clang is correct here too.

I'll apply this for you, thanks.

Thank you! Please let me know if you'd like me to search bugzilla
to check if these are already known (and report them on the off
chance they're not).




libstdc++-v3/ChangeLog:

         * include/std/mdspan (extents::_Storage): Move type alias before
         its first use.
         (__mdspan::__static_extents): Add missing noexcept and constexpr
         to friend declaration in extents.
         (__mdspan::__dynamic_extents): Ditto.

Signed-off-by: Luc Grosheintz <[email protected]>
---
  libstdc++-v3/include/std/mdspan | 22 ++++++++++++----------
  1 file changed, 12 insertions(+), 10 deletions(-)

diff --git a/libstdc++-v3/include/std/mdspan b/libstdc++-v3/include/std/mdspan
index d555b7f2580..bd7a2a201a7 100644
--- a/libstdc++-v3/include/std/mdspan
+++ b/libstdc++-v3/include/std/mdspan
@@ -378,6 +378,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
        static_assert(
           (__mdspan::__valid_static_extent<_Extents, _IndexType> && ...),
           "Extents must either be dynamic or representable as IndexType");
+
+      using _Storage = __mdspan::_ExtentsStorage<
+       _IndexType, array<size_t, sizeof...(_Extents)>{_Extents...}>;
+      [[no_unique_address]] _Storage _M_exts;
+
      public:
        using index_type = _IndexType;
        using size_type = make_unsigned_t<index_type>;
@@ -487,15 +492,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
         }

      private:
-      friend const array<size_t, rank()>&
-      __mdspan::__static_extents<extents>();
+      friend constexpr const array<size_t, rank()>&
+      __mdspan::__static_extents<extents>() noexcept;

-      friend span<const index_type>
-      __mdspan::__dynamic_extents<extents>(const extents&, size_t, size_t);
-
-      using _Storage = __mdspan::_ExtentsStorage<
-       _IndexType, array<size_t, sizeof...(_Extents)>{_Extents...}>;
-      [[no_unique_address]] _Storage _M_exts;
+      friend constexpr span<const index_type>
+      __mdspan::__dynamic_extents<extents>(const extents&, size_t, size_t)
+      noexcept;

        template<typename _OIndexType, size_t... _OExtents>
         friend class extents;
@@ -1637,8 +1639,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION

         template<typename _OExtents>
           constexpr explicit
-         _PaddedStorage(const typename _LayoutSame::mapping<_OExtents>&
-                        __other)
+         _PaddedStorage(
+             const typename _LayoutSame::template mapping<_OExtents>& __other)
           : _PaddedStorage(_Extents(__other.extents()))
           {
             constexpr size_t __stride_idx = _LayoutTraits::_S_stride_idx;
--
2.51.1



Reply via email to