https://gcc.gnu.org/g:181e7bea46ceb0ee2c5ee2d95dab7ff97158d7b3

commit r16-4088-g181e7bea46ceb0ee2c5ee2d95dab7ff97158d7b3
Author: Luc Grosheintz <luc.groshei...@gmail.com>
Date:   Tue Sep 23 15:10:03 2025 +0200

    libstdc++: Prepare mapping layout tests for padded layouts.
    
    Using the existing tests for padded layouts requires the following
    changes:
    
     * The padded layouts are template classes. In order to be able to use
       partially specialized templates, functions need to be converted to
       structs.
    
     * The layout mapping tests include a check that only applies if
       is_exhaustive is static. This commit introduces a concept to check if
       is_exhaustive is a static member function.
    
     * Fix a test to not use a hard-coded layout_left.
    
    The test empty.cc contains indentation mistakes that are fixed.
    
    libstdc++-v3/ChangeLog:
    
            * testsuite/23_containers/mdspan/layouts/empty.cc: Fix indent.
            * testsuite/23_containers/mdspan/layouts/mapping.cc
            (test_stride_1d): Fix test.
            (test_stride_2d): Rewrite using a struct.
            (test_stride_3d): Ditto.
            (has_static_is_exhaustive): New concept.
            (test_mapping_properties): Update test.
    
    Reviewed-by: Tomasz KamiƄski <tkami...@redhat.com>
    Reviewed-by: Jonathan Wakely <jwak...@redhat.com>
    Signed-off-by: Luc Grosheintz <luc.groshei...@gmail.com>

Diff:
---
 .../23_containers/mdspan/layouts/empty.cc          | 148 ++++++++++-----------
 .../23_containers/mdspan/layouts/mapping.cc        | 140 ++++++++++++-------
 2 files changed, 164 insertions(+), 124 deletions(-)

diff --git a/libstdc++-v3/testsuite/23_containers/mdspan/layouts/empty.cc 
b/libstdc++-v3/testsuite/23_containers/mdspan/layouts/empty.cc
index 655b9b6d6c30..cbc425f6c159 100644
--- a/libstdc++-v3/testsuite/23_containers/mdspan/layouts/empty.cc
+++ b/libstdc++-v3/testsuite/23_containers/mdspan/layouts/empty.cc
@@ -30,96 +30,96 @@ template<typename Mapping>
   }
 
 template<typename Layout, typename Int>
-constexpr void
-test_static_overflow()
-{
-  constexpr Int n1 = std::numeric_limits<Int>::max();
-  constexpr size_t n2 = std::dynamic_extent - 1;
-  constexpr size_t n = std::cmp_less(n1, n2) ? size_t(n1) : n2;
-
-  verify_all(typename Layout::mapping<std::extents<Int, n, n, 0, n, n>>{});
-  verify_all(typename Layout::mapping<std::extents<Int, 0, n, n, n>>{});
-  verify_all(typename Layout::mapping<std::extents<Int, dyn, n, n, n>>{});
-  verify_all(typename Layout::mapping<std::extents<Int, n, n, n, 0>>{});
-  verify_all(typename Layout::mapping<std::extents<Int, n, n, n, dyn>>{});
-}
+  constexpr void
+  test_static_overflow()
+  {
+    constexpr Int n1 = std::numeric_limits<Int>::max();
+    constexpr size_t n2 = std::dynamic_extent - 1;
+    constexpr size_t n = std::cmp_less(n1, n2) ? size_t(n1) : n2;
+
+    verify_all(typename Layout::mapping<std::extents<Int, n, n, 0, n, n>>{});
+    verify_all(typename Layout::mapping<std::extents<Int, 0, n, n, n>>{});
+    verify_all(typename Layout::mapping<std::extents<Int, dyn, n, n, n>>{});
+    verify_all(typename Layout::mapping<std::extents<Int, n, n, n, 0>>{});
+    verify_all(typename Layout::mapping<std::extents<Int, n, n, n, dyn>>{});
+  }
 
 template<typename Int, size_t N>
-constexpr std::array<Int, N>
-make_strides()
-{
-  std::array<Int, N> strides;
-  std::ranges::fill(strides, Int(1));
-  return strides;
-}
+  constexpr std::array<Int, N>
+  make_strides()
+  {
+    std::array<Int, N> strides;
+    std::ranges::fill(strides, Int(1));
+    return strides;
+  }
 
 template<typename Layout, typename Extents>
-constexpr typename Layout::mapping<Extents>
-make_mapping(Extents exts)
-{
-  using IndexType = typename Extents::index_type;
-  constexpr auto rank = Extents::rank();
-  constexpr auto strides = make_strides<IndexType, rank>();
-
-  if constexpr (std::same_as<Layout, std::layout_stride>)
-    return typename Layout::mapping(exts, strides);
-  else
-    return typename Layout::mapping(exts);
-}
+  constexpr typename Layout::mapping<Extents>
+  make_mapping(Extents exts)
+  {
+    using IndexType = typename Extents::index_type;
+    constexpr auto rank = Extents::rank();
+    constexpr auto strides = make_strides<IndexType, rank>();
+
+    if constexpr (std::same_as<Layout, std::layout_stride>)
+      return typename Layout::mapping(exts, strides);
+    else
+      return typename Layout::mapping(exts);
+  }
 
 template<typename Layout, typename Int>
-constexpr void
-test_dynamic_overflow()
-{
-  constexpr Int n1 = std::numeric_limits<Int>::max();
-  constexpr size_t n2 = std::dynamic_extent - 1;
-  constexpr Int n = std::cmp_less(n1, n2) ? n1 : Int(n2);
+  constexpr void
+  test_dynamic_overflow()
+  {
+    constexpr Int n1 = std::numeric_limits<Int>::max();
+    constexpr size_t n2 = std::dynamic_extent - 1;
+    constexpr Int n = std::cmp_less(n1, n2) ? n1 : Int(n2);
 
-  verify_all(make_mapping<Layout>(
-      std::extents<Int, dyn, dyn, 0, dyn, dyn>{n, n, n, n}));
+    verify_all(make_mapping<Layout>(
+       std::extents<Int, dyn, dyn, 0, dyn, dyn>{n, n, n, n}));
 
-  verify_all(make_mapping<Layout>(
-      std::extents<Int, dyn, dyn, dyn, dyn, dyn>{n, n, 0, n, n}));
+    verify_all(make_mapping<Layout>(
+       std::extents<Int, dyn, dyn, dyn, dyn, dyn>{n, n, 0, n, n}));
 
-  verify_all(make_mapping<Layout>(
-      std::extents<Int, dyn, dyn, dyn, 0>{n, n, n}));
+    verify_all(make_mapping<Layout>(
+       std::extents<Int, dyn, dyn, dyn, 0>{n, n, n}));
 
-  verify_all(make_mapping<Layout>(
-      std::extents<Int, dyn, dyn, dyn, dyn>{n, n, n, 0}));
+    verify_all(make_mapping<Layout>(
+       std::extents<Int, dyn, dyn, dyn, dyn>{n, n, n, 0}));
 
-  verify_all(make_mapping<Layout>(
-      std::extents<Int, 0, dyn, dyn, dyn>{n, n, n}));
+    verify_all(make_mapping<Layout>(
+       std::extents<Int, 0, dyn, dyn, dyn>{n, n, n}));
 
-  verify_all(make_mapping<Layout>(
-      std::extents<Int, dyn, dyn, dyn, dyn>{0, n, n, n}));
-}
+    verify_all(make_mapping<Layout>(
+       std::extents<Int, dyn, dyn, dyn, dyn>{0, n, n, n}));
+  }
 
 template<typename Layout, typename Int>
-constexpr void
-test_overflow()
-{
-  test_static_overflow<Layout, Int>();
-  test_dynamic_overflow<Layout, Int>();
-}
+  constexpr void
+  test_overflow()
+  {
+    test_static_overflow<Layout, Int>();
+    test_dynamic_overflow<Layout, Int>();
+  }
 
 template<typename Layout>
-constexpr bool
-test_all()
-{
-  test_overflow<Layout, signed char>();
-  test_overflow<Layout, short int>();
-  test_overflow<Layout, int>();
-  test_overflow<Layout, long int>();
-  test_overflow<Layout, long long int>();
-
-  test_overflow<Layout, unsigned char>();
-  test_overflow<Layout, unsigned short int>();
-  test_overflow<Layout, unsigned int>();
-  test_overflow<Layout, unsigned long int>();
-  test_overflow<Layout, unsigned long long int>();
-  test_overflow<Layout, size_t>();
-  return true;
-}
+  constexpr bool
+  test_all()
+  {
+    test_overflow<Layout, signed char>();
+    test_overflow<Layout, short int>();
+    test_overflow<Layout, int>();
+    test_overflow<Layout, long int>();
+    test_overflow<Layout, long long int>();
+
+    test_overflow<Layout, unsigned char>();
+    test_overflow<Layout, unsigned short int>();
+    test_overflow<Layout, unsigned int>();
+    test_overflow<Layout, unsigned long int>();
+    test_overflow<Layout, unsigned long long int>();
+    test_overflow<Layout, size_t>();
+    return true;
+  }
 
 int
 main()
diff --git a/libstdc++-v3/testsuite/23_containers/mdspan/layouts/mapping.cc 
b/libstdc++-v3/testsuite/23_containers/mdspan/layouts/mapping.cc
index 58bce5144354..db15e2a48f34 100644
--- a/libstdc++-v3/testsuite/23_containers/mdspan/layouts/mapping.cc
+++ b/libstdc++-v3/testsuite/23_containers/mdspan/layouts/mapping.cc
@@ -7,6 +7,15 @@
 
 constexpr size_t dyn = std::dynamic_extent;
 
+template<typename Mapping>
+  concept has_static_is_exhaustive = requires
+  {
+    { Mapping::is_exhaustive() } -> std::same_as<bool>;
+  };
+
+static_assert(has_static_is_exhaustive<std::layout_right::mapping<std::extents<int>>>);
+static_assert(!has_static_is_exhaustive<std::layout_stride::mapping<std::extents<int>>>);
+
 template<typename Layout, typename Extents>
   constexpr bool
   test_mapping_properties()
@@ -32,7 +41,7 @@ template<typename Layout, typename Extents>
 
     static_assert(M::is_always_unique() && M::is_unique());
     static_assert(M::is_always_strided() && M::is_strided());
-    if constexpr (!std::is_same_v<Layout, std::layout_stride>)
+    if constexpr (has_static_is_exhaustive<M>)
       static_assert(M::is_always_exhaustive() && M::is_exhaustive());
     return true;
   }
@@ -306,7 +315,7 @@ template<typename Layout>
   constexpr void
   test_stride_1d()
   {
-    std::layout_left::mapping<std::extents<int, 3>> m;
+    typename Layout::mapping<std::extents<int, 3>> m;
     VERIFY(m.stride(0) == 1);
   }
 
@@ -321,73 +330,104 @@ template<>
   }
 
 template<typename Layout>
-  constexpr void
-  test_stride_2d();
+struct TestStride2D;
 
 template<>
-  constexpr void
-  test_stride_2d<std::layout_left>()
-  {
-    std::layout_left::mapping<std::extents<int, 3, 5>> m;
-    VERIFY(m.stride(0) == 1);
-    VERIFY(m.stride(1) == 3);
-  }
+  struct TestStride2D<std::layout_left>
+  {
+    static constexpr void
+    run()
+    {
+      std::layout_left::mapping<std::extents<int, 3, 5>> m;
+      VERIFY(m.stride(0) == 1);
+      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);
-  }
+  struct TestStride2D<std::layout_right>
+  {
+    static constexpr void
+    run()
+    {
+      std::layout_right::mapping<std::extents<int, 3, 5>> m;
+      VERIFY(m.stride(0) == 5);
+      VERIFY(m.stride(1) == 1);
+    }
+  };
 
 template<>
+  struct TestStride2D<std::layout_stride>
+  {
+    static constexpr void
+    run()
+    {
+      std::array<int, 2> strides{13, 2};
+      std::layout_stride::mapping m(std::extents<int, 3, 5>{}, strides);
+      VERIFY(m.stride(0) == strides[0]);
+      VERIFY(m.stride(1) == strides[1]);
+      VERIFY(m.strides() == strides);
+    }
+  };
+
+template<typename Layout>
   constexpr void
-  test_stride_2d<std::layout_stride>()
+  test_stride_2d()
   {
-    std::array<int, 2> strides{13, 2};
-    std::layout_stride::mapping m(std::extents<int, 3, 5>{}, strides);
-    VERIFY(m.stride(0) == strides[0]);
-    VERIFY(m.stride(1) == strides[1]);
-    VERIFY(m.strides() == strides);
+    TestStride2D<Layout>::run();
   }
 
 template<typename Layout>
-  constexpr void
-  test_stride_3d();
+struct TestStride3D;
 
 template<>
-  constexpr void
-  test_stride_3d<std::layout_left>()
-  {
-    std::layout_left::mapping m(std::dextents<int, 3>(3, 5, 7));
-    VERIFY(m.stride(0) == 1);
-    VERIFY(m.stride(1) == 3);
-    VERIFY(m.stride(2) == 3*5);
-  }
+  struct TestStride3D<std::layout_left>
+  {
+    static constexpr void
+    run()
+    {
+      std::layout_left::mapping m(std::dextents<int, 3>(3, 5, 7));
+      VERIFY(m.stride(0) == 1);
+      VERIFY(m.stride(1) == 3);
+      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);
-  }
+  struct TestStride3D<std::layout_right>
+  {
+    static constexpr void
+    run()
+    {
+      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<>
+  struct TestStride3D<std::layout_stride>
+  {
+    static constexpr void
+    run()
+    {
+      std::dextents<int, 3> exts(3, 5, 7);
+      std::array<int, 3> strides{11, 2, 41};
+      std::layout_stride::mapping<std::dextents<int, 3>> m(exts, strides);
+      VERIFY(m.stride(0) == strides[0]);
+      VERIFY(m.stride(1) == strides[1]);
+      VERIFY(m.stride(2) == strides[2]);
+      VERIFY(m.strides() == strides);
+    }
+  };
+
+template<typename Layout>
   constexpr void
-  test_stride_3d<std::layout_stride>()
+  test_stride_3d()
   {
-    std::dextents<int, 3> exts(3, 5, 7);
-    std::array<int, 3> strides{11, 2, 41};
-    std::layout_stride::mapping<std::dextents<int, 3>> m(exts, strides);
-    VERIFY(m.stride(0) == strides[0]);
-    VERIFY(m.stride(1) == strides[1]);
-    VERIFY(m.stride(2) == strides[2]);
-    VERIFY(m.strides() == strides);
+    TestStride3D<Layout>::run();
   }
 
 template<typename Layout>

Reply via email to