aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuc Grosheintz <luc.grosheintz@gmail.com>2025-07-16 15:45:45 +0200
committerTomasz Kamiński <tkaminsk@redhat.com>2025-07-17 16:12:52 +0200
commit29d53f6213e0a1569aa8ca9db613b48df642986c (patch)
treef96291876c46ceb471f9f585ed56565d735ad1a9
parent1eee8430794f790b6d364603685e70d83d8d42f5 (diff)
downloadgcc-29d53f6213e0a1569aa8ca9db613b48df642986c.zip
gcc-29d53f6213e0a1569aa8ca9db613b48df642986c.tar.gz
gcc-29d53f6213e0a1569aa8ca9db613b48df642986c.tar.bz2
libstdc++: Fix forwarding of custom IndexType in mdspan [PR121061]
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. 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. Reviewed-by: Jonathan Wakely <jwakely@redhat.com> Reviewed-by: Tomasz Kamiński <tkaminsk@redhat.com> Signed-off-by: Luc Grosheintz <luc.grosheintz@gmail.com>
-rw-r--r--libstdc++-v3/include/std/mdspan8
-rw-r--r--libstdc++-v3/testsuite/23_containers/mdspan/extents/custom_integer.cc3
-rw-r--r--libstdc++-v3/testsuite/23_containers/mdspan/int_like.h7
-rw-r--r--libstdc++-v3/testsuite/23_containers/mdspan/layouts/mapping.cc1
-rw-r--r--libstdc++-v3/testsuite/23_containers/mdspan/mdspan.cc2
5 files changed, 17 insertions, 4 deletions
diff --git a/libstdc++-v3/include/std/mdspan b/libstdc++-v3/include/std/mdspan
index 930997e..271fdb5 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 92c2ebb..99de401 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 f4f4a77..310dd8d 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 6742fa1..58bce51 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 22ec68ea..be4a1b1 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());