Adds tests for layout_right and for the parts of layout_left that depend
on layout_right.

libstdc++/ChangeLog:

        * testsuite/23_containers/mdspan/layouts/class_mandate_neg.cc: Add
        tests for layout_stride.
        * testsuite/23_containers/mdspan/layouts/ctors.cc: Add tests for
        layout_right and the interaction with layout_left.
        * testsuite/23_containers/mdspan/layouts/mapping.cc: ditto.

Signed-off-by: Luc Grosheintz <luc.groshei...@gmail.com>
---
 .../mdspan/layouts/class_mandate_neg.cc       |  1 +
 .../23_containers/mdspan/layouts/ctors.cc     | 90 +++++++++++++++++++
 .../23_containers/mdspan/layouts/mapping.cc   | 20 +++++
 3 files changed, 111 insertions(+)

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 2fd27d0bd35..fdebda8bd06 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
@@ -17,5 +17,6 @@ template<typename Layout>
   };
 
 A<std::layout_left> a_left;     // { dg-error "required from" }
+A<std::layout_right> a_right;   // { dg-error "required from" }
 
 // { dg-prune-output "not 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 c7cf5501628..5c54b440083 100644
--- a/libstdc++-v3/testsuite/23_containers/mdspan/layouts/ctors.cc
+++ b/libstdc++-v3/testsuite/23_containers/mdspan/layouts/ctors.cc
@@ -116,6 +116,92 @@ namespace from_same_layout
     }
 }
 
+// ctor: mapping(layout_{right,left}::mapping<OExtents>)
+namespace from_left_or_right
+{
+  template<typename SLayout, typename OLayout>
+    constexpr void
+    test_constructible()
+    {
+      static_assert(!std::is_constructible_v<
+         typename SLayout::mapping<std::extents<int, 1>>,
+         typename OLayout::mapping<std::extents<int>>>);
+
+      static_assert(!std::is_constructible_v<
+         typename SLayout::mapping<std::extents<int>>,
+         typename OLayout::mapping<std::extents<int, 1>>>);
+
+      static_assert(!std::is_constructible_v<
+         typename SLayout::mapping<std::extents<int, 1, 2>>,
+         typename OLayout::mapping<std::extents<int, 1, 2>>>);
+    }
+
+  template<typename SMapping, typename OMapping>
+    constexpr void
+    test_convertible()
+    {
+      constexpr bool expected = std::is_convertible_v<
+       typename OMapping::extents_type, typename SMapping::extents_type>;
+      static_assert(std::is_convertible_v<OMapping, SMapping> == expected);
+    }
+
+  template<typename SLayout, typename OLayout>
+    constexpr void
+    test_convertible_all()
+    {
+      test_convertible<
+         typename OLayout::mapping<std::extents<int>>,
+         typename SLayout::mapping<std::extents<unsigned int>>>();
+
+      test_convertible<
+         typename OLayout::mapping<std::extents<unsigned int>>,
+         typename SLayout::mapping<std::extents<int>>>();
+
+      test_convertible<
+         typename OLayout::mapping<std::extents<int, 1>>,
+         typename SLayout::mapping<std::extents<int, 1>>>();
+
+      test_convertible<
+         typename OLayout::mapping<std::extents<int, 1>>,
+         typename SLayout::mapping<std::extents<unsigned int, 1>>>();
+
+      test_convertible<
+         typename OLayout::mapping<std::extents<unsigned int, 1>>,
+         typename SLayout::mapping<std::extents<int, 1>>>();
+    }
+
+  template<typename SLayout, typename OLayout, typename Extents>
+    constexpr bool
+    test_ctor(Extents exts)
+    {
+      typename OLayout::mapping<Extents> m1(exts);
+      typename SLayout::mapping<Extents> m2(m1);
+      VERIFY(m1.extents() == m2.extents());
+      return true;
+    }
+
+  template<typename SLayout, typename OLayout>
+    constexpr bool
+    test_ctor_all()
+    {
+      test_ctor<SLayout, OLayout>(std::extents<int>{});
+      test_ctor<SLayout, OLayout>(std::extents<int, 1>{});
+      test_ctor<SLayout, OLayout>(std::extents<int, dyn>{3});
+      return true;
+    }
+
+  template<typename SLayout, typename OLayout>
+    constexpr void
+    test_all()
+    {
+      test_constructible<SLayout, OLayout>();
+      test_convertible_all<SLayout, OLayout>();
+
+      test_ctor_all<SLayout, OLayout>();
+      static_assert(test_ctor_all<SLayout, OLayout>());
+    }
+}
+
 template<typename Layout>
 constexpr void
 test_all()
@@ -128,5 +214,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/mapping.cc 
b/libstdc++-v3/testsuite/23_containers/mdspan/layouts/mapping.cc
index 1d7d4c4e1c7..f59dd75d01f 100644
--- a/libstdc++-v3/testsuite/23_containers/mdspan/layouts/mapping.cc
+++ b/libstdc++-v3/testsuite/23_containers/mdspan/layouts/mapping.cc
@@ -239,6 +239,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();
@@ -253,6 +262,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) == 35);
+    VERIFY(m.stride(1) == 7);
+    VERIFY(m.stride(2) == 1);
+  }
+
 template<typename Layout>
   constexpr bool
   test_stride_all()
@@ -367,5 +386,6 @@ int
 main()
 {
   test_all<std::layout_left>();
+  test_all<std::layout_right>();
   return 0;
 }
-- 
2.49.0

Reply via email to