[PATCH v1 3/3] libstdc++: Fix forwarding of custom IndexType in mdspan [PR121061]
Tomasz Kaminski
tkaminsk@redhat.com
Thu Jul 17 14:14:41 GMT 2025
Also merged to master.
On Wed, Jul 16, 2025 at 10:07 PM Jonathan Wakely <jwakely.gcc@gmail.com>
wrote:
>
>
> On Wed, 16 Jul 2025, 14:53 Luc Grosheintz, <luc.grosheintz@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.grosheintz@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
>>
>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://gcc.gnu.org/pipermail/libstdc++/attachments/20250717/971a9987/attachment.htm>
More information about the Libstdc++
mailing list