From 92a1f65f17d7a560c6ad388d9f2e8f1d77f6f04a Mon Sep 17 00:00:00 2001 From: Louis Dionne Date: Tue, 11 Feb 2020 11:57:35 +0100 Subject: [PATCH] [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 --- libcxx/include/span | 2 +- .../test/std/containers/views/span.sub/subspan.pass.cpp | 16 ++++++++++++++-- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/libcxx/include/span b/libcxx/include/span index f18d00c..a5362ca 100644 --- a/libcxx/include/span +++ b/libcxx/include/span @@ -444,7 +444,7 @@ public: template _LIBCPP_INLINE_VISIBILITY - constexpr span<_Tp, dynamic_extent> subspan() const noexcept + constexpr span subspan() const noexcept { _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()"); diff --git a/libcxx/test/std/containers/views/span.sub/subspan.pass.cpp b/libcxx/test/std/containers/views/span.sub/subspan.pass.cpp index caa7b56..e46dcc1 100644 --- a/libcxx/test/std/containers/views/span.sub/subspan.pass.cpp +++ b/libcxx/test/std/containers/views/span.sub/subspan.pass.cpp @@ -37,7 +37,13 @@ constexpr bool testConstexprSpan(Span sp) using S2 = decltype(s2); ASSERT_SAME_TYPE(typename Span::value_type, typename S1::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, ""); return s1.data() == s2.data() @@ -76,7 +82,13 @@ void testRuntimeSpan(Span sp) using S2 = decltype(s2); ASSERT_SAME_TYPE(typename Span::value_type, typename S1::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, ""); assert(s1.data() == s2.data()); assert(s1.size() == s2.size()); -- 2.7.4