forked from OSchip/llvm-project
Fix PR33727: std::basic_stringbuf only works with DefaultConstructible allocators. Thanks to Jonathan Wakely for the report and suggested fix
llvm-svn: 309838
This commit is contained in:
parent
5a1dd7e990
commit
a054f828dd
|
@ -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);
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue