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.


>
> 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