Author: marshall Date: Wed Aug 2 10:31:09 2017 New Revision: 309838 URL: http://llvm.org/viewvc/llvm-project?rev=309838&view=rev Log: Fix PR33727: std::basic_stringbuf only works with DefaultConstructible allocators. Thanks to Jonathan Wakely for the report and suggested fix
Modified: libcxx/trunk/include/sstream libcxx/trunk/test/std/input.output/string.streams/stringstream.cons/string.pass.cpp Modified: libcxx/trunk/include/sstream URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/sstream?rev=309838&r1=309837&r2=309838&view=diff ============================================================================== --- libcxx/trunk/include/sstream (original) +++ libcxx/trunk/include/sstream Wed Aug 2 10:31:09 2017 @@ -249,7 +249,8 @@ basic_stringbuf<_CharT, _Traits, _Alloca 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); Modified: libcxx/trunk/test/std/input.output/string.streams/stringstream.cons/string.pass.cpp URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/input.output/string.streams/stringstream.cons/string.pass.cpp?rev=309838&r1=309837&r2=309838&view=diff ============================================================================== --- libcxx/trunk/test/std/input.output/string.streams/stringstream.cons/string.pass.cpp (original) +++ libcxx/trunk/test/std/input.output/string.streams/stringstream.cons/string.pass.cpp Wed Aug 2 10:31:09 2017 @@ -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()); + } } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits