2017-07-10 Jonathan Wakely <jwakely@redhat.com>
+ PR libstdc++/81381
+ * include/bits/sstream.tcc (basic_stringbuf::overflow)
+ (basic_stringbuf::basic_stringbuf(const __string_type&, ios::mode))
+ (basic_stringbuf::str()): Construct new strings with an allocator.
+ * testsuite/27_io/basic_stringbuf/cons/81381.cc: New.
+
PR libstdc++/81338
* include/bits/basic_string.h [_GLIBCXX_USE_CXX11_ABI] (basic_string):
Declare basic_stringbuf to be a friend.
const __size_type __opt_len = std::max(__size_type(2 * __capacity),
__size_type(512));
const __size_type __len = std::min(__opt_len, __max_size);
- __string_type __tmp;
+ __string_type __tmp(_M_string.get_allocator());
__tmp.reserve(__len);
if (this->pbase())
__tmp.assign(this->pbase(), this->epptr() - this->pbase());
explicit
basic_stringbuf(const __string_type& __str,
ios_base::openmode __mode = ios_base::in | ios_base::out)
- : __streambuf_type(), _M_mode(), _M_string(__str.data(), __str.size())
+ : __streambuf_type(), _M_mode(),
+ _M_string(__str.data(), __str.size(), __str.get_allocator())
{ _M_stringbuf_init(__mode); }
#if __cplusplus >= 201103L
__string_type
str() const
{
- __string_type __ret;
+ __string_type __ret(_M_string.get_allocator());
if (this->pptr())
{
// The current egptr() may not be the actual string end.
if (this->pptr() > this->egptr())
- __ret = __string_type(this->pbase(), this->pptr());
+ __ret.assign(this->pbase(), this->pptr());
else
- __ret = __string_type(this->pbase(), this->egptr());
+ __ret.assign(this->pbase(), this->egptr());
}
else
__ret = _M_string;
--- /dev/null
+// Copyright (C) 2017 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library. This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3. If not see
+// <http://www.gnu.org/licenses/>.
+
+// { dg-do run { target c++11 } }
+
+// PR libstdc++/81381
+
+#include <memory>
+#include <sstream>
+#include <testsuite_allocator.h>
+
+using Alloc = __gnu_test::uneq_allocator<char>;
+using String = std::basic_string<char, std::char_traits<char>, Alloc>;
+
+struct SB : std::basic_stringbuf<char, std::char_traits<char>, Alloc>
+{
+ SB(const String& s) : basic_stringbuf(s) { }
+
+ using basic_stringbuf::overflow;
+};
+
+int main()
+{
+ String s(Alloc(23));
+ SB b(s);
+ b.overflow('a');
+ VERIFY( b.str().get_allocator() == s.get_allocator() );
+}