diff --git a/libcxx/include/sstream b/libcxx/include/sstream --- a/libcxx/include/sstream +++ b/libcxx/include/sstream @@ -399,8 +399,12 @@ _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 --- 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 @@ 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 --- 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 @@ 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 --- 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 @@ 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 --- 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 @@ 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**) {