On Mon, May 26, 2025 at 4:22 PM Luc Grosheintz <luc.groshei...@gmail.com>
wrote:

> [mdspan.layout.left.cons] of N4950 states that this ctor is not
> noexcept. Since, all other ctors of layout_left, layout_right or
> layout_stride are noexcept, the choice was made, based on
> [res.on.exception.handling], to make this ctor noexcept.
>
> Two other major implementations of the STL make the same choice.
>
> libstdc++-v3/ChangeLog:
>
>         * include/std/mdspan: Strengthen the exception
>         guarantees of layout_left::mapping(layout_stride::mapping).
>         * testsuite/23_containers/mdspan/layouts/ctors.cc:
>         Simplify tests to reflect the change.
>
> Signed-off-by: Luc Grosheintz <luc.groshei...@gmail.com>
> ---
>
LGTM.

>  libstdc++-v3/include/std/mdspan               |  6 +++-
>  .../23_containers/mdspan/layouts/ctors.cc     | 33 ++++++++-----------
>  2 files changed, 19 insertions(+), 20 deletions(-)
>
> diff --git a/libstdc++-v3/include/std/mdspan
> b/libstdc++-v3/include/std/mdspan
> index 33ad5070a37..2a7f0452cd7 100644
> --- a/libstdc++-v3/include/std/mdspan
> +++ b/libstdc++-v3/include/std/mdspan
> @@ -561,10 +561,14 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>         : mapping(__other.extents(), __mdspan::__internal_ctor{})
>         { }
>
> +      // [mdspan.layout.left.cons] of N4950 states that this ctor is not
> +      // noexcept. Since, all other ctors of layout_left, layout_right or
> +      // layout_stride are noexcept, the choice was made, based on
> +      // [res.on.exception.handling], to make this ctor noexcept.
>        template<typename _OExtents>
>         requires (is_constructible_v<extents_type, _OExtents>)
>         constexpr explicit(extents_type::rank() > 0)
> -       mapping(const layout_stride::mapping<_OExtents>& __other)
> +       mapping(const layout_stride::mapping<_OExtents>& __other) noexcept
>         : mapping(__other.extents(), __mdspan::__internal_ctor{})
>         { __glibcxx_assert(*this == __other); }
>
> diff --git a/libstdc++-v3/testsuite/23_containers/mdspan/layouts/ctors.cc
> b/libstdc++-v3/testsuite/23_containers/mdspan/layouts/ctors.cc
> index 2507eeaf7a1..6f813e9877b 100644
> --- a/libstdc++-v3/testsuite/23_containers/mdspan/layouts/ctors.cc
> +++ b/libstdc++-v3/testsuite/23_containers/mdspan/layouts/ctors.cc
> @@ -362,30 +362,24 @@ namespace from_stride
>
>    template<typename Layout, typename Extents, typename OExtents>
>      constexpr void
> -    verify_convertible(OExtents oexts)
> +    verify_nothrow_convertible(OExtents oexts)
>      {
>        using Mapping = typename Layout::mapping<Extents>;
>        using OMapping = std::layout_stride::mapping<OExtents>;
>
>        constexpr auto other = OMapping(oexts,
> strides(Mapping(Extents(oexts))));
> -      if constexpr (std::is_same_v<Layout, std::layout_right>)
> -       ::verify_nothrow_convertible<Mapping>(other);
> -      else
> -       ::verify_convertible<Mapping>(other);
> +      ::verify_nothrow_convertible<Mapping>(other);
>      }
>
>    template<typename Layout, typename Extents, typename OExtents>
>      constexpr void
> -    verify_constructible(OExtents oexts)
> +    verify_nothrow_constructible(OExtents oexts)
>      {
>        using Mapping = typename Layout::mapping<Extents>;
>        using OMapping = std::layout_stride::mapping<OExtents>;
>
>        constexpr auto other = OMapping(oexts,
> strides(Mapping(Extents(oexts))));
> -      if constexpr (std::is_same_v<Layout, std::layout_right>)
> -       ::verify_nothrow_constructible<Mapping>(other);
> -      else
> -       ::verify_constructible<Mapping>(other);
> +      ::verify_nothrow_constructible<Mapping>(other);
>      }
>
>    template<typename Layout>
> @@ -404,31 +398,32 @@ namespace from_stride
>         typename Layout::mapping<std::extents<int, 2>>,
>         std::layout_stride::mapping<std::extents<int, 1>>>();
>
> -      verify_convertible<Layout, std::extents<int>>(std::extents<int>{});
> +      verify_nothrow_convertible<Layout, std::extents<int>>(
> +       std::extents<int>{});
>
> -      verify_convertible<Layout, std::extents<unsigned int>>(
> +      verify_nothrow_convertible<Layout, std::extents<unsigned int>>(
>         std::extents<int>{});
>
>        // Rank ==  0 doesn't check IndexType for convertibility.
> -      verify_convertible<Layout, std::extents<int>>(
> +      verify_nothrow_convertible<Layout, std::extents<int>>(
>         std::extents<unsigned int>{});
>
> -      verify_constructible<Layout, std::extents<int, 3>>(
> +      verify_nothrow_constructible<Layout, std::extents<int, 3>>(
>         std::extents<int, 3>{});
>
> -      verify_constructible<Layout, std::extents<unsigned int, 3>>(
> +      verify_nothrow_constructible<Layout, std::extents<unsigned int, 3>>(
>         std::extents<int, 3>{});
>
> -      verify_constructible<Layout, std::extents<int, 3>>(
> +      verify_nothrow_constructible<Layout, std::extents<int, 3>>(
>         std::extents<unsigned int, 3>{});
>
> -      verify_constructible<Layout, std::extents<int, 3, 5>>(
> +      verify_nothrow_constructible<Layout, std::extents<int, 3, 5>>(
>         std::extents<int, 3, 5>{});
>
> -      verify_constructible<Layout, std::extents<unsigned int, 3, 5>>(
> +      verify_nothrow_constructible<Layout, std::extents<unsigned int, 3,
> 5>>(
>         std::extents<int, 3, 5>{});
>
> -      verify_constructible<Layout, std::extents<int, 3, 5>>(
> +      verify_nothrow_constructible<Layout, std::extents<int, 3, 5>>(
>         std::extents<unsigned int, 3, 5>{});
>        return true;
>      }
> --
> 2.49.0
>
>

Reply via email to