forked from OSchip/llvm-project
[libc++] span: Fix incorrect return type of span::subspan
The extent of the returned span was always std::dynamic_extent, which is incorrect. Thanks to Michael Schellenberger Costa for the patch. Differential Revision: https://reviews.llvm.org/D71997
This commit is contained in:
parent
5ba931a84a
commit
92a1f65f17
|
@ -444,7 +444,7 @@ public:
|
||||||
|
|
||||||
template <size_t _Offset, size_t _Count = dynamic_extent>
|
template <size_t _Offset, size_t _Count = dynamic_extent>
|
||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
constexpr span<_Tp, dynamic_extent> subspan() const noexcept
|
constexpr span<element_type, _Count> subspan() const noexcept
|
||||||
{
|
{
|
||||||
_LIBCPP_ASSERT(_Offset <= size(), "Offset out of range in span::subspan()");
|
_LIBCPP_ASSERT(_Offset <= size(), "Offset out of range in span::subspan()");
|
||||||
_LIBCPP_ASSERT(_Count == dynamic_extent || _Offset + _Count <= size(), "Count out of range in span::subspan()");
|
_LIBCPP_ASSERT(_Count == dynamic_extent || _Offset + _Count <= size(), "Count out of range in span::subspan()");
|
||||||
|
|
|
@ -37,7 +37,13 @@ constexpr bool testConstexprSpan(Span sp)
|
||||||
using S2 = decltype(s2);
|
using S2 = decltype(s2);
|
||||||
ASSERT_SAME_TYPE(typename Span::value_type, typename S1::value_type);
|
ASSERT_SAME_TYPE(typename Span::value_type, typename S1::value_type);
|
||||||
ASSERT_SAME_TYPE(typename Span::value_type, typename S2::value_type);
|
ASSERT_SAME_TYPE(typename Span::value_type, typename S2::value_type);
|
||||||
static_assert(S1::extent == (Span::extent == std::dynamic_extent ? std::dynamic_extent : Count), "");
|
if constexpr (Count != std::dynamic_extent) {
|
||||||
|
static_assert(S1::extent == Count);
|
||||||
|
} else if constexpr (Span::extent != std::dynamic_extent) {
|
||||||
|
static_assert(S1::extent == Span::extent - Offset);
|
||||||
|
} else {
|
||||||
|
static_assert(S1::extent == std::dynamic_extent);
|
||||||
|
}
|
||||||
static_assert(S2::extent == std::dynamic_extent, "");
|
static_assert(S2::extent == std::dynamic_extent, "");
|
||||||
return
|
return
|
||||||
s1.data() == s2.data()
|
s1.data() == s2.data()
|
||||||
|
@ -76,7 +82,13 @@ void testRuntimeSpan(Span sp)
|
||||||
using S2 = decltype(s2);
|
using S2 = decltype(s2);
|
||||||
ASSERT_SAME_TYPE(typename Span::value_type, typename S1::value_type);
|
ASSERT_SAME_TYPE(typename Span::value_type, typename S1::value_type);
|
||||||
ASSERT_SAME_TYPE(typename Span::value_type, typename S2::value_type);
|
ASSERT_SAME_TYPE(typename Span::value_type, typename S2::value_type);
|
||||||
static_assert(S1::extent == (Span::extent == std::dynamic_extent ? std::dynamic_extent : Count), "");
|
if constexpr (Count != std::dynamic_extent) {
|
||||||
|
static_assert(S1::extent == Count);
|
||||||
|
} else if constexpr (Span::extent != std::dynamic_extent) {
|
||||||
|
static_assert(S1::extent == Span::extent - Offset);
|
||||||
|
} else {
|
||||||
|
static_assert(S1::extent == std::dynamic_extent);
|
||||||
|
}
|
||||||
static_assert(S2::extent == std::dynamic_extent, "");
|
static_assert(S2::extent == std::dynamic_extent, "");
|
||||||
assert(s1.data() == s2.data());
|
assert(s1.data() == s2.data());
|
||||||
assert(s1.size() == s2.size());
|
assert(s1.size() == s2.size());
|
||||||
|
|
Loading…
Reference in New Issue