On Wed, 8 Oct 2025 at 09:42, Tomasz Kaminski <[email protected]> wrote:
>
>
>
> On Wed, Oct 8, 2025 at 10:37 AM Jonathan Wakely <[email protected]> wrote:
>>
>> On Fri, 03 Oct 2025 at 12:48 +0200, Tomasz Kamiński wrote:
>> >From: Luc Grosheintz <[email protected]>
>> >
>> >The improvement is that in __index_type_cast, we don't need to check at
>> >runtime if we know that _IndexType is smaller than _OIndexType.
>> >
>> >The cleanup is whitespace (overlength lines) in <mdspan> and
>> >de-uglifying a variable in test code.
>> >
>> >libstdc++-v3/ChangeLog:
>> >
>> > * include/std/mdspan (__mdspan::__index_type_cast): Optimize by
>> > skipping a __glibcxx_assert if it's know at compile-time.
>> > * testsuite/23_containers/mdspan/int_like.h: Rename _M_i to
>> > value.
>> >
>> >Reviewed-by: Tomasz Kamiński <[email protected]>
>> >Signed-off-by: Luc Grosheintz <[email protected]>
>> >---
>> >v2 revers few whitespace changes.
>> >
>> > libstdc++-v3/include/std/mdspan | 16 +++++++++++-----
>> > .../testsuite/23_containers/mdspan/int_like.h | 12 ++++++------
>> > 2 files changed, 17 insertions(+), 11 deletions(-)
>> >
>> >diff --git a/libstdc++-v3/include/std/mdspan
>> >b/libstdc++-v3/include/std/mdspan
>> >index ce7e4178f67..469d4c3cb6c 100644
>> >--- a/libstdc++-v3/include/std/mdspan
>> >+++ b/libstdc++-v3/include/std/mdspan
>> >@@ -77,11 +77,17 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>> > {
>> > if constexpr (std::is_integral_v<_OIndexType>)
>> > {
>> >- __glibcxx_assert(cmp_less_equal(__other,
>> >- __gnu_cxx::__int_traits<_IndexType>::__max));
>> >+ constexpr _IndexType __index_type_max
>> >+ = __gnu_cxx::__int_traits<_IndexType>::__max;
>> >+ constexpr _OIndexType __oindex_type_max
>> >+ = __gnu_cxx::__int_traits<_OIndexType>::__max;
>> >+
>> >+ if constexpr (__index_type_max < __oindex_type_max)
>> >+ __glibcxx_assert(cmp_less_equal(__other, __index_type_max));
>> >+
>> > if constexpr (std::is_signed_v<_OIndexType>)
>> >- __glibcxx_assert(__other >= 0);
>> >- return std::move(__other);
>> >+ __glibcxx_assert(__other >= 0);
>> >+ return static_cast<_IndexType>(std::move(__other));
>>
>> Do we need the std::move here, if we know that __other has an integral
>> type?
>
> Good catch. The `std::move` was applied out of habit here. I will change that
> before
> submitting.
OK for trunk then, thanks.
>>
>>
>>
>>
>> > }
>> > else
>> > {
>> >@@ -981,7 +987,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>> > template<class _RightPaddedMapping>
>> > requires __mdspan::__is_right_padded_mapping<_RightPaddedMapping>
>> > && is_constructible_v<extents_type,
>> >- typename
>> >_RightPaddedMapping::extents_type>
>> >+ typename _RightPaddedMapping::extents_type>
>> > constexpr
>> > explicit(!is_convertible_v<typename
>> > _RightPaddedMapping::extents_type,
>> > extents_type>)
>> >diff --git a/libstdc++-v3/testsuite/23_containers/mdspan/int_like.h
>> >b/libstdc++-v3/testsuite/23_containers/mdspan/int_like.h
>> >index 310dd8ddf20..e9172c13455 100644
>> >--- a/libstdc++-v3/testsuite/23_containers/mdspan/int_like.h
>> >+++ b/libstdc++-v3/testsuite/23_containers/mdspan/int_like.h
>> >@@ -15,7 +15,7 @@ template<CustomIndexKind Kind>
>> > public:
>> > explicit
>> > CustomIndexType(int i)
>> >- : _M_i(i)
>> >+ : value(i)
>> > { }
>> >
>> > CustomIndexType() = delete;
>> >@@ -31,25 +31,25 @@ template<CustomIndexKind Kind>
>> > constexpr
>> > operator int() const noexcept
>> > requires (Kind == CustomIndexKind::Const)
>> >- { return _M_i; }
>> >+ { return value; }
>> >
>> > constexpr
>> > operator int() const
>> > requires (Kind == CustomIndexKind::Throwing)
>> >- { return _M_i; }
>> >+ { return value; }
>> >
>> > constexpr
>> > operator int() noexcept
>> > requires (Kind == CustomIndexKind::Mutating)
>> >- { return _M_i; }
>> >+ { return value; }
>> >
>> > constexpr
>> > operator int() && noexcept
>> > requires (Kind == CustomIndexKind::RValue)
>> >- { return _M_i; }
>> >+ { return value; }
>> >
>> > private:
>> >- int _M_i;
>> >+ int value;
>> > };
>> >
>> > using IntLike = CustomIndexType<CustomIndexKind::Const>;
>> >--
>> >2.51.0
>> >
>> >
>>