On 7/28/25 10:15, Tomasz Kaminski wrote:
On Sun, Jul 27, 2025 at 3:38 PM Luc Grosheintz <luc.groshei...@gmail.com>
wrote:
Versions 1, 2 and 3 of the patch for adding aligned_accessor had a
bug in the constraints that allowed conversion of
aligned_accessor<T, N> a = aligned_accessor<const T, N>{};
and prevented the reverse.
The file mdspan/accessors/generic.cc already contains code that checks
all variation of the constraint. This commit allows passing in two
different accessors. Enabling it to be reused more widely.
libstdc++-v3/ChangeLog:
* testsuite/23_containers/mdspan/accessors/generic.cc: Refactor
test_ctor.
Signed-off-by: Luc Grosheintz <luc.groshei...@gmail.com>
---
LGTM, with one note about duplicated assertions. I will remove it locally,
and push
the commit.
.../23_containers/mdspan/accessors/generic.cc | 61 ++++++++++++-------
1 file changed, 39 insertions(+), 22 deletions(-)
diff --git
a/libstdc++-v3/testsuite/23_containers/mdspan/accessors/generic.cc
b/libstdc++-v3/testsuite/23_containers/mdspan/accessors/generic.cc
index c3350353aae..70c3bd0751c 100644
--- a/libstdc++-v3/testsuite/23_containers/mdspan/accessors/generic.cc
+++ b/libstdc++-v3/testsuite/23_containers/mdspan/accessors/generic.cc
@@ -29,44 +29,61 @@ class Base
class Derived : public Base
{ };
-template<template<typename T> typename Accessor>
+template<typename RhsAccessor, typename LhsAccessor, bool
ExpectConvertible>
+ constexpr void
+ check_convertible()
+ {
+ RhsAccessor rhs;
+ [[maybe_unused]] LhsAccessor lhs(rhs);
+ static_assert(std::is_nothrow_constructible_v<LhsAccessor,
RhsAccessor>);
+ static_assert(std::is_convertible_v<RhsAccessor, LhsAccessor> ==
ExpectConvertible);
+ }
+
+template<template<typename T> typename LhsAccessor,
+ template<typename T> typename RhsAccessor = LhsAccessor,
+ bool ExpectConvertible = true>
constexpr bool
test_ctor()
{
// T -> T
- static_assert(std::is_nothrow_constructible_v<Accessor<double>,
- Accessor<double>>);
- static_assert(std::is_convertible_v<Accessor<double>,
Accessor<double>>);
+ static_assert(std::is_nothrow_constructible_v<LhsAccessor<double>,
+ RhsAccessor<double>>);
This static assert seems to be redundant to one in check_convertible, so I
will remove it and the push th changes.
Indeed, nicely spotted!
+ check_convertible<RhsAccessor<double>, LhsAccessor<double>,
+ ExpectConvertible>();
// T -> const T
- static_assert(std::is_convertible_v<Accessor<double>,
- Accessor<const double>>);
- static_assert(std::is_convertible_v<Accessor<Derived>,
- Accessor<const Derived>>);
+ check_convertible<RhsAccessor<double>, LhsAccessor<const double>,
+ ExpectConvertible>();
+ check_convertible<RhsAccessor<Derived>, LhsAccessor<const Derived>,
+ ExpectConvertible>();
// const T -> T
- static_assert(!std::is_constructible_v<Accessor<double>,
- Accessor<const double>>);
- static_assert(!std::is_constructible_v<Accessor<Derived>,
- Accessor<const Derived>>);
+ static_assert(!std::is_constructible_v<LhsAccessor<double>,
+ RhsAccessor<const double>>);
+ static_assert(!std::is_constructible_v<LhsAccessor<Derived>,
+ RhsAccessor<const Derived>>);
// T <-> volatile T
- static_assert(std::is_convertible_v<Accessor<int>, Accessor<volatile
int>>);
- static_assert(!std::is_constructible_v<Accessor<int>,
- Accessor<volatile int>>);
+ check_convertible<RhsAccessor<int>, LhsAccessor<volatile int>,
+ ExpectConvertible>();
+ static_assert(!std::is_constructible_v<LhsAccessor<int>,
+ RhsAccessor<volatile int>>);
// size difference
- static_assert(!std::is_constructible_v<Accessor<char>,
Accessor<int>>);
+ static_assert(!std::is_constructible_v<LhsAccessor<char>,
+ RhsAccessor<int>>);
// signedness
- static_assert(!std::is_constructible_v<Accessor<int>,
- Accessor<unsigned int>>);
- static_assert(!std::is_constructible_v<Accessor<unsigned int>,
- Accessor<int>>);
+ static_assert(!std::is_constructible_v<LhsAccessor<int>,
+ RhsAccessor<unsigned int>>);
+ static_assert(!std::is_constructible_v<LhsAccessor<unsigned int>,
+ RhsAccessor<int>>);
// Derived <-> Base
- static_assert(!std::is_constructible_v<Accessor<Base>,
Accessor<Derived>>);
- static_assert(!std::is_constructible_v<Accessor<Derived>,
Accessor<Base>>);
+ static_assert(!std::is_constructible_v<LhsAccessor<Base>,
+ RhsAccessor<Derived>>);
+ static_assert(!std::is_constructible_v<LhsAccessor<Derived>,
+ RhsAccessor<Base>>);
return true;
}
--
2.50.0