From: Piotr Fusik Date: Tue, 1 Aug 2023 18:17:46 +0000 (+0200) Subject: [libc++] Fix `std::out_of_range` thrown from `basic_stringbuf::str() &&` X-Git-Tag: upstream/17.0.6~363 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=1f7ff62d055c8c848fb27aaa2595ae544fce2e69;p=platform%2Fupstream%2Fllvm.git [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) --- diff --git a/libcxx/include/sstream b/libcxx/include/sstream index d7ad0213eb34..81255c878f7f 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 7c8cf2c713db..546f82166aae 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 5fbdf81f0c08..57f2384bae52 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 f0fa330b4b60..0f0f540a9c24 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 a6b8ec6c37eb..35349c9c288e 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**) {