From 2db67e97712e257d9784f4c3812432443f72145e Mon Sep 17 00:00:00 2001 From: Louis Dionne Date: Mon, 22 Nov 2021 16:44:50 -0500 Subject: [PATCH] [libc++] Fix the return value of max_size() I assume nobody ever uses std::string_view::max_size() outside of testing. However, we should still return a value that is based on something with a reasonable rationale. Previously, we would forget to take into account the size of the character type stored in the string, and this patch takes that into account. Thanks to @mclow.lists for pointing out this issue. Differential Revision: https://reviews.llvm.org/D114395 --- libcxx/include/string_view | 2 +- .../string.view.capacity/capacity.pass.cpp | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/libcxx/include/string_view b/libcxx/include/string_view index c40782d1ca8b..3861ad67ca5d 100644 --- a/libcxx/include/string_view +++ b/libcxx/include/string_view @@ -356,7 +356,7 @@ public: size_type length() const _NOEXCEPT { return __size; } _LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY - size_type max_size() const _NOEXCEPT { return numeric_limits::max(); } + size_type max_size() const _NOEXCEPT { return numeric_limits::max() / sizeof(value_type); } _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR bool empty() const _NOEXCEPT { return __size == 0; } diff --git a/libcxx/test/std/strings/string.view/string.view.capacity/capacity.pass.cpp b/libcxx/test/std/strings/string.view/string.view.capacity/capacity.pass.cpp index 2283ccab6d7c..0fdbe0e03ed2 100644 --- a/libcxx/test/std/strings/string.view/string.view.capacity/capacity.pass.cpp +++ b/libcxx/test/std/strings/string.view/string.view.capacity/capacity.pass.cpp @@ -16,6 +16,7 @@ #include #include +#include #include "test_macros.h" @@ -42,6 +43,16 @@ void test1 () { assert ( sv1.size() == sv1.length()); assert ( sv1.max_size() > sv1.size()); } + + // Sanity check max_size() -- a string_view can't store more bytes than a single object + // can contain. Any implementation that fails this check is certainly lying. + { + typedef typename SV::value_type CharT; + typedef typename SV::size_type Size; + SV sv; + assert(sv.max_size() <= std::numeric_limits::max() / sizeof(CharT)); + LIBCPP_ASSERT(sv.max_size() == std::numeric_limits::max() / sizeof(CharT)); + } } template