On Fri, May 30, 2025 at 6:50 PM Luc Grosheintz <luc.groshei...@gmail.com>
wrote:

> Adds tests for layout_right and for the parts of layout_left that depend
> on layout_right.
>
> libstdc++-v3/ChangeLog:
>
>         * testsuite/23_containers/mdspan/layouts/class_mandate_neg.cc: Add
>         tests for layout_right.
>         * testsuite/23_containers/mdspan/layouts/ctors.cc: Add tests for
>         layout_right and the interaction with layout_left.
>         * testsuite/23_containers/mdspan/layouts/empty.cc: ditto.
>         * testsuite/23_containers/mdspan/layouts/mapping.cc: ditto.
>
> Signed-off-by: Luc Grosheintz <luc.groshei...@gmail.com>
> ---
>
LGTM.

>  .../mdspan/layouts/class_mandate_neg.cc       |  3 +
>  .../23_containers/mdspan/layouts/ctors.cc     | 64 +++++++++++++++
>  .../23_containers/mdspan/layouts/empty.cc     |  1 +
>  .../23_containers/mdspan/layouts/mapping.cc   | 78 ++++++++++++++++---
>  4 files changed, 136 insertions(+), 10 deletions(-)
>
> diff --git
> a/libstdc++-v3/testsuite/23_containers/mdspan/layouts/class_mandate_neg.cc
> b/libstdc++-v3/testsuite/23_containers/mdspan/layouts/class_mandate_neg.cc
> index 62526140200..6469fa601e9 100644
> ---
> a/libstdc++-v3/testsuite/23_containers/mdspan/layouts/class_mandate_neg.cc
> +++
> b/libstdc++-v3/testsuite/23_containers/mdspan/layouts/class_mandate_neg.cc
> @@ -30,7 +30,10 @@ template<size_t Count, typename Layout, typename
> OLayout>
>    };
>
>  A<std::layout_left> a_left;                      // { dg-error "required
> from" }
> +A<std::layout_right> a_right;                    // { dg-error "required
> from" }
>
>  B<1, std::layout_left, std::layout_left> bll;    // { dg-error "required
> here" }
>
> +B<3, std::layout_right, std::layout_right> brr;  // { dg-error "required
> here" }
> +
>  // { dg-prune-output "must be representable as index_type" }
> diff --git a/libstdc++-v3/testsuite/23_containers/mdspan/layouts/ctors.cc
> b/libstdc++-v3/testsuite/23_containers/mdspan/layouts/ctors.cc
> index 8e1fd2d9524..b0e03161874 100644
> --- a/libstdc++-v3/testsuite/23_containers/mdspan/layouts/ctors.cc
> +++ b/libstdc++-v3/testsuite/23_containers/mdspan/layouts/ctors.cc
> @@ -263,6 +263,66 @@ namespace from_same_layout
>      }
>  }
>
> +// ctor: mapping(layout_{right,left}::mapping<OExtents>)
> +namespace from_left_or_right
> +{
> +  template<typename SLayout, typename OLayout, typename SExtents,
> +          typename OExtents>
> +    constexpr void
> +    verify_ctor(OExtents oexts)
> +    {
> +      using SMapping = typename SLayout::mapping<SExtents>;
> +      using OMapping = typename OLayout::mapping<OExtents>;
> +
> +      constexpr bool expected = std::is_convertible_v<OExtents, SExtents>;
> +      if constexpr (expected)
> +       verify_nothrow_convertible<SMapping>(OMapping(oexts));
> +      else
> +       verify_nothrow_constructible<SMapping>(OMapping(oexts));
> +    }
> +
> +  template<typename SLayout, typename OLayout>
> +    constexpr bool
> +    test_ctor()
> +    {
> +      assert_not_constructible<
> +       typename SLayout::mapping<std::extents<int>>,
> +       typename OLayout::mapping<std::extents<int, 1>>>();
> +
> +      verify_ctor<OLayout, SLayout, std::extents<int>>(
> +       std::extents<unsigned int>{});
> +
> +      verify_ctor<OLayout, SLayout, std::extents<unsigned int>>(
> +       std::extents<int>{});
> +
> +      assert_not_constructible<
> +       typename SLayout::mapping<std::extents<int, 1>>,
> +       typename OLayout::mapping<std::extents<int>>>();
> +
> +      verify_ctor<OLayout, SLayout, std::extents<int, 1>>(
> +       std::extents<int, 1>{});
> +
> +      verify_ctor<OLayout, SLayout, std::extents<int, 1>>(
> +       std::extents<unsigned int, 1>{});
> +
> +      verify_ctor<OLayout, SLayout, std::extents<unsigned int, 1>>(
> +       std::extents<int, 1>{});
> +
> +      assert_not_constructible<
> +       typename SLayout::mapping<std::extents<int, 1, 2>>,
> +       typename OLayout::mapping<std::extents<int, 1, 2>>>();
> +      return true;
> +    }
> +
> +  template<typename SLayout, typename OLayout>
> +    constexpr void
> +    test_all()
> +    {
> +      test_ctor<SLayout, OLayout>();
> +      static_assert(test_ctor<SLayout, OLayout>());
> +    }
> +}
> +
>  template<typename Layout>
>    constexpr void
>    test_all()
> @@ -276,5 +336,9 @@ int
>  main()
>  {
>    test_all<std::layout_left>();
> +  test_all<std::layout_right>();
> +
> +  from_left_or_right::test_all<std::layout_left, std::layout_right>();
> +  from_left_or_right::test_all<std::layout_right, std::layout_left>();
>    return 0;
>  }
> diff --git a/libstdc++-v3/testsuite/23_containers/mdspan/layouts/empty.cc
> b/libstdc++-v3/testsuite/23_containers/mdspan/layouts/empty.cc
> index 10843e2a2bb..dc2a95ebbe6 100644
> --- a/libstdc++-v3/testsuite/23_containers/mdspan/layouts/empty.cc
> +++ b/libstdc++-v3/testsuite/23_containers/mdspan/layouts/empty.cc
> @@ -63,5 +63,6 @@ int
>  main()
>  {
>    static_assert(test_all<std::layout_left>());
> +  static_assert(test_all<std::layout_right>());
>    return 0;
>  }
> diff --git
> a/libstdc++-v3/testsuite/23_containers/mdspan/layouts/mapping.cc
> b/libstdc++-v3/testsuite/23_containers/mdspan/layouts/mapping.cc
> index a5be1166617..4dc0db66865 100644
> --- a/libstdc++-v3/testsuite/23_containers/mdspan/layouts/mapping.cc
> +++ b/libstdc++-v3/testsuite/23_containers/mdspan/layouts/mapping.cc
> @@ -293,6 +293,15 @@ template<>
>      VERIFY(m.stride(1) == 3);
>    }
>
> +template<>
> +  constexpr void
> +  test_stride_2d<std::layout_right>()
> +  {
> +    std::layout_right::mapping<std::extents<int, 3, 5>> m;
> +    VERIFY(m.stride(0) == 5);
> +    VERIFY(m.stride(1) == 1);
> +  }
> +
>  template<typename Layout>
>    constexpr void
>    test_stride_3d();
> @@ -307,6 +316,16 @@ template<>
>      VERIFY(m.stride(2) == 3*5);
>    }
>
> +template<>
> +  constexpr void
> +  test_stride_3d<std::layout_right>()
> +  {
> +    std::layout_right::mapping m(std::dextents<int, 3>(3, 5, 7));
> +    VERIFY(m.stride(0) == 5*7);
> +    VERIFY(m.stride(1) == 7);
> +    VERIFY(m.stride(2) == 1);
> +  }
> +
>  template<typename Layout>
>    constexpr bool
>    test_stride_all()
> @@ -381,24 +400,59 @@ template<typename M1, typename M2>
>      { m2 != m1 } -> std::same_as<bool>;
>    };
>
> -template<typename Layout>
> -  constexpr bool
> +template<typename SLayout, typename OLayout, bool Expected>
> +  constexpr void
>    test_has_op_eq()
>    {
> +    static_assert(has_op_eq<
> +       typename SLayout::mapping<std::extents<int>>,
> +       typename OLayout::mapping<std::extents<int>>> == Expected);
> +
> +    static_assert(!has_op_eq<
> +       typename SLayout::mapping<std::extents<int>>,
> +       typename OLayout::mapping<std::extents<int, 1>>>);
> +
> +    static_assert(has_op_eq<
> +       typename SLayout::mapping<std::extents<int, 1>>,
> +       typename OLayout::mapping<std::extents<int, 1>>> == Expected);
> +
> +    static_assert(has_op_eq<
> +       typename SLayout::mapping<std::extents<int, 1>>,
> +       typename OLayout::mapping<std::extents<int, 2>>> == Expected);
> +
>      static_assert(!has_op_eq<
> -       typename Layout::mapping<std::extents<int, 1, 2>>,
> -       typename Layout::mapping<std::extents<int, 1>>>);
> +       typename SLayout::mapping<std::extents<int, 1>>,
> +       typename OLayout::mapping<std::extents<int, 1, 2>>>);
>
>      static_assert(has_op_eq<
> -       typename Layout::mapping<std::extents<int, 1>>,
> -       typename Layout::mapping<std::extents<int, 1>>>);
> +       typename SLayout::mapping<std::extents<int, 1, 2>>,
> +       typename OLayout::mapping<std::extents<int, 1, 2>>> == Expected);
>
>      static_assert(has_op_eq<
> -       typename Layout::mapping<std::extents<int, 1>>,
> -       typename Layout::mapping<std::extents<int, 2>>>);
> -    return true;
> +       typename SLayout::mapping<std::extents<int, 1, 2>>,
> +       typename OLayout::mapping<std::extents<int, 2, 2>>> == Expected);
> +
> +    static_assert(!has_op_eq<
> +       typename SLayout::mapping<std::extents<int, 1, 2>>,
> +       typename OLayout::mapping<std::extents<int, 1, 2, 3>>>);
>    }
>
> +constexpr void
> +test_has_op_eq_peculiar()
> +{
> +  static_assert(has_op_eq<
> +      std::layout_right::mapping<std::extents<int>>,
> +      std::layout_left::mapping<std::extents<unsigned int>>>);
> +
> +  static_assert(has_op_eq<
> +      std::layout_right::mapping<std::extents<int, 1>>,
> +      std::layout_left::mapping<std::extents<int, dyn>>>);
> +
> +  static_assert(!has_op_eq<
> +      std::layout_right::mapping<std::extents<int, 1, 2>>,
> +      std::layout_left::mapping<std::extents<int, dyn, 2>>>);
> +}
> +
>  template<typename Layout>
>    constexpr bool
>    test_mapping_all()
> @@ -426,12 +480,16 @@ template<typename Layout>
>      test_has_stride_0d<Layout>();
>      test_has_stride_1d<Layout>();
>      test_has_stride_2d<Layout>();
> -    test_has_op_eq<Layout>();
> +    test_has_op_eq<Layout, Layout, true>();
>    }
>
>  int
>  main()
>  {
>    test_all<std::layout_left>();
> +  test_all<std::layout_right>();
> +
> +  test_has_op_eq<std::layout_right, std::layout_left, false>();
> +  test_has_op_eq_peculiar();
>    return 0;
>  }
> --
> 2.49.0
>
>

Reply via email to