Also merged to master. On Wed, Jul 16, 2025 at 10:07 PM Jonathan Wakely <jwakely....@gmail.com> wrote:
> > > On Wed, 16 Jul 2025, 14:53 Luc Grosheintz, <luc.groshei...@gmail.com> > wrote: > >> The second bug report in PR121061 is that the conversion of custom >> OtherIndexType to IndexType is incorrectly not done via r-value >> references. >> >> This commit fixes the forwarding issue, adds a custom IndexType called >> RValueInt, which only allows conversion to int via r-value reference. >> > > OK for trunk > > > >> PR libstdc++/121061 >> >> libstdc++-v3/ChangeLog: >> >> * include/std/mdspan (extents::extents): Perform conversion to >> index_type of an r-value reference. >> (layout_left::mapping::operator()): Ditto. >> (layout_right::mapping::operator()): Ditto. >> (layout_stride::mapping::operator()): Ditto. >> * testsuite/23_containers/mdspan/extents/custom_integer.cc: Add >> tests for RValueInt and MutatingInt. >> * testsuite/23_containers/mdspan/int_like.h (RValueInt): Add. >> * testsuite/23_containers/mdspan/layouts/mapping.cc: Test with >> RValueInt. >> * testsuite/23_containers/mdspan/mdspan.cc: Ditto. >> >> Signed-off-by: Luc Grosheintz <luc.groshei...@gmail.com> >> --- >> libstdc++-v3/include/std/mdspan | 8 ++++---- >> .../23_containers/mdspan/extents/custom_integer.cc | 3 +++ >> libstdc++-v3/testsuite/23_containers/mdspan/int_like.h | 7 +++++++ >> .../testsuite/23_containers/mdspan/layouts/mapping.cc | 1 + >> libstdc++-v3/testsuite/23_containers/mdspan/mdspan.cc | 2 ++ >> 5 files changed, 17 insertions(+), 4 deletions(-) >> >> diff --git a/libstdc++-v3/include/std/mdspan >> b/libstdc++-v3/include/std/mdspan >> index 930997e9536..271fdb5d8c7 100644 >> --- a/libstdc++-v3/include/std/mdspan >> +++ b/libstdc++-v3/include/std/mdspan >> @@ -285,7 +285,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION >> || sizeof...(_OIndexTypes) == rank_dynamic()) >> constexpr explicit extents(_OIndexTypes... __exts) noexcept >> : _M_exts(span<const _IndexType, sizeof...(_OIndexTypes)>( >> - initializer_list{_S_storage::_S_int_cast(__exts)...})) >> + >> initializer_list{static_cast<_IndexType>(std::move(__exts))...})) >> { } >> >> template<typename _OIndexType, size_t _Nm> >> @@ -602,7 +602,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION >> operator()(_Indices... __indices) const noexcept >> { >> return __mdspan::__linear_index_left(_M_extents, >> - static_cast<index_type>(__indices)...); >> + static_cast<index_type>(std::move(__indices))...); >> } >> >> static constexpr bool >> @@ -741,7 +741,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION >> operator()(_Indices... __indices) const noexcept >> { >> return __mdspan::__linear_index_right( >> - _M_extents, static_cast<index_type>(__indices)...); >> + _M_extents, static_cast<index_type>(std::move(__indices))...); >> } >> >> static constexpr bool >> @@ -963,7 +963,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION >> operator()(_Indices... __indices) const noexcept >> { >> return __mdspan::__linear_index_strides(*this, >> - static_cast<index_type>(__indices)...); >> + static_cast<index_type>(std::move(__indices))...); >> } >> >> static constexpr bool >> diff --git >> a/libstdc++-v3/testsuite/23_containers/mdspan/extents/custom_integer.cc >> b/libstdc++-v3/testsuite/23_containers/mdspan/extents/custom_integer.cc >> index 92c2ebb46e1..99de4015ef3 100644 >> --- >> a/libstdc++-v3/testsuite/23_containers/mdspan/extents/custom_integer.cc >> +++ >> b/libstdc++-v3/testsuite/23_containers/mdspan/extents/custom_integer.cc >> @@ -85,9 +85,12 @@ main() >> test_shape_all<IntLike, true>(); >> test_shape_all<ThrowingInt, false>(); >> test_shape_all<MutatingInt, false>(); >> + test_shape_all<RValueInt, false>(); >> >> test_pack_all<int, true>(); >> test_pack_all<IntLike, true>(); >> test_pack_all<ThrowingInt, false>(); >> + test_pack_all<MutatingInt, true>(); >> + test_pack_all<RValueInt, true>(); >> return 0; >> } >> diff --git a/libstdc++-v3/testsuite/23_containers/mdspan/int_like.h >> b/libstdc++-v3/testsuite/23_containers/mdspan/int_like.h >> index f4f4a773193..310dd8ddf20 100644 >> --- a/libstdc++-v3/testsuite/23_containers/mdspan/int_like.h >> +++ b/libstdc++-v3/testsuite/23_containers/mdspan/int_like.h >> @@ -6,6 +6,7 @@ enum class CustomIndexKind >> Const, >> Throwing, >> Mutating, >> + RValue, >> }; >> >> template<CustomIndexKind Kind> >> @@ -42,6 +43,11 @@ template<CustomIndexKind Kind> >> requires (Kind == CustomIndexKind::Mutating) >> { return _M_i; } >> >> + constexpr >> + operator int() && noexcept >> + requires (Kind == CustomIndexKind::RValue) >> + { return _M_i; } >> + >> private: >> int _M_i; >> }; >> @@ -49,6 +55,7 @@ template<CustomIndexKind Kind> >> using IntLike = CustomIndexType<CustomIndexKind::Const>; >> using ThrowingInt = CustomIndexType<CustomIndexKind::Throwing>; >> using MutatingInt = CustomIndexType<CustomIndexKind::Mutating>; >> +using RValueInt = CustomIndexType<CustomIndexKind::RValue>; >> >> struct NotIntLike >> { }; >> diff --git >> a/libstdc++-v3/testsuite/23_containers/mdspan/layouts/mapping.cc >> b/libstdc++-v3/testsuite/23_containers/mdspan/layouts/mapping.cc >> index 6742fa11a51..58bce514435 100644 >> --- a/libstdc++-v3/testsuite/23_containers/mdspan/layouts/mapping.cc >> +++ b/libstdc++-v3/testsuite/23_containers/mdspan/layouts/mapping.cc >> @@ -527,6 +527,7 @@ template<typename Layout> >> { >> test_linear_index_all<Layout, IntLike>(); >> test_linear_index_all<Layout, MutatingInt>(); >> + test_linear_index_all<Layout, RValueInt>(); >> } >> >> test_required_span_size_all<Layout>(); >> diff --git a/libstdc++-v3/testsuite/23_containers/mdspan/mdspan.cc >> b/libstdc++-v3/testsuite/23_containers/mdspan/mdspan.cc >> index 22ec68ea2d1..be4a1b1c17e 100644 >> --- a/libstdc++-v3/testsuite/23_containers/mdspan/mdspan.cc >> +++ b/libstdc++-v3/testsuite/23_containers/mdspan/mdspan.cc >> @@ -694,6 +694,7 @@ main() >> test_from_int_like<IntLike, true, true>(); >> test_from_int_like<ThrowingInt, false, false>(); >> test_from_int_like<MutatingInt, true, false>(); >> + test_from_int_like<RValueInt, true, false>(); >> >> test_from_opaque_accessor(); >> test_from_base_class_accessor(); >> @@ -705,6 +706,7 @@ main() >> test_access<IntLike, true, true>(); >> test_access<ThrowingInt, false, false>(); >> test_access<MutatingInt, true, false>(); >> + test_access<RValueInt, true, false>(); >> >> test_swap(); >> static_assert(test_swap()); >> -- >> 2.50.0 >> >>