From 1f7ff62d055c8c848fb27aaa2595ae544fce2e69 Mon Sep 17 00:00:00 2001 From: Piotr Fusik Date: Tue, 1 Aug 2023 20:17:46 +0200 Subject: [PATCH] [libc++] Fix `std::out_of_range` thrown from `basic_stringbuf::str() &&` Reviewed By: #libc, Mordante, philnik Differential Revision: https://reviews.llvm.org/D156783 (cherry picked from commit f418cb1a9367d85c7c9b1aa93dc3fa60c8ef9849) --- libcxx/include/sstream | 6 +++++- .../istringstream/istringstream.members/str.move.pass.cpp | 6 ++++++ .../ostringstream/ostringstream.members/str.move.pass.cpp | 6 ++++++ .../string.streams/stringbuf/stringbuf.members/str.move.pass.cpp | 6 ++++++ .../stringstream/stringstream.members/str.move.pass.cpp | 6 ++++++ 5 files changed, 29 insertions(+), 1 deletion(-) diff --git a/libcxx/include/sstream b/libcxx/include/sstream index d7ad021..81255c8 100644 --- a/libcxx/include/sstream +++ b/libcxx/include/sstream @@ -399,8 +399,12 @@ public: _LIBCPP_HIDE_FROM_ABI_SSTREAM string_type str() const & { return str(__str_.get_allocator()); } _LIBCPP_HIDE_FROM_ABI_SSTREAM string_type str() && { + string_type __result; const basic_string_view<_CharT, _Traits> __view = view(); - string_type __result(std::move(__str_), __view.data() - __str_.data(), __view.size()); + if (!__view.empty()) { + auto __pos = __view.data() - __str_.data(); + __result.assign(std::move(__str_), __pos, __view.size()); + } __str_.clear(); __init_buf_ptrs(); return __result; diff --git a/libcxx/test/std/input.output/string.streams/istringstream/istringstream.members/str.move.pass.cpp b/libcxx/test/std/input.output/string.streams/istringstream/istringstream.members/str.move.pass.cpp index 7c8cf2c..546f821 100644 --- a/libcxx/test/std/input.output/string.streams/istringstream/istringstream.members/str.move.pass.cpp +++ b/libcxx/test/std/input.output/string.streams/istringstream/istringstream.members/str.move.pass.cpp @@ -31,6 +31,12 @@ static void test() { assert(s == STR("testing")); assert(ss.view().empty()); } + { + std::basic_istringstream ss; + std::basic_string s = std::move(ss).str(); + assert(s.empty()); + assert(ss.view().empty()); + } } int main(int, char**) { diff --git a/libcxx/test/std/input.output/string.streams/ostringstream/ostringstream.members/str.move.pass.cpp b/libcxx/test/std/input.output/string.streams/ostringstream/ostringstream.members/str.move.pass.cpp index 5fbdf81..57f2384 100644 --- a/libcxx/test/std/input.output/string.streams/ostringstream/ostringstream.members/str.move.pass.cpp +++ b/libcxx/test/std/input.output/string.streams/ostringstream/ostringstream.members/str.move.pass.cpp @@ -31,6 +31,12 @@ static void test() { assert(s == STR("testing")); assert(ss.view().empty()); } + { + std::basic_ostringstream ss; + std::basic_string s = std::move(ss).str(); + assert(s.empty()); + assert(ss.view().empty()); + } } int main(int, char**) { diff --git a/libcxx/test/std/input.output/string.streams/stringbuf/stringbuf.members/str.move.pass.cpp b/libcxx/test/std/input.output/string.streams/stringbuf/stringbuf.members/str.move.pass.cpp index f0fa330..0f0f540 100644 --- a/libcxx/test/std/input.output/string.streams/stringbuf/stringbuf.members/str.move.pass.cpp +++ b/libcxx/test/std/input.output/string.streams/stringbuf/stringbuf.members/str.move.pass.cpp @@ -31,6 +31,12 @@ static void test() { assert(s == STR("testing")); assert(buf.view().empty()); } + { + std::basic_stringbuf buf; + std::basic_string s = std::move(buf).str(); + assert(s.empty()); + assert(buf.view().empty()); + } } int main(int, char**) { diff --git a/libcxx/test/std/input.output/string.streams/stringstream/stringstream.members/str.move.pass.cpp b/libcxx/test/std/input.output/string.streams/stringstream/stringstream.members/str.move.pass.cpp index a6b8ec6..35349c9 100644 --- a/libcxx/test/std/input.output/string.streams/stringstream/stringstream.members/str.move.pass.cpp +++ b/libcxx/test/std/input.output/string.streams/stringstream/stringstream.members/str.move.pass.cpp @@ -31,6 +31,12 @@ static void test() { assert(s == STR("testing")); assert(ss.view().empty()); } + { + std::basic_stringstream ss; + std::basic_string s = std::move(ss).str(); + assert(s.empty()); + assert(ss.view().empty()); + } } int main(int, char**) { -- 2.7.4