aboutsummaryrefslogtreecommitdiff
path: root/libstdc++-v3/include/std/span
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely@redhat.com>2024-12-09 17:35:24 +0000
committerJonathan Wakely <redi@gcc.gnu.org>2024-12-11 21:50:46 +0000
commite95bda027e0b81922c1bf44770674190bdf787e8 (patch)
tree4a1fc1b34b560d50b9e46830609a0f16760b9f95 /libstdc++-v3/include/std/span
parent2835bd76c1eabc8b5379aaec0d6190f14f62d5be (diff)
downloadgcc-e95bda027e0b81922c1bf44770674190bdf787e8.zip
gcc-e95bda027e0b81922c1bf44770674190bdf787e8.tar.gz
gcc-e95bda027e0b81922c1bf44770674190bdf787e8.tar.bz2
libstdc++: Skip redundant assertions in std::span construction [PR117966]
As PR c++/117966 shows, the Debug Mode checks cause a compilation error for a global constexpr std::span. Those debug checks are redundant when constructing from an array or a range, because we already know we have a valid range and we know its size. Instead of delegating to the std::span(contiguous_iterator, contiguous_iterator) constructor, just initialize the data members directly. libstdc++-v3/ChangeLog: PR libstdc++/117966 * include/std/span (span(T (&)[N])): Do not delegate to constructor that performs redundant checks. (span(array<T, N>&), span(const array<T, N>&)): Likewise. (span(Range&&), span(const span<T, N>&)): Likewise. * testsuite/23_containers/span/117966.cc: New test.
Diffstat (limited to 'libstdc++-v3/include/std/span')
-rw-r--r--libstdc++-v3/include/std/span10
1 files changed, 5 insertions, 5 deletions
diff --git a/libstdc++-v3/include/std/span b/libstdc++-v3/include/std/span
index f1c19b5..6722734 100644
--- a/libstdc++-v3/include/std/span
+++ b/libstdc++-v3/include/std/span
@@ -190,21 +190,21 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
requires (_Extent == dynamic_extent || _ArrayExtent == _Extent)
constexpr
span(type_identity_t<element_type> (&__arr)[_ArrayExtent]) noexcept
- : span(static_cast<pointer>(__arr), _ArrayExtent)
+ : _M_ptr(__arr), _M_extent(_ArrayExtent)
{ }
template<typename _Tp, size_t _ArrayExtent>
requires __is_compatible_array<_Tp, _ArrayExtent>::value
constexpr
span(array<_Tp, _ArrayExtent>& __arr) noexcept
- : span(static_cast<pointer>(__arr.data()), _ArrayExtent)
+ : _M_ptr(__arr.data()), _M_extent(_ArrayExtent)
{ }
template<typename _Tp, size_t _ArrayExtent>
requires __is_compatible_array<const _Tp, _ArrayExtent>::value
constexpr
span(const array<_Tp, _ArrayExtent>& __arr) noexcept
- : span(static_cast<pointer>(__arr.data()), _ArrayExtent)
+ : _M_ptr(__arr.data()), _M_extent(_ArrayExtent)
{ }
template<typename _Range>
@@ -218,7 +218,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
span(_Range&& __range)
noexcept(noexcept(ranges::data(__range))
&& noexcept(ranges::size(__range)))
- : span(ranges::data(__range), ranges::size(__range))
+ : _M_ptr(ranges::data(__range)), _M_extent(ranges::size(__range))
{
if constexpr (extent != dynamic_extent)
{
@@ -236,7 +236,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
constexpr
explicit(extent != dynamic_extent && _OExtent == dynamic_extent)
span(const span<_OType, _OExtent>& __s) noexcept
- : _M_extent(__s.size()), _M_ptr(__s.data())
+ : _M_ptr(__s.data()), _M_extent(__s.size())
{
if constexpr (extent != dynamic_extent)
{