From: Luc Grosheintz Date: Wed, 23 Jul 2025 09:25:52 +0000 (+0200) Subject: libstdc++: Prepare test code for default_accessor for reuse. X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9acdbf81eef6db74502a9b704ba08e5a84dfb5fa;p=thirdparty%2Fgcc.git libstdc++: Prepare test code for default_accessor for reuse. All test code of default_accessor can be reused. This commit moves the reuseable code into a file generic.cc and prepares the tests for reuse with aligned_accessor. libstdc++-v3/ChangeLog: * testsuite/23_containers/mdspan/accessors/default.cc: Delete. * testsuite/23_containers/mdspan/accessors/generic.cc: Slightly generalize the test code previously in default.cc. Reviewed-by: Tomasz KamiƄski Signed-off-by: Luc Grosheintz --- diff --git a/libstdc++-v3/testsuite/23_containers/mdspan/accessors/default.cc b/libstdc++-v3/testsuite/23_containers/mdspan/accessors/default.cc deleted file mode 100644 index c036f8ad10f..00000000000 --- a/libstdc++-v3/testsuite/23_containers/mdspan/accessors/default.cc +++ /dev/null @@ -1,99 +0,0 @@ -// { dg-do run { target c++23 } } -#include - -#include - -constexpr size_t dyn = std::dynamic_extent; - -template - constexpr void - test_accessor_policy() - { - static_assert(std::copyable); - static_assert(std::is_nothrow_move_constructible_v); - static_assert(std::is_nothrow_move_assignable_v); - static_assert(std::is_nothrow_swappable_v); - } - -constexpr bool -test_access() -{ - std::default_accessor accessor; - std::array a{10, 11, 12, 13, 14}; - VERIFY(accessor.access(a.data(), 0) == 10); - VERIFY(accessor.access(a.data(), 4) == 14); - return true; -} - -constexpr bool -test_offset() -{ - std::default_accessor accessor; - std::array a{10, 11, 12, 13, 14}; - VERIFY(accessor.offset(a.data(), 0) == a.data()); - VERIFY(accessor.offset(a.data(), 4) == a.data() + 4); - return true; -} - -class Base -{ }; - -class Derived : public Base -{ }; - -constexpr void -test_ctor() -{ - // T -> T - static_assert(std::is_nothrow_constructible_v, - std::default_accessor>); - static_assert(std::is_convertible_v, - std::default_accessor>); - - // T -> const T - static_assert(std::is_convertible_v, - std::default_accessor>); - static_assert(std::is_convertible_v, - std::default_accessor>); - - // const T -> T - static_assert(!std::is_constructible_v, - std::default_accessor>); - static_assert(!std::is_constructible_v, - std::default_accessor>); - - // T <-> volatile T - static_assert(std::is_convertible_v, - std::default_accessor>); - static_assert(!std::is_constructible_v, - std::default_accessor>); - - // size difference - static_assert(!std::is_constructible_v, - std::default_accessor>); - - // signedness - static_assert(!std::is_constructible_v, - std::default_accessor>); - static_assert(!std::is_constructible_v, - std::default_accessor>); - - // Derived <-> Base - static_assert(!std::is_constructible_v, - std::default_accessor>); - static_assert(!std::is_constructible_v, - std::default_accessor>); - -} - -int -main() -{ - test_accessor_policy>(); - test_access(); - static_assert(test_access()); - test_offset(); - static_assert(test_offset()); - test_ctor(); - return 0; -} diff --git a/libstdc++-v3/testsuite/23_containers/mdspan/accessors/generic.cc b/libstdc++-v3/testsuite/23_containers/mdspan/accessors/generic.cc new file mode 100644 index 00000000000..c3350353aae --- /dev/null +++ b/libstdc++-v3/testsuite/23_containers/mdspan/accessors/generic.cc @@ -0,0 +1,125 @@ +// { dg-do run { target c++23 } } +#include + +#include + +template + constexpr bool + test_class_properties() + { + static_assert(std::is_trivially_copyable_v); + static_assert(std::semiregular); + return true; + } + +template + constexpr bool + test_accessor_policy() + { + static_assert(std::copyable); + static_assert(std::is_nothrow_move_constructible_v); + static_assert(std::is_nothrow_move_assignable_v); + static_assert(std::is_nothrow_swappable_v); + return true; + } + +class Base +{ }; + +class Derived : public Base +{ }; + +template typename Accessor> + constexpr bool + test_ctor() + { + // T -> T + static_assert(std::is_nothrow_constructible_v, + Accessor>); + static_assert(std::is_convertible_v, Accessor>); + + // T -> const T + static_assert(std::is_convertible_v, + Accessor>); + static_assert(std::is_convertible_v, + Accessor>); + + // const T -> T + static_assert(!std::is_constructible_v, + Accessor>); + static_assert(!std::is_constructible_v, + Accessor>); + + // T <-> volatile T + static_assert(std::is_convertible_v, Accessor>); + static_assert(!std::is_constructible_v, + Accessor>); + + // size difference + static_assert(!std::is_constructible_v, Accessor>); + + // signedness + static_assert(!std::is_constructible_v, + Accessor>); + static_assert(!std::is_constructible_v, + Accessor>); + + // Derived <-> Base + static_assert(!std::is_constructible_v, Accessor>); + static_assert(!std::is_constructible_v, Accessor>); + return true; + } + +template typename Accessor> + constexpr bool + test_properties() + { + test_class_properties>(); + test_accessor_policy>(); + test_ctor(); + return true; + } + +static_assert(test_properties()); + +template + constexpr size_t + accessor_alignment = alignof(typename A::element_type); + +template + constexpr void + test_access(Accessor accessor) + { + constexpr size_t N = accessor_alignment; + alignas(N) std::array a{10, 11, 12, 13, 14}; + for (size_t i = 0; i < a.size(); ++i) + VERIFY(accessor.access(a.data(), i) == 10 + i); + } + +template + constexpr void + test_offset(Accessor accessor) + { + constexpr size_t N = accessor_alignment; + alignas(N) std::array a{10, 11, 12, 13, 14}; + for (size_t i = 0; i < a.size(); ++i) + VERIFY(accessor.offset(a.data(), i) == a.data() + i); + } + +template + constexpr bool + test_all() + { + auto accessor = Accessor{}; + test_offset(accessor); + test_access(accessor); + return true; + } + +int +main() +{ + test_all>(); + static_assert(test_all>()); + return 0; +}