diff options
author | Marshall Clow <mclow.lists@gmail.com> | 2017-08-02 17:31:09 +0000 |
---|---|---|
committer | Marshall Clow <mclow.lists@gmail.com> | 2017-08-02 17:31:09 +0000 |
commit | b3d6031a543a52d53cf4f4bbfaa5ee53d473a5ef (patch) | |
tree | 7278ae642c5f5698758a113cc8854def137c12f5 | |
parent | 4876a73b0a667032d66cee0e8e4d4a5d4083bf3b (diff) | |
download | libcxx-b3d6031a543a52d53cf4f4bbfaa5ee53d473a5ef.tar.gz |
Fix PR33727: std::basic_stringbuf only works with DefaultConstructible allocators. Thanks to Jonathan Wakely for the report and suggested fix
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@309838 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/sstream | 3 | ||||
-rw-r--r-- | test/std/input.output/string.streams/stringstream.cons/string.pass.cpp | 19 |
2 files changed, 21 insertions, 1 deletions
diff --git a/include/sstream b/include/sstream index b9903f961..fe65fd7db 100644 --- a/include/sstream +++ b/include/sstream @@ -249,7 +249,8 @@ basic_stringbuf<_CharT, _Traits, _Allocator>::basic_stringbuf(ios_base::openmode template <class _CharT, class _Traits, class _Allocator> basic_stringbuf<_CharT, _Traits, _Allocator>::basic_stringbuf(const string_type& __s, ios_base::openmode __wch) - : __hm_(0), + : __str_(__s.get_allocator()), + __hm_(0), __mode_(__wch) { str(__s); diff --git a/test/std/input.output/string.streams/stringstream.cons/string.pass.cpp b/test/std/input.output/string.streams/stringstream.cons/string.pass.cpp index 3776f17f5..43b9df686 100644 --- a/test/std/input.output/string.streams/stringstream.cons/string.pass.cpp +++ b/test/std/input.output/string.streams/stringstream.cons/string.pass.cpp @@ -18,6 +18,16 @@ #include <sstream> #include <cassert> +template<typename T> +struct NoDefaultAllocator : std::allocator<T> +{ + template<typename U> struct rebind { using other = NoDefaultAllocator<U>; }; + NoDefaultAllocator(int id) : id(id) { } + template<typename U> NoDefaultAllocator(const NoDefaultAllocator<U>& a) : id(a.id) { } + int id; +}; + + int main() { { @@ -46,4 +56,13 @@ int main() ss << i << ' ' << 123; assert(ss.str() == L"456 1236 "); } + { // This is https://bugs.llvm.org/show_bug.cgi?id=33727 + typedef std::basic_string <char, std::char_traits<char>, NoDefaultAllocator<char> > S; + typedef std::basic_stringbuf<char, std::char_traits<char>, NoDefaultAllocator<char> > SB; + + S s(NoDefaultAllocator<char>(1)); + SB sb(s); + // This test is not required by the standard, but *where else* could it get the allocator? + assert(sb.str().get_allocator() == s.get_allocator()); + } } |