diff mbox series

libstdc++: Implement C++20 features for <sstream>

Message ID 20201008011522.3233165-1-rodgert@appliantology.com
State New
Headers show
Series libstdc++: Implement C++20 features for <sstream> | expand

Commit Message

Thomas Rodgers Oct. 8, 2020, 1:15 a.m. UTC
From: Thomas Rodgers <trodgers@redhat.com>

New ctors and ::view() accessor for -
  * basic_stingbuf
  * basic_istringstream
  * basic_ostringstream
  * basic_stringstreamm

New ::get_allocator() accessor for basic_stringbuf.

libstdc++-v3/ChangeLog:
	* acinclude.m4 (glibcxx_SUBDIRS): Add src/c++20.
        * config/abi/pre/gnu.ver: Update GLIBCXX_3.4.29 for the addition of -
	basic_stringbuf::basic_stringbuf(allocator const&),
	basic_stringbuf::basic_stringbuf(openmode, allocator const&),
	basic_stringbuf::basic_stringbuf(basic_string&&, openmode),
	basic_stringbuf::basic_stringbuf(basic_stringbuf&&, allocator const&),
	basic_stringbuf::get_allocator(),
	basic_stringbuf::view(),
	basic_istringstream::basic_istringstream(basic_string&&, openmode),
	basic_istringstream::basic_istringstream(openmode, allocator const&),
	basic_istringstream::view(),
	basic_ostringstream::basic_ostringstream(basic_string&&, openmode),
	basic_ostringstream::basic_ostringstream(openmode, allocator const&),
	basic_ostringstream::view(),
	basic_stringstream::basic_stringstream(basic_string&&, openmode),
	basic_stringstream::basic_stringstream(openmode, allocator const&),
	basic_stringstream::view().
	* configure: Regenerate.
	* include/std/sstream:
	(basic_stringbuf::basic_stringbuf(allocator const&)): New constructor.
	(basic_stringbuf::basic_stringbuf(openmode, allocator const&)): Likewise.
	(basic_stringbuf::basic_stringbuf(basic_string&&, openmode)): Likewise.
	(basic_stringbuf::basic_stringbuf(basic_stringbuf&&, allocator const&)): Likewise.
	(basic_stringbuf::get_allocator()): New method.
	(basic_stringbuf::view()): Likewise.
	(basic_istringstream::basic_istringstream(basic_string&&, openmode)):
	New constructor.
	(basic_istringstream::basic_istringstream(openmode, allocator const&)):
	Likewise
	(basic_istringstream::view()): New method.
	(basic_ostringstream::basic_ostringstream(basic_string&&, openmode)):
	New constructor.
	(basic_ostringstream::basic_ostringstream(openmode, allocator const&)):
	Likewise
	(basic_ostringstream::view()): New method.
	(basic_stringstream::basic_stringstream(basic_string&&, openmode)):
	New constructor.
	(basic_stringstream::basic_stringstream(openmode, allocator const&)):
	Likewise
	(basic_stringstream::view()): New method.
	* src/Makefile.in: Add c++20 directory.
	* src/Makefile.am: Regenerate.
	* src/c++20/Makefile.am: Add makefile for new sub-directory.
	* src/c++20/Makefile.in: Generate.
	* src/c++20/sstream-inst.cc: New file defining explicit
	instantiations for basic_stringbuf, basic_istringstream,
	basic_ostringstream, and basic_stringstream member functions
	added in C++20.
	* testsuite/27_io/basic_stringbuf/cons/char/2.cc: New test.
	* testsuite/27_io/basic_stringbuf/cons/wchar_t/2.cc: Likewise.
	* testsuite/27_io/basic_stringbuf/view/char/2.cc: Likewise.
	* testsuite/27_io/basic_stringbuf/view/wchar_t/2.cc: Likewise.
	* testsuite/27_io/basic_istringstream/cons/char/2.cc: Likewise.
	* testsuite/27_io/basic_istringstream/cons/wchar_t/2.cc: Likewise.
	* testsuite/27_io/basic_istringstream/view/char/2.cc: Likewise.
	* testsuite/27_io/basic_istringstream/view/wchar_t/2.cc: Likewise.
	* testsuite/27_io/basic_ostringstream/cons/char/2.cc: Likewise.
	* testsuite/27_io/basic_ostringstream/cons/wchar_t/2.cc: Likewise.
	* testsuite/27_io/basic_ostringstream/view/char/2.cc: Likewise.
	* testsuite/27_io/basic_ostringstream/view/wchar_t/2.cc: Likewise.
	* testsuite/27_io/basic_stringstream/cons/char/2.cc: Likewise.
	* testsuite/27_io/basic_stringstream/cons/wchar_t/2.cc: Likewise.
	* testsuite/27_io/basic_stringstream/view/char/2.cc: Likewise.
	* testsuite/27_io/basic_stringstream/view/wchar_t/2.cc: Likewise.
---
 libstdc++-v3/acinclude.m4                     |   2 +-
 libstdc++-v3/config/abi/pre/gnu.ver           |  45 ++
 libstdc++-v3/configure                        |  16 +-
 libstdc++-v3/include/std/sstream              | 196 +++++
 libstdc++-v3/src/Makefile.am                  |  12 +-
 libstdc++-v3/src/Makefile.in                  |  14 +-
 libstdc++-v3/src/c++20/Makefile.am            | 105 +++
 libstdc++-v3/src/c++20/Makefile.in            | 735 ++++++++++++++++++
 libstdc++-v3/src/c++20/sstream-inst.cc        | 111 +++
 .../27_io/basic_istringstream/cons/char/1.cc  |  85 ++
 .../basic_istringstream/cons/wchar_t/1.cc     |  85 ++
 .../27_io/basic_istringstream/view/char/1.cc  |  35 +
 .../basic_istringstream/view/wchar_t/1.cc     |  35 +
 .../27_io/basic_ostringstream/cons/char/1.cc  |  85 ++
 .../basic_ostringstream/cons/wchar_t/1.cc     |  85 ++
 .../27_io/basic_ostringstream/view/char/1.cc  |  35 +
 .../basic_ostringstream/view/wchar_t/1.cc     |  35 +
 .../27_io/basic_stringbuf/cons/char/2.cc      | 121 +++
 .../27_io/basic_stringbuf/cons/wchar_t/2.cc   | 105 +++
 .../27_io/basic_stringbuf/view/char/1.cc      |  35 +
 .../27_io/basic_stringbuf/view/wchar_t/1.cc   |  35 +
 .../27_io/basic_stringstream/cons/char/1.cc   |  85 ++
 .../basic_stringstream/cons/wchar_t/1.cc      |  85 ++
 .../27_io/basic_stringstream/view/char/1.cc   |  35 +
 .../basic_stringstream/view/wchar_t/1.cc      |  35 +
 25 files changed, 2240 insertions(+), 12 deletions(-)
 create mode 100644 libstdc++-v3/src/c++20/Makefile.am
 create mode 100644 libstdc++-v3/src/c++20/Makefile.in
 create mode 100644 libstdc++-v3/src/c++20/sstream-inst.cc
 create mode 100644 libstdc++-v3/testsuite/27_io/basic_istringstream/cons/char/1.cc
 create mode 100644 libstdc++-v3/testsuite/27_io/basic_istringstream/cons/wchar_t/1.cc
 create mode 100644 libstdc++-v3/testsuite/27_io/basic_istringstream/view/char/1.cc
 create mode 100644 libstdc++-v3/testsuite/27_io/basic_istringstream/view/wchar_t/1.cc
 create mode 100644 libstdc++-v3/testsuite/27_io/basic_ostringstream/cons/char/1.cc
 create mode 100644 libstdc++-v3/testsuite/27_io/basic_ostringstream/cons/wchar_t/1.cc
 create mode 100644 libstdc++-v3/testsuite/27_io/basic_ostringstream/view/char/1.cc
 create mode 100644 libstdc++-v3/testsuite/27_io/basic_ostringstream/view/wchar_t/1.cc
 create mode 100644 libstdc++-v3/testsuite/27_io/basic_stringbuf/cons/char/2.cc
 create mode 100644 libstdc++-v3/testsuite/27_io/basic_stringbuf/cons/wchar_t/2.cc
 create mode 100644 libstdc++-v3/testsuite/27_io/basic_stringbuf/view/char/1.cc
 create mode 100644 libstdc++-v3/testsuite/27_io/basic_stringbuf/view/wchar_t/1.cc
 create mode 100644 libstdc++-v3/testsuite/27_io/basic_stringstream/cons/char/1.cc
 create mode 100644 libstdc++-v3/testsuite/27_io/basic_stringstream/cons/wchar_t/1.cc
 create mode 100644 libstdc++-v3/testsuite/27_io/basic_stringstream/view/char/1.cc
 create mode 100644 libstdc++-v3/testsuite/27_io/basic_stringstream/view/wchar_t/1.cc

Comments

Jonathan Wakely Oct. 8, 2020, 4:30 p.m. UTC | #1
On 07/10/20 18:15 -0700, Thomas Rodgers wrote:
>@@ -500,6 +576,40 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11
>       }
> #endif
>
>+#if __cplusplus > 201703L && _GLIBCXX_USE_CXX11_ABI
>+      basic_istringstream(ios_base::openmode __mode, const allocator_type& __a)
>+      : __istream_type(), _M_stringbuf(__mode | ios_base::in, __a)
>+      { this->init(&_M_stringbuf); }

All these & operators need to be std::__addressof(_M_stringbuf)
instead. _M_stringbuf potentially depends on program-defined types
(the traits and allocator classes) which means user namespaces are
considered for ADL and they could define a operator& that gets used.


>+
>+      explicit basic_istringstream(__string_type&& __str,
>+	                           ios_base::openmode __mode = ios_base::in )
>+      : __istream_type(), _M_stringbuf(std::move(__str), __mode | ios_base::in)
>+      { this->init(&_M_stringbuf); }
>+
>+      template<typename _SAlloc>
>+	basic_istringstream(const basic_string<_CharT, _Traits, _SAlloc>& __str,
>+			    const allocator_type& __a)
>+	: basic_istringstream(__str, ios_base::in, __a)
>+	{ }
>+
>+      using __sv_type = basic_string_view<char_type, traits_type>;

This typedef seems to only be used once. Might as well just use
basic_string_view<char_type, traits_type> directly in the return type
of view().

Similarly in basic_ostringstream and basic_stringstream.

>diff --git a/libstdc++-v3/src/c++20/Makefile.in b/libstdc++-v3/src/c++20/Makefile.in
>new file mode 100644
>index 00000000000..0e2de19ae59
>diff --git a/libstdc++-v3/src/c++20/sstream-inst.cc b/libstdc++-v3/src/c++20/sstream-inst.cc
>new file mode 100644
>index 00000000000..c419176ae8e
>--- /dev/null
>+++ b/libstdc++-v3/src/c++20/sstream-inst.cc
>@@ -0,0 +1,111 @@
>+// Explicit instantiation file.
>+
>+// Copyright (C) 1997-2020 Free Software Foundation, Inc.

Just 2020 here.

>+//
>+// 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.
>+
>+// Under Section 7 of GPL version 3, you are granted additional
>+// permissions described in the GCC Runtime Library Exception, version
>+// 3.1, as published by the Free Software Foundation.
>+
>+// You should have received a copy of the GNU General Public License and
>+// a copy of the GCC Runtime Library Exception along with this program;
>+// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
>+// <http://www.gnu.org/licenses/>.
>+
>+//
>+// ISO C++ 14882:
>+//
>+
>+#ifndef _GLIBCXX_USE_CXX11_ABI
>+// Instantiations in this file use the new SSO std::string ABI unless included
>+// by another file which defines _GLIBCXX_USE_CXX11_ABI=0.

This copy&pasted comment is misleading now if we're not actually going
to include it from another file to generate the old ABI symbols.

I think just define it unconditionally and add a comment saying that
these new symbols are only defines for the SSO string ABI.

>+# define _GLIBCXX_USE_CXX11_ABI 1
>+#endif
>+#include <sstream>
>+
>+namespace std _GLIBCXX_VISIBILITY(default)
>+{
>+_GLIBCXX_BEGIN_NAMESPACE_VERSION
>+
>+template basic_stringbuf<char>::basic_stringbuf(const allocator_type&);
>+template basic_stringbuf<char>::basic_stringbuf(ios_base::openmode,
>+						 const allocator_type&);
>+template basic_stringbuf<char>::basic_stringbuf(__string_type&&,
>+						 ios_base::openmode);
>+template basic_stringbuf<char>::basic_stringbuf(basic_stringbuf&&,
>+						 const allocator_type&);
>+template basic_stringbuf<char>::allocator_type
>+basic_stringbuf<char>::get_allocator() const noexcept;
>+template basic_stringbuf<char>::__sv_type

Looks like this would be a bit simpler if it just used string_view
here, not basic_stringbuf<char>::__sv_type, and wstring_view below
for the wchar_t specializations.

And you could use allocator<char> instead of
basic_stringbuf<char>::allocator_type.

That looks a little cleaner to me, but it's a matter of opinion.

That would be necessary anyway for the basic_*stringstream types if
they don't have the __sv_type any more.


>diff --git a/libstdc++-v3/testsuite/27_io/basic_istringstream/cons/char/1.cc b/libstdc++-v3/testsuite/27_io/basic_istringstream/cons/char/1.cc
>new file mode 100644
>index 00000000000..d93141fc232
>--- /dev/null
>+++ b/libstdc++-v3/testsuite/27_io/basic_istringstream/cons/char/1.cc
>@@ -0,0 +1,85 @@
>+// Copyright (C) 2020 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/>.
>+
>+// 27.7.1.1  basic_stringbuf constructors  [lib.stringbuf.cons]

These references are to the C++03 standard, but the functions being
tested are not in that standard, or that section.

It's 29.8.2.2 [stringbuf.cons] in the C++20 standard. To make these
references unambiguous I've switched to saying which standard (or
which Nxxxx working draft) the reference comes from, i.e.

// C++20 29.8.2.2  basic_stringbuf constructors  [stringbuf.cons]

One day I might write a script to add "C++03" or "C++11" to all the
old comments in old tests. When I drain my TODO list of other things.

I was expecting this patch to also add the five new overloads of
basic_stringbuf::str, but that can be added later. I don't think
adding those will change anything done in this patch.
Thomas Rodgers Oct. 9, 2020, 11:28 p.m. UTC | #2
Jonathan Wakely writes:

> On 07/10/20 18:15 -0700, Thomas Rodgers wrote:
>>@@ -500,6 +576,40 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11
>>       }
>> #endif
>>
>>+#if __cplusplus > 201703L && _GLIBCXX_USE_CXX11_ABI
>>+      basic_istringstream(ios_base::openmode __mode, const allocator_type& __a)
>>+      : __istream_type(), _M_stringbuf(__mode | ios_base::in, __a)
>>+      { this->init(&_M_stringbuf); }
>
> All these & operators need to be std::__addressof(_M_stringbuf)
> instead. _M_stringbuf potentially depends on program-defined types
> (the traits and allocator classes) which means user namespaces are
> considered for ADL and they could define a operator& that gets used.
>
>
>>+
>>+      explicit basic_istringstream(__string_type&& __str,
>>+	                           ios_base::openmode __mode = ios_base::in )
>>+      : __istream_type(), _M_stringbuf(std::move(__str), __mode | ios_base::in)
>>+      { this->init(&_M_stringbuf); }
>>+
>>+      template<typename _SAlloc>
>>+	basic_istringstream(const basic_string<_CharT, _Traits, _SAlloc>& __str,
>>+			    const allocator_type& __a)
>>+	: basic_istringstream(__str, ios_base::in, __a)
>>+	{ }
>>+
>>+      using __sv_type = basic_string_view<char_type, traits_type>;
>
> This typedef seems to only be used once. Might as well just use
> basic_string_view<char_type, traits_type> directly in the return type
> of view().
>
> Similarly in basic_ostringstream and basic_stringstream.
>
>>diff --git a/libstdc++-v3/src/c++20/Makefile.in b/libstdc++-v3/src/c++20/Makefile.in
>>new file mode 100644
>>index 00000000000..0e2de19ae59
>>diff --git a/libstdc++-v3/src/c++20/sstream-inst.cc b/libstdc++-v3/src/c++20/sstream-inst.cc
>>new file mode 100644
>>index 00000000000..c419176ae8e
>>--- /dev/null
>>+++ b/libstdc++-v3/src/c++20/sstream-inst.cc
>>@@ -0,0 +1,111 @@
>>+// Explicit instantiation file.
>>+
>>+// Copyright (C) 1997-2020 Free Software Foundation, Inc.
>
> Just 2020 here.
>
>>+//
>>+// 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.
>>+
>>+// Under Section 7 of GPL version 3, you are granted additional
>>+// permissions described in the GCC Runtime Library Exception, version
>>+// 3.1, as published by the Free Software Foundation.
>>+
>>+// You should have received a copy of the GNU General Public License and
>>+// a copy of the GCC Runtime Library Exception along with this program;
>>+// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
>>+// <http://www.gnu.org/licenses/>.
>>+
>>+//
>>+// ISO C++ 14882:
>>+//
>>+
>>+#ifndef _GLIBCXX_USE_CXX11_ABI
>>+// Instantiations in this file use the new SSO std::string ABI unless included
>>+// by another file which defines _GLIBCXX_USE_CXX11_ABI=0.
>
> This copy&pasted comment is misleading now if we're not actually going
> to include it from another file to generate the old ABI symbols.
>
> I think just define it unconditionally and add a comment saying that
> these new symbols are only defines for the SSO string ABI.
>
>>+# define _GLIBCXX_USE_CXX11_ABI 1
>>+#endif
>>+#include <sstream>
>>+
>>+namespace std _GLIBCXX_VISIBILITY(default)
>>+{
>>+_GLIBCXX_BEGIN_NAMESPACE_VERSION
>>+
>>+template basic_stringbuf<char>::basic_stringbuf(const allocator_type&);
>>+template basic_stringbuf<char>::basic_stringbuf(ios_base::openmode,
>>+						 const allocator_type&);
>>+template basic_stringbuf<char>::basic_stringbuf(__string_type&&,
>>+						 ios_base::openmode);
>>+template basic_stringbuf<char>::basic_stringbuf(basic_stringbuf&&,
>>+						 const allocator_type&);
>>+template basic_stringbuf<char>::allocator_type
>>+basic_stringbuf<char>::get_allocator() const noexcept;
>>+template basic_stringbuf<char>::__sv_type
>
> Looks like this would be a bit simpler if it just used string_view
> here, not basic_stringbuf<char>::__sv_type, and wstring_view below
> for the wchar_t specializations.
>
> And you could use allocator<char> instead of
> basic_stringbuf<char>::allocator_type.
>
> That looks a little cleaner to me, but it's a matter of opinion.
>
> That would be necessary anyway for the basic_*stringstream types if
> they don't have the __sv_type any more.
>
>
>>diff --git a/libstdc++-v3/testsuite/27_io/basic_istringstream/cons/char/1.cc b/libstdc++-v3/testsuite/27_io/basic_istringstream/cons/char/1.cc
>>new file mode 100644
>>index 00000000000..d93141fc232
>>--- /dev/null
>>+++ b/libstdc++-v3/testsuite/27_io/basic_istringstream/cons/char/1.cc
>>@@ -0,0 +1,85 @@
>>+// Copyright (C) 2020 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/>.
>>+
>>+// 27.7.1.1  basic_stringbuf constructors  [lib.stringbuf.cons]
>
> These references are to the C++03 standard, but the functions being
> tested are not in that standard, or that section.
>
> It's 29.8.2.2 [stringbuf.cons] in the C++20 standard. To make these
> references unambiguous I've switched to saying which standard (or
> which Nxxxx working draft) the reference comes from, i.e.
>
> // C++20 29.8.2.2  basic_stringbuf constructors  [stringbuf.cons]
>
> One day I might write a script to add "C++03" or "C++11" to all the
> old comments in old tests. When I drain my TODO list of other things.
>
> I was expecting this patch to also add the five new overloads of
> basic_stringbuf::str, but that can be added later. I don't think
> adding those will change anything done in this patch.

I'm happy to do that, follow up patch?
Jonathan Wakely Oct. 13, 2020, 4:46 p.m. UTC | #3
On 09/10/20 16:28 -0700, Thomas Rodgers via Libstdc++ wrote:
>
>Jonathan Wakely writes:
>
>> On 07/10/20 18:15 -0700, Thomas Rodgers wrote:
>>>@@ -500,6 +576,40 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11
>>>       }
>>> #endif
>>>
>>>+#if __cplusplus > 201703L && _GLIBCXX_USE_CXX11_ABI
>>>+      basic_istringstream(ios_base::openmode __mode, const allocator_type& __a)
>>>+      : __istream_type(), _M_stringbuf(__mode | ios_base::in, __a)
>>>+      { this->init(&_M_stringbuf); }
>>
>> All these & operators need to be std::__addressof(_M_stringbuf)
>> instead. _M_stringbuf potentially depends on program-defined types
>> (the traits and allocator classes) which means user namespaces are
>> considered for ADL and they could define a operator& that gets used.
>>
>>
>>>+
>>>+      explicit basic_istringstream(__string_type&& __str,
>>>+	                           ios_base::openmode __mode = ios_base::in )
>>>+      : __istream_type(), _M_stringbuf(std::move(__str), __mode | ios_base::in)
>>>+      { this->init(&_M_stringbuf); }
>>>+
>>>+      template<typename _SAlloc>
>>>+	basic_istringstream(const basic_string<_CharT, _Traits, _SAlloc>& __str,
>>>+			    const allocator_type& __a)
>>>+	: basic_istringstream(__str, ios_base::in, __a)
>>>+	{ }
>>>+
>>>+      using __sv_type = basic_string_view<char_type, traits_type>;
>>
>> This typedef seems to only be used once. Might as well just use
>> basic_string_view<char_type, traits_type> directly in the return type
>> of view().
>>
>> Similarly in basic_ostringstream and basic_stringstream.
>>
>>>diff --git a/libstdc++-v3/src/c++20/Makefile.in b/libstdc++-v3/src/c++20/Makefile.in
>>>new file mode 100644
>>>index 00000000000..0e2de19ae59
>>>diff --git a/libstdc++-v3/src/c++20/sstream-inst.cc b/libstdc++-v3/src/c++20/sstream-inst.cc
>>>new file mode 100644
>>>index 00000000000..c419176ae8e
>>>--- /dev/null
>>>+++ b/libstdc++-v3/src/c++20/sstream-inst.cc
>>>@@ -0,0 +1,111 @@
>>>+// Explicit instantiation file.
>>>+
>>>+// Copyright (C) 1997-2020 Free Software Foundation, Inc.
>>
>> Just 2020 here.
>>
>>>+//
>>>+// 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.
>>>+
>>>+// Under Section 7 of GPL version 3, you are granted additional
>>>+// permissions described in the GCC Runtime Library Exception, version
>>>+// 3.1, as published by the Free Software Foundation.
>>>+
>>>+// You should have received a copy of the GNU General Public License and
>>>+// a copy of the GCC Runtime Library Exception along with this program;
>>>+// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
>>>+// <http://www.gnu.org/licenses/>.
>>>+
>>>+//
>>>+// ISO C++ 14882:
>>>+//
>>>+
>>>+#ifndef _GLIBCXX_USE_CXX11_ABI
>>>+// Instantiations in this file use the new SSO std::string ABI unless included
>>>+// by another file which defines _GLIBCXX_USE_CXX11_ABI=0.
>>
>> This copy&pasted comment is misleading now if we're not actually going
>> to include it from another file to generate the old ABI symbols.
>>
>> I think just define it unconditionally and add a comment saying that
>> these new symbols are only defines for the SSO string ABI.
>>
>>>+# define _GLIBCXX_USE_CXX11_ABI 1
>>>+#endif
>>>+#include <sstream>
>>>+
>>>+namespace std _GLIBCXX_VISIBILITY(default)
>>>+{
>>>+_GLIBCXX_BEGIN_NAMESPACE_VERSION
>>>+
>>>+template basic_stringbuf<char>::basic_stringbuf(const allocator_type&);
>>>+template basic_stringbuf<char>::basic_stringbuf(ios_base::openmode,
>>>+						 const allocator_type&);
>>>+template basic_stringbuf<char>::basic_stringbuf(__string_type&&,
>>>+						 ios_base::openmode);
>>>+template basic_stringbuf<char>::basic_stringbuf(basic_stringbuf&&,
>>>+						 const allocator_type&);
>>>+template basic_stringbuf<char>::allocator_type
>>>+basic_stringbuf<char>::get_allocator() const noexcept;
>>>+template basic_stringbuf<char>::__sv_type
>>
>> Looks like this would be a bit simpler if it just used string_view
>> here, not basic_stringbuf<char>::__sv_type, and wstring_view below
>> for the wchar_t specializations.
>>
>> And you could use allocator<char> instead of
>> basic_stringbuf<char>::allocator_type.
>>
>> That looks a little cleaner to me, but it's a matter of opinion.
>>
>> That would be necessary anyway for the basic_*stringstream types if
>> they don't have the __sv_type any more.
>>
>>
>>>diff --git a/libstdc++-v3/testsuite/27_io/basic_istringstream/cons/char/1.cc b/libstdc++-v3/testsuite/27_io/basic_istringstream/cons/char/1.cc
>>>new file mode 100644
>>>index 00000000000..d93141fc232
>>>--- /dev/null
>>>+++ b/libstdc++-v3/testsuite/27_io/basic_istringstream/cons/char/1.cc
>>>@@ -0,0 +1,85 @@
>>>+// Copyright (C) 2020 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/>.
>>>+
>>>+// 27.7.1.1  basic_stringbuf constructors  [lib.stringbuf.cons]
>>
>> These references are to the C++03 standard, but the functions being
>> tested are not in that standard, or that section.
>>
>> It's 29.8.2.2 [stringbuf.cons] in the C++20 standard. To make these
>> references unambiguous I've switched to saying which standard (or
>> which Nxxxx working draft) the reference comes from, i.e.
>>
>> // C++20 29.8.2.2  basic_stringbuf constructors  [stringbuf.cons]
>>
>> One day I might write a script to add "C++03" or "C++11" to all the
>> old comments in old tests. When I drain my TODO list of other things.
>>
>> I was expecting this patch to also add the five new overloads of
>> basic_stringbuf::str, but that can be added later. I don't think
>> adding those will change anything done in this patch.
>
>I'm happy to do that, follow up patch?

Yes, keep it separate.
diff mbox series

Patch

diff --git a/libstdc++-v3/acinclude.m4 b/libstdc++-v3/acinclude.m4
index 133125ec4fa..b9452dd74cd 100644
--- a/libstdc++-v3/acinclude.m4
+++ b/libstdc++-v3/acinclude.m4
@@ -49,7 +49,7 @@  AC_DEFUN([GLIBCXX_CONFIGURE], [
   # Keep these sync'd with the list in Makefile.am.  The first provides an
   # expandable list at autoconf time; the second provides an expandable list
   # (i.e., shell variable) at configure time.
-  m4_define([glibcxx_SUBDIRS],[include libsupc++ src src/c++98 src/c++11 src/c++17 src/filesystem doc po testsuite python])
+  m4_define([glibcxx_SUBDIRS],[include libsupc++ src src/c++98 src/c++11 src/c++17 src/c++20 src/filesystem doc po testsuite python])
   SUBDIRS='glibcxx_SUBDIRS'
 
   # These need to be absolute paths, yet at the same time need to
diff --git a/libstdc++-v3/config/abi/pre/gnu.ver b/libstdc++-v3/config/abi/pre/gnu.ver
index 6a2b2da33f5..a782776bd5f 100644
--- a/libstdc++-v3/config/abi/pre/gnu.ver
+++ b/libstdc++-v3/config/abi/pre/gnu.ver
@@ -2325,6 +2325,51 @@  GLIBCXX_3.4.29 {
     # std::__throw_bad_array_new_length()
     _ZSt28__throw_bad_array_new_lengthv;
 
+    # basic_stringbuf::basic_stringbuf(allocator const&)
+    _ZNSt7__cxx1115basic_stringbufI[cw]St11char_traitsI[cw]ESaI[cw]EEC1ERKS3_;
+
+    # basic_stringbuf::basic_stringbuf(ios_base::openmode, allocator const&)
+    _ZNSt7__cxx1115basic_stringbufI[cw]St11char_traitsI[cw]ESaI[cw]EEC1ESt13_Ios_OpenmodeRKS3;
+
+    # basic_stringbuf::basic_stringbuf(basic_string&&, ios_base::openmode)
+    _ZNSt7__cxx1115basic_stringbufI[cw]St11char_traitsI[cw]ESaI[cw]EEC1EONS_12basic_stringI[cw]S2_S3_EESt13_Ios_Openmode;
+
+    # basic_stringbuf::basic_stringbuf(basic_stringbuf&&, allocator const&)
+    _ZNSt7__cxx1115basic_stringbufI[cw]St11char_traitsI[cw]ESaIcEEC1EOS4_RKS3_;
+
+    # basic_stringbuf::get_allocator()
+    _ZNKSt7__cxx1115basic_stringbufI[cw]St11char_traitsI[cw]ESaI[cw]EE13get_allocatorEv;
+
+    # basic_stringbuf::view()
+    _ZNKSt7__cxx1115basic_stringbufI[cw]St11char_traitsI[cw]ESaI[cw]EE4viewEv;
+
+    # basic_istringstream::basic_istringstream(basic_string&&, ios_base::openmode)
+    _ZNSt7__cxx1119basic_istringstreamI[cw]St11char_traitsI[cw]ESaIcEEC1EONS_12basic_stringI[cw]S2_S3_EESt13_Ios_Openmode;
+
+    # basic_istringstream::basic_istringstream(ios_base::openmode, allocator const&)
+    _ZNSt7__cxx1119basic_istringstreamI[cw]St11char_traitsI[cw]ESaI[cw]EEC1ESt13_Ios_OpenmodeRKS3_;
+
+    # basic_istringstream::view()
+    _ZNKSt7__cxx1119basic_istringstreamI[cw]St11char_traitsI[cw]ESaI[cw]EE4viewEv;
+
+    # basic_ostringstream::basic_ostringstream(basic_string&&, ios_base::openmode)
+    _ZNSt7__cxx1119basic_ostringstreamI[cw]St11char_traitsI[cw]ESaIcEEC1EONS_12basic_stringI[cw]S2_S3_EESt13_Ios_Openmode;
+
+    # basic_ostringstream::basic_ostringstream(ios_base::openmode, allocator const&)
+    _ZNSt7__cxx1119basic_ostringstreamI[cw]St11char_traitsI[cw]ESaIcEEC1ESt13_Ios_OpenmodeRKS3_;
+
+    # basic_ostringstream::view()
+    _ZNKSt7__cxx1119basic_ostringstreamI[cw]St11char_traitsI[cw]ESaI[cw]EE4viewEv;
+
+    # basic_stringstream::basic_stringstream(basic_string&&, ios_base::openmode)
+    _ZNSt7__cxx1119basic_stringstreamI[cw]St11char_traitsI[cw]ESaIcEEC1EONS_12basic_stringI[cw]S2_S3_EESt13_Ios_Openmode;
+
+    # basic_stringstream::basic_stringstream(ios_base::openmode, allocator const&)
+    _ZNSt7__cxx1119basic_stringstreamI[cw]St11char_traitsI[cw]ESaIcEEC1ESt13_Ios_OpenmodeRKS3_;
+
+    # basic_stringstream::view()
+    _ZNKSt7__cxx1119basic_stringstreamI[cw]St11char_traitsI[cw]ESaI[cw]EE4viewEv;
+
 } GLIBCXX_3.4.28;
 
 # Symbols in the support library (libsupc++) have their own tag.
diff --git a/libstdc++-v3/include/std/sstream b/libstdc++-v3/include/std/sstream
index 9cca54d17d1..09a572881c2 100644
--- a/libstdc++-v3/include/std/sstream
+++ b/libstdc++-v3/include/std/sstream
@@ -165,6 +165,55 @@  _GLIBCXX_BEGIN_NAMESPACE_CXX11
       }
 #endif
 
+#if __cplusplus > 201703L && _GLIBCXX_USE_CXX11_ABI
+      basic_stringbuf(const allocator_type& __a)
+      : basic_stringbuf(ios_base::in | std::ios_base::out, __a)
+      { }
+
+      basic_stringbuf(ios_base::openmode __mode,
+		      const allocator_type& __a)
+      : __streambuf_type(), _M_mode(__mode), _M_string(__a)
+      { }
+
+      explicit
+      basic_stringbuf(__string_type&& __s,
+	              ios_base::openmode __mode = ios_base::in
+						  | ios_base::out )
+      : __streambuf_type(), _M_mode(__mode), _M_string(move(__s))
+      { }
+
+      template<typename _SAlloc>
+      basic_stringbuf(const basic_string<_CharT, _Traits, _SAlloc>& __s,
+		      const allocator_type& __a )
+      : basic_stringbuf(__s, ios_base::in | std::ios_base::out, __a )
+      { }
+
+      using __sv_type = basic_string_view<char_type, traits_type>;
+
+      template<typename _SAlloc>
+      basic_stringbuf(const basic_string<_CharT, _Traits, _SAlloc>& __s,
+		      ios_base::openmode __mode,
+		      const allocator_type& __a)
+      : __streambuf_type(), _M_mode(__mode),
+      _M_string(static_cast<__sv_type>(__s), __a)
+      { }
+
+      template<typename _SAlloc>
+	explicit
+	basic_stringbuf(const basic_string<_CharT, _Traits, _SAlloc>& __s,
+	                ios_base::openmode __mode = ios_base::in
+						    | ios_base::out)
+	: basic_stringbuf(__s, __mode, allocator_type{})
+	{ }
+
+      basic_stringbuf(basic_stringbuf&& __rhs, const allocator_type& __a)
+      : basic_stringbuf(std::move(__rhs), __a, __xfer_bufptrs(__rhs, this))
+      { __rhs._M_sync(const_cast<char_type*>(__rhs._M_string.data()), 0, 0); }
+
+      allocator_type get_allocator() const noexcept
+      { return _M_string.get_allocator(); }
+#endif
+
       // Get and set:
       /**
        *  @brief  Copying out the string buffer.
@@ -207,6 +256,23 @@  _GLIBCXX_BEGIN_NAMESPACE_CXX11
 	_M_stringbuf_init(_M_mode);
       }
 
+#if __cplusplus > 201703L && _GLIBCXX_USE_CXX11_ABI
+      __sv_type
+      view() const noexcept
+      {
+	if (this->pptr())
+	  {
+	    // The current egptr() may not be the actual string end.
+	    if (this->pptr() > this->egptr())
+	      return __sv_type(this->pbase(), this->pptr());
+	    else
+	      return __sv_type(this->pbase(), this->egptr());
+	  }
+	else
+	  return static_cast<__sv_type>(_M_string);
+      }
+#endif
+
     protected:
       // Common initialization code goes here.
       void
@@ -369,6 +435,16 @@  _GLIBCXX_BEGIN_NAMESPACE_CXX11
       : __streambuf_type(static_cast<const __streambuf_type&>(__rhs)),
       _M_mode(__rhs._M_mode), _M_string(std::move(__rhs._M_string))
       { }
+
+#if __cplusplus > 201703L && _GLIBCXX_USE_CXX11_ABI
+      // The move constructor initializes an __xfer_bufptrs temporary then
+      // delegates to this constructor to performs moves during its lifetime.
+      basic_stringbuf(basic_stringbuf&& __rhs, const allocator_type& __a,
+		      __xfer_bufptrs&&)
+      : __streambuf_type(static_cast<const __streambuf_type&>(__rhs)),
+      _M_mode(__rhs._M_mode), _M_string(std::move(__rhs._M_string), __a)
+      { }
+#endif
 #endif
     };
 
@@ -500,6 +576,40 @@  _GLIBCXX_BEGIN_NAMESPACE_CXX11
       }
 #endif
 
+#if __cplusplus > 201703L && _GLIBCXX_USE_CXX11_ABI
+      basic_istringstream(ios_base::openmode __mode, const allocator_type& __a)
+      : __istream_type(), _M_stringbuf(__mode | ios_base::in, __a)
+      { this->init(&_M_stringbuf); }
+
+      explicit basic_istringstream(__string_type&& __str,
+	                           ios_base::openmode __mode = ios_base::in )
+      : __istream_type(), _M_stringbuf(std::move(__str), __mode | ios_base::in)
+      { this->init(&_M_stringbuf); }
+
+      template<typename _SAlloc>
+	basic_istringstream(const basic_string<_CharT, _Traits, _SAlloc>& __str,
+			    const allocator_type& __a)
+	: basic_istringstream(__str, ios_base::in, __a)
+	{ }
+
+      using __sv_type = basic_string_view<char_type, traits_type>;
+
+      template<typename _SAlloc>
+	basic_istringstream(const basic_string<_CharT, _Traits, _SAlloc>& __str,
+			    ios_base::openmode __mode,
+			    const allocator_type& __a)
+	: __istream_type(),
+	_M_stringbuf(__string_type(__str.data(), __str.size()),
+		     __mode | ios_base::in, __a)
+	{ this->init(&_M_stringbuf); }
+
+      template<typename _SAlloc>
+	explicit basic_istringstream(const basic_string<_CharT, _Traits, _SAlloc>& __str,
+	                             ios_base::openmode __mode = ios_base::in)
+	: basic_istringstream(__str, __mode, allocator_type())
+	{ }
+#endif
+
       // Members:
       /**
        *  @brief  Accessing the underlying buffer.
@@ -528,6 +638,12 @@  _GLIBCXX_BEGIN_NAMESPACE_CXX11
       void
       str(const __string_type& __s)
       { _M_stringbuf.str(__s); }
+
+#if __cplusplus > 201703L && _GLIBCXX_USE_CXX11_ABI
+      __sv_type
+      view() const noexcept
+      { return _M_stringbuf.view(); }
+#endif
     };
 
 
@@ -658,6 +774,40 @@  _GLIBCXX_BEGIN_NAMESPACE_CXX11
       }
 #endif
 
+#if __cplusplus > 201703L && _GLIBCXX_USE_CXX11_ABI
+      basic_ostringstream(ios_base::openmode __mode, const allocator_type& __a)
+      : __ostream_type(), _M_stringbuf(__mode | ios_base::out, __a)
+      { this->init(&_M_stringbuf); }
+
+      explicit basic_ostringstream(__string_type&& __str,
+	                           ios_base::openmode __mode = ios_base::out )
+      : __ostream_type(), _M_stringbuf(std::move(__str), __mode | ios_base::out)
+      { this->init(&_M_stringbuf); }
+
+      template<typename _SAlloc>
+	basic_ostringstream(const basic_string<_CharT, _Traits, _SAlloc>& __str,
+			    const allocator_type& __a)
+	: basic_ostringstream(__str, ios_base::out, __a)
+	{ }
+
+      using __sv_type = basic_string_view<char_type, traits_type>;
+
+      template<typename _SAlloc>
+	basic_ostringstream(const basic_string<_CharT, _Traits, _SAlloc>& __str,
+			    ios_base::openmode __mode,
+			    const allocator_type& __a)
+	: __ostream_type(),
+	_M_stringbuf(__string_type(__str.data(), __str.size()),
+		     __mode | ios_base::out, __a)
+	{ this->init(&_M_stringbuf); }
+
+      template<typename _SAlloc>
+	explicit basic_ostringstream(const basic_string<_CharT, _Traits, _SAlloc>& __str,
+	                             ios_base::openmode __mode = ios_base::out)
+	: basic_ostringstream(__str, __mode, allocator_type())
+	{ }
+#endif
+
       // Members:
       /**
        *  @brief  Accessing the underlying buffer.
@@ -686,6 +836,12 @@  _GLIBCXX_BEGIN_NAMESPACE_CXX11
       void
       str(const __string_type& __s)
       { _M_stringbuf.str(__s); }
+
+#if __cplusplus > 201703L && _GLIBCXX_USE_CXX11_ABI
+      __sv_type
+      view() const noexcept
+      { return _M_stringbuf.view(); }
+#endif
     };
 
 
@@ -812,6 +968,40 @@  _GLIBCXX_BEGIN_NAMESPACE_CXX11
       }
 #endif
 
+#if __cplusplus > 201703L && _GLIBCXX_USE_CXX11_ABI
+      basic_stringstream(ios_base::openmode __mode, const allocator_type& __a)
+      : __iostream_type(), _M_stringbuf(__mode, __a)
+      { this->init(&_M_stringbuf); }
+
+      explicit basic_stringstream(__string_type&& __str,
+	                          ios_base::openmode __mode = ios_base::out
+							      | ios_base::out)
+      : __iostream_type(), _M_stringbuf(std::move(__str), __mode)
+      { this->init(&_M_stringbuf); }
+
+      template<typename _SAlloc>
+	basic_stringstream(const basic_string<_CharT, _Traits, _SAlloc>& __str,
+			   const allocator_type& __a)
+	: basic_stringstream(__str, ios_base::in | ios_base::out, __a)
+	{ }
+
+      using __sv_type = basic_string_view<char_type, traits_type>;
+
+      template<typename _SAlloc>
+	basic_stringstream(const basic_string<_CharT, _Traits, _SAlloc>& __str,
+			   ios_base::openmode __mode, const allocator_type& __a)
+	: __iostream_type(),
+	_M_stringbuf(__string_type(__str.data(), __str.size()), __mode, __a)
+	{ this->init(&_M_stringbuf); }
+
+      template<typename _SAlloc>
+	explicit basic_stringstream(const basic_string<_CharT, _Traits, _SAlloc>& __str,
+	                            ios_base::openmode __mode = ios_base::in
+								| ios_base::out)
+	: basic_stringstream(__str, __mode, allocator_type())
+	{ }
+#endif
+
       // Members:
       /**
        *  @brief  Accessing the underlying buffer.
@@ -840,6 +1030,12 @@  _GLIBCXX_BEGIN_NAMESPACE_CXX11
       void
       str(const __string_type& __s)
       { _M_stringbuf.str(__s); }
+
+#if __cplusplus > 201703L && _GLIBCXX_USE_CXX11_ABI
+      __sv_type
+      view() const noexcept
+      { return _M_stringbuf.view(); }
+#endif
     };
 
 #if __cplusplus >= 201103L
diff --git a/libstdc++-v3/src/Makefile.am b/libstdc++-v3/src/Makefile.am
index a139adc81b3..9a6807ae8c6 100644
--- a/libstdc++-v3/src/Makefile.am
+++ b/libstdc++-v3/src/Makefile.am
@@ -29,7 +29,7 @@  filesystem_dir =
 endif
 
 ## Keep this list sync'd with acinclude.m4:GLIBCXX_CONFIGURE.
-SUBDIRS = c++98 c++11 c++17 $(filesystem_dir)
+SUBDIRS = c++98 c++11 c++17 c++20 $(filesystem_dir)
 
 # Cross compiler support.
 if VTV_CYGMIN
@@ -60,6 +60,7 @@  endif
 vpath % $(top_srcdir)/src/c++98
 vpath % $(top_srcdir)/src/c++11
 vpath % $(top_srcdir)/src/c++17
+vpath % $(top_srcdir)/src/c++20
 if ENABLE_FILESYSTEM_TS
 vpath % $(top_srcdir)/src/filesystem
 endif
@@ -95,14 +96,16 @@  libstdc___la_LIBADD = \
 	$(top_builddir)/libsupc++/libsupc++convenience.la \
 	$(top_builddir)/src/c++98/libc++98convenience.la \
 	$(top_builddir)/src/c++11/libc++11convenience.la \
-	$(top_builddir)/src/c++17/libc++17convenience.la
+	$(top_builddir)/src/c++17/libc++17convenience.la \
+	$(top_builddir)/src/c++20/libc++20convenience.la
 
 libstdc___la_DEPENDENCIES = \
 	${version_dep} \
 	$(top_builddir)/libsupc++/libsupc++convenience.la \
 	$(top_builddir)/src/c++98/libc++98convenience.la \
 	$(top_builddir)/src/c++11/libc++11convenience.la \
-	$(top_builddir)/src/c++17/libc++17convenience.la
+	$(top_builddir)/src/c++17/libc++17convenience.la \
+	$(top_builddir)/src/c++20/libc++20convenience.la
 
 libstdc___la_LDFLAGS = \
 	-version-info $(libtool_VERSION) ${version_arg} -lm
@@ -153,7 +156,8 @@  compatibility-condvar.o: compatibility-condvar.cc
 # segregated in the sources with -D_GLIBCXX_SHARED.
 #
 # In the sub-directories of libsupc++, src/c++98, src/c++11, src/c++17,
-# only -prefer-pic objects are generated for the convenience libraries.
+# src/c++20, only -prefer-pic objects are generated for the convenience
+# libraries.
 #
 # In the main src directory, make shared and static objects just for
 # the compat libraries. Shared objects are compiled with -prefer-pic
diff --git a/libstdc++-v3/src/c++20/Makefile.am b/libstdc++-v3/src/c++20/Makefile.am
new file mode 100644
index 00000000000..423a79f3686
--- /dev/null
+++ b/libstdc++-v3/src/c++20/Makefile.am
@@ -0,0 +1,105 @@ 
+## Makefile for the C++20 sources of the GNU C++ Standard library.
+##
+## Copyright (C) 1997-2020 Free Software Foundation, Inc.
+##
+## This file is part of the libstdc++ version 3 distribution.
+## Process this file with automake to produce Makefile.in.
+
+## 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/>.
+
+include $(top_srcdir)/fragment.am
+
+# Convenience library for C++17 runtime.
+noinst_LTLIBRARIES = libc++20convenience.la
+
+headers =
+
+if ENABLE_EXTERN_TEMPLATE
+# XTEMPLATE_FLAGS = -fno-implicit-templates
+inst_sources = \
+	sstream-inst.cc
+else
+# XTEMPLATE_FLAGS =
+inst_sources =
+endif
+
+sources =
+
+vpath % $(top_srcdir)/src/c++20
+
+libc__20convenience_la_SOURCES = $(sources)  $(inst_sources)
+
+# AM_CXXFLAGS needs to be in each subdirectory so that it can be
+# modified in a per-library or per-sub-library way.  Need to manually
+# set this option because CONFIG_CXXFLAGS has to be after
+# OPTIMIZE_CXXFLAGS on the compile line so that -O2 can be overridden
+# as the occasion calls for it.
+AM_CXXFLAGS = \
+	-std=gnu++20 \
+	$(glibcxx_lt_pic_flag) $(glibcxx_compiler_shared_flag) \
+	$(XTEMPLATE_FLAGS) $(VTV_CXXFLAGS) \
+	$(WARN_CXXFLAGS) $(OPTIMIZE_CXXFLAGS) $(CONFIG_CXXFLAGS) \
+	-fimplicit-templates
+
+AM_MAKEFLAGS = \
+	"gxx_include_dir=$(gxx_include_dir)"
+
+# Libtool notes
+
+# 1) In general, libtool expects an argument such as `--tag=CXX' when
+# using the C++ compiler, because that will enable the settings
+# detected when C++ support was being configured.  However, when no
+# such flag is given in the command line, libtool attempts to figure
+# it out by matching the compiler name in each configuration section
+# against a prefix of the command line.  The problem is that, if the
+# compiler name and its initial flags stored in the libtool
+# configuration file don't match those in the command line, libtool
+# can't decide which configuration to use, and it gives up.  The
+# correct solution is to add `--tag CXX' to LTCXXCOMPILE and maybe
+# CXXLINK, just after $(LIBTOOL), so that libtool doesn't have to
+# attempt to infer which configuration to use.
+#
+# The second tag argument, `--tag disable-shared` means that libtool
+# only compiles each source once, for static objects. In actuality,
+# glibcxx_lt_pic_flag and glibcxx_compiler_shared_flag are added to
+# the libtool command that is used create the object, which is
+# suitable for shared libraries.  The `--tag disable-shared` must be
+# placed after --tag CXX lest things CXX undo the affect of
+# disable-shared.
+
+# 2) Need to explicitly set LTCXXCOMPILE so that EXTRA_CXX_FLAGS is
+# last. (That way, things like -O2 passed down from the toplevel can
+# be overridden by --enable-debug.)
+LTCXXCOMPILE = \
+	$(LIBTOOL) --tag CXX --tag disable-shared \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=compile $(CXX) $(TOPLEVEL_INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) $(EXTRA_CXX_FLAGS)
+
+LTLDFLAGS = $(shell $(SHELL) $(top_srcdir)/../libtool-ldflags $(LDFLAGS))
+
+# 3) We'd have a problem when building the shared libstdc++ object if
+# the rules automake generates would be used.  We cannot allow g++ to
+# be used since this would add -lstdc++ to the link line which of
+# course is problematic at this point.  So, we get the top-level
+# directory to configure libstdc++-v3 to use gcc as the C++
+# compilation driver.
+CXXLINK = \
+	$(LIBTOOL) --tag CXX --tag disable-shared \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=link $(CXX) \
+	$(VTV_CXXLINKFLAGS) \
+	$(OPT_LDFLAGS) $(SECTION_LDFLAGS) $(AM_CXXFLAGS) $(LTLDFLAGS) -o $@
diff --git a/libstdc++-v3/src/c++20/Makefile.in b/libstdc++-v3/src/c++20/Makefile.in
new file mode 100644
index 00000000000..0e2de19ae59
diff --git a/libstdc++-v3/src/c++20/sstream-inst.cc b/libstdc++-v3/src/c++20/sstream-inst.cc
new file mode 100644
index 00000000000..c419176ae8e
--- /dev/null
+++ b/libstdc++-v3/src/c++20/sstream-inst.cc
@@ -0,0 +1,111 @@ 
+// Explicit instantiation file.
+
+// Copyright (C) 1997-2020 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.
+
+// Under Section 7 of GPL version 3, you are granted additional
+// permissions described in the GCC Runtime Library Exception, version
+// 3.1, as published by the Free Software Foundation.
+
+// You should have received a copy of the GNU General Public License and
+// a copy of the GCC Runtime Library Exception along with this program;
+// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
+// <http://www.gnu.org/licenses/>.
+
+//
+// ISO C++ 14882:
+//
+
+#ifndef _GLIBCXX_USE_CXX11_ABI
+// Instantiations in this file use the new SSO std::string ABI unless included
+// by another file which defines _GLIBCXX_USE_CXX11_ABI=0.
+# define _GLIBCXX_USE_CXX11_ABI 1
+#endif
+#include <sstream>
+
+namespace std _GLIBCXX_VISIBILITY(default)
+{
+_GLIBCXX_BEGIN_NAMESPACE_VERSION
+
+template basic_stringbuf<char>::basic_stringbuf(const allocator_type&);
+template basic_stringbuf<char>::basic_stringbuf(ios_base::openmode,
+						 const allocator_type&);
+template basic_stringbuf<char>::basic_stringbuf(__string_type&&,
+						 ios_base::openmode);
+template basic_stringbuf<char>::basic_stringbuf(basic_stringbuf&&,
+						 const allocator_type&);
+template basic_stringbuf<char>::allocator_type
+basic_stringbuf<char>::get_allocator() const noexcept;
+template basic_stringbuf<char>::__sv_type
+basic_stringbuf<char>::view() const noexcept;
+
+
+template basic_istringstream<char>::basic_istringstream(ios_base::openmode,
+							 const allocator_type&);
+template basic_istringstream<char>::basic_istringstream(__string_type&&,
+							 ios_base::openmode);
+template basic_istringstream<char>::__sv_type
+basic_istringstream<char>::view() const noexcept;
+
+template basic_ostringstream<char>::basic_ostringstream(ios_base::openmode,
+							 const allocator_type&);
+template basic_ostringstream<char>::basic_ostringstream(__string_type&&,
+							 ios_base::openmode);
+template basic_ostringstream<char>::__sv_type
+basic_ostringstream<char>::view() const noexcept;
+
+template basic_stringstream<char>::basic_stringstream(ios_base::openmode,
+						       const allocator_type&);
+template basic_stringstream<char>::basic_stringstream(__string_type&&,
+						       ios_base::openmode);
+template basic_stringstream<char>::__sv_type
+basic_stringstream<char>::view() const noexcept;
+
+#ifdef _GLIBCXX_USE_WCHAR_T
+template basic_stringbuf<wchar_t>::basic_stringbuf(const allocator_type&);
+template basic_stringbuf<wchar_t>::basic_stringbuf(ios_base::openmode,
+						    const allocator_type&);
+template basic_stringbuf<wchar_t>::basic_stringbuf(__string_type&&,
+						    ios_base::openmode);
+template basic_stringbuf<wchar_t>::basic_stringbuf(basic_stringbuf&&,
+						    const allocator_type&);
+template basic_stringbuf<wchar_t>::allocator_type
+basic_stringbuf<wchar_t>::get_allocator() const noexcept;
+
+template basic_stringbuf<wchar_t>::__sv_type
+basic_stringbuf<wchar_t>::view() const noexcept;
+
+template basic_istringstream<wchar_t>::basic_istringstream(ios_base::openmode,
+							    const allocator_type&);
+template basic_istringstream<wchar_t>::basic_istringstream(__string_type&&,
+							    ios_base::openmode);
+template basic_istringstream<wchar_t>::__sv_type
+basic_istringstream<wchar_t>::view() const noexcept;
+
+template basic_ostringstream<wchar_t>::basic_ostringstream(ios_base::openmode,
+							    const allocator_type&);
+template basic_ostringstream<wchar_t>::basic_ostringstream(__string_type&&,
+							    ios_base::openmode);
+template basic_ostringstream<wchar_t>::__sv_type
+basic_ostringstream<wchar_t>::view() const noexcept;
+
+template basic_stringstream<wchar_t>::basic_stringstream(ios_base::openmode,
+							  const allocator_type&);
+template basic_stringstream<wchar_t>::basic_stringstream(__string_type&&,
+							  ios_base::openmode);
+template basic_stringstream<wchar_t>::__sv_type
+basic_stringstream<wchar_t>::view() const noexcept;
+#endif
+
+_GLIBCXX_END_NAMESPACE_VERSION
+}
diff --git a/libstdc++-v3/testsuite/27_io/basic_istringstream/cons/char/1.cc b/libstdc++-v3/testsuite/27_io/basic_istringstream/cons/char/1.cc
new file mode 100644
index 00000000000..d93141fc232
--- /dev/null
+++ b/libstdc++-v3/testsuite/27_io/basic_istringstream/cons/char/1.cc
@@ -0,0 +1,85 @@ 
+// Copyright (C) 2020 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/>.
+
+// 27.7.1.1  basic_stringbuf constructors  [lib.stringbuf.cons]
+
+// { dg-options "-std=gnu++2a" }
+// { dg-do run { target c++2a } }
+// { dg-require-effective-target cxx11-abi }
+
+#include <sstream>
+#include <string>
+#include <testsuite_allocator.h>
+#include <testsuite_hooks.h>
+
+void
+test01()
+{
+  std::istringstream::allocator_type a;
+  std::istringstream stm(std::ios_base::in, a);
+}
+
+auto const cstr = "This is a test";
+
+void
+test02()
+{
+  std::string s1(cstr);
+  std::istringstream stm(std::move(s1));
+  VERIFY( s1.empty() );
+
+  std::string s2(cstr);
+  VERIFY( stm.str() == s2 );
+}
+
+void
+test03()
+{
+  using alloc_type = __gnu_test::tracker_allocator<char>;
+  using str_type = std::basic_string<char, std::char_traits<char>, alloc_type>;
+
+  auto const mode = std::ios_base::in;
+  str_type s1(cstr);
+
+  {
+    std::istringstream::allocator_type a;
+    std::istringstream sbuf(s1, mode, a);
+    std::string s2(cstr);
+    VERIFY( sbuf.str() == s2 );
+  }
+
+  {
+    std::istringstream sbuf(s1, mode);
+    std::string s2(cstr);
+    VERIFY( sbuf.str() == s2 );
+  }
+
+  {
+    std::istringstream sbuf(s1);
+    std::string s2(cstr);
+    VERIFY( sbuf.str() == s2 );
+  }
+}
+
+int
+main()
+{
+  test01();
+  test02();
+  test03();
+  return 0;
+}
diff --git a/libstdc++-v3/testsuite/27_io/basic_istringstream/cons/wchar_t/1.cc b/libstdc++-v3/testsuite/27_io/basic_istringstream/cons/wchar_t/1.cc
new file mode 100644
index 00000000000..f89402fd24e
--- /dev/null
+++ b/libstdc++-v3/testsuite/27_io/basic_istringstream/cons/wchar_t/1.cc
@@ -0,0 +1,85 @@ 
+// Copyright (C) 2020 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/>.
+
+// 27.7.1.1  basic_stringbuf constructors  [lib.stringbuf.cons]
+
+// { dg-options "-std=gnu++2a" }
+// { dg-do run { target c++2a } }
+// { dg-require-effective-target cxx11-abi }
+
+#include <sstream>
+#include <string>
+#include <testsuite_allocator.h>
+#include <testsuite_hooks.h>
+
+void
+test01()
+{
+  std::wistringstream::allocator_type a;
+  std::wistringstream stm(std::ios_base::in, a);
+}
+
+auto const cstr = L"This is a test";
+
+void
+test02()
+{
+  std::wstring s1(cstr);
+  std::wistringstream stm(std::move(s1));
+  VERIFY( s1.empty() );
+
+  std::wstring s2(cstr);
+  VERIFY( stm.str() == s2 );
+}
+
+void
+test03()
+{
+  using alloc_type = __gnu_test::tracker_allocator<wchar_t>;
+  using str_type = std::basic_string<wchar_t, std::char_traits<wchar_t>, alloc_type>;
+
+  auto const mode = std::ios_base::in;
+  str_type s1(cstr);
+
+  {
+    std::wistringstream::allocator_type a;
+    std::wistringstream sbuf(s1, mode, a);
+    std::wstring s2(cstr);
+    VERIFY( sbuf.str() == s2 );
+  }
+
+  {
+    std::wistringstream sbuf(s1, mode);
+    std::wstring s2(cstr);
+    VERIFY( sbuf.str() == s2 );
+  }
+
+  {
+    std::wistringstream sbuf(s1);
+    std::wstring s2(cstr);
+    VERIFY( sbuf.str() == s2 );
+  }
+}
+
+int
+main()
+{
+  test01();
+  test02();
+  test03();
+  return 0;
+}
diff --git a/libstdc++-v3/testsuite/27_io/basic_istringstream/view/char/1.cc b/libstdc++-v3/testsuite/27_io/basic_istringstream/view/char/1.cc
new file mode 100644
index 00000000000..091de5f7a79
--- /dev/null
+++ b/libstdc++-v3/testsuite/27_io/basic_istringstream/view/char/1.cc
@@ -0,0 +1,35 @@ 
+// Copyright (C) 2020 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/>.
+
+// 27.7.1.1  basic_stringbuf constructors  [lib.stringbuf.cons]
+
+// { dg-options "-std=gnu++2a" }
+// { dg-do run { target c++2a } }
+// { dg-require-effective-target cxx11-abi }
+
+#include <sstream>
+#include <string_view>
+#include <testsuite_hooks.h>
+
+int
+main()
+{
+  std::string s("This is a test");
+  std::istringstream stm(s);
+  VERIFY( stm.view() == s );
+  return 0;
+}
diff --git a/libstdc++-v3/testsuite/27_io/basic_istringstream/view/wchar_t/1.cc b/libstdc++-v3/testsuite/27_io/basic_istringstream/view/wchar_t/1.cc
new file mode 100644
index 00000000000..f6599643bd9
--- /dev/null
+++ b/libstdc++-v3/testsuite/27_io/basic_istringstream/view/wchar_t/1.cc
@@ -0,0 +1,35 @@ 
+// Copyright (C) 2020 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/>.
+
+// 27.7.1.1  basic_stringbuf constructors  [lib.stringbuf.cons]
+
+// { dg-options "-std=gnu++2a" }
+// { dg-do run { target c++2a } }
+// { dg-require-effective-target cxx11-abi }
+
+#include <sstream>
+#include <string_view>
+#include <testsuite_hooks.h>
+
+int
+main()
+{
+  std::wstring s(L"This is a test");
+  std::wistringstream stm(s);
+  VERIFY( stm.view() == s );
+  return 0;
+}
diff --git a/libstdc++-v3/testsuite/27_io/basic_ostringstream/cons/char/1.cc b/libstdc++-v3/testsuite/27_io/basic_ostringstream/cons/char/1.cc
new file mode 100644
index 00000000000..bfc026de65e
--- /dev/null
+++ b/libstdc++-v3/testsuite/27_io/basic_ostringstream/cons/char/1.cc
@@ -0,0 +1,85 @@ 
+// Copyright (C) 2020 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/>.
+
+// 27.7.1.1  basic_stringbuf constructors  [lib.stringbuf.cons]
+
+// { dg-options "-std=gnu++2a" }
+// { dg-do run { target c++2a } }
+// { dg-require-effective-target cxx11-abi }
+
+#include <sstream>
+#include <string>
+#include <testsuite_allocator.h>
+#include <testsuite_hooks.h>
+
+void
+test01()
+{
+  std::ostringstream::allocator_type a;
+  std::ostringstream stm(std::ios_base::in, a);
+}
+
+auto const cstr = "This is a test";
+
+void
+test02()
+{
+  std::string s1(cstr);
+  std::ostringstream stm(std::move(s1));
+  VERIFY( s1.empty() );
+
+  std::string s2(cstr);
+  VERIFY( stm.str() == s2 );
+}
+
+void
+test03()
+{
+  using alloc_type = __gnu_test::tracker_allocator<char>;
+  using str_type = std::basic_string<char, std::char_traits<char>, alloc_type>;
+
+  auto const mode = std::ios_base::out;
+  str_type s1(cstr);
+
+  {
+    std::ostringstream::allocator_type a;
+    std::ostringstream sbuf(s1, mode, a);
+    std::string s2(cstr);
+    VERIFY( sbuf.str() == s2 );
+  }
+
+  {
+    std::ostringstream sbuf(s1, mode);
+    std::string s2(cstr);
+    VERIFY( sbuf.str() == s2 );
+  }
+
+  {
+    std::ostringstream sbuf(s1);
+    std::string s2(cstr);
+    VERIFY( sbuf.str() == s2 );
+  }
+}
+
+int
+main()
+{
+  test01();
+  test02();
+  test03();
+  return 0;
+}
diff --git a/libstdc++-v3/testsuite/27_io/basic_ostringstream/cons/wchar_t/1.cc b/libstdc++-v3/testsuite/27_io/basic_ostringstream/cons/wchar_t/1.cc
new file mode 100644
index 00000000000..07b2613cbbb
--- /dev/null
+++ b/libstdc++-v3/testsuite/27_io/basic_ostringstream/cons/wchar_t/1.cc
@@ -0,0 +1,85 @@ 
+// Copyright (C) 2020 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/>.
+
+// 27.7.1.1  basic_stringbuf constructors  [lib.stringbuf.cons]
+
+// { dg-options "-std=gnu++2a" }
+// { dg-do run { target c++2a } }
+// { dg-require-effective-target cxx11-abi }
+
+#include <sstream>
+#include <string>
+#include <testsuite_allocator.h>
+#include <testsuite_hooks.h>
+
+void
+test01()
+{
+  std::wostringstream::allocator_type a;
+  std::wostringstream stm(std::ios_base::out, a);
+}
+
+auto const cstr = L"This is a test";
+
+void
+test02()
+{
+  std::wstring s1(cstr);
+  std::wostringstream stm(std::move(s1));
+  VERIFY( s1.empty() );
+
+  std::wstring s2(cstr);
+  VERIFY( stm.str() == s2 );
+}
+
+void
+test03()
+{
+  using alloc_type = __gnu_test::tracker_allocator<wchar_t>;
+  using str_type = std::basic_string<wchar_t, std::char_traits<wchar_t>, alloc_type>;
+
+  auto const mode = std::ios_base::out;
+  str_type s1(cstr);
+
+  {
+    std::wostringstream::allocator_type a;
+    std::wostringstream sbuf(s1, mode, a);
+    std::wstring s2(cstr);
+    VERIFY( sbuf.str() == s2 );
+  }
+
+  {
+    std::wostringstream sbuf(s1, mode);
+    std::wstring s2(cstr);
+    VERIFY( sbuf.str() == s2 );
+  }
+
+  {
+    std::wostringstream sbuf(s1);
+    std::wstring s2(cstr);
+    VERIFY( sbuf.str() == s2 );
+  }
+}
+
+int
+main()
+{
+  test01();
+  test02();
+  test03();
+  return 0;
+}
diff --git a/libstdc++-v3/testsuite/27_io/basic_ostringstream/view/char/1.cc b/libstdc++-v3/testsuite/27_io/basic_ostringstream/view/char/1.cc
new file mode 100644
index 00000000000..a366363abb5
--- /dev/null
+++ b/libstdc++-v3/testsuite/27_io/basic_ostringstream/view/char/1.cc
@@ -0,0 +1,35 @@ 
+// Copyright (C) 2020 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/>.
+
+// 27.7.1.1  basic_stringbuf constructors  [lib.stringbuf.cons]
+
+// { dg-options "-std=gnu++2a" }
+// { dg-do run { target c++2a } }
+// { dg-require-effective-target cxx11-abi }
+
+#include <sstream>
+#include <string_view>
+#include <testsuite_hooks.h>
+
+int
+main()
+{
+  std::string s("This is a test");
+  std::ostringstream stm(s);
+  VERIFY( stm.view() == s );
+  return 0;
+}
diff --git a/libstdc++-v3/testsuite/27_io/basic_ostringstream/view/wchar_t/1.cc b/libstdc++-v3/testsuite/27_io/basic_ostringstream/view/wchar_t/1.cc
new file mode 100644
index 00000000000..1ebf7c505e3
--- /dev/null
+++ b/libstdc++-v3/testsuite/27_io/basic_ostringstream/view/wchar_t/1.cc
@@ -0,0 +1,35 @@ 
+// Copyright (C) 2020 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/>.
+
+// 27.7.1.1  basic_stringbuf constructors  [lib.stringbuf.cons]
+
+// { dg-options "-std=gnu++2a" }
+// { dg-do run { target c++2a } }
+// { dg-require-effective-target cxx11-abi }
+
+#include <sstream>
+#include <string_view>
+#include <testsuite_hooks.h>
+
+int
+main()
+{
+  std::wstring s(L"This is a test");
+  std::wostringstream stm(s);
+  VERIFY( stm.view() == s );
+  return 0;
+}
diff --git a/libstdc++-v3/testsuite/27_io/basic_stringbuf/cons/char/2.cc b/libstdc++-v3/testsuite/27_io/basic_stringbuf/cons/char/2.cc
new file mode 100644
index 00000000000..ce669358c85
--- /dev/null
+++ b/libstdc++-v3/testsuite/27_io/basic_stringbuf/cons/char/2.cc
@@ -0,0 +1,121 @@ 
+// Copyright (C) 2020 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/>.
+
+// 27.7.1.1  basic_stringbuf constructors  [lib.stringbuf.cons]
+
+// { dg-options "-std=gnu++2a" }
+// { dg-do run { target c++2a } }
+// { dg-require-effective-target cxx11-abi }
+
+#include <sstream>
+#include <string>
+#include <testsuite_allocator.h>
+#include <testsuite_hooks.h>
+
+void
+test01()
+{
+  {
+    using alloc_type = __gnu_test::uneq_allocator<char>;
+    using sbuf_t = std::basic_stringbuf<char, std::char_traits<char>,
+						alloc_type>;
+
+    alloc_type aa;
+    sbuf_t sbuf1(aa);
+    VERIFY( aa == sbuf1.get_allocator() );
+
+    alloc_type aaa(42);
+    sbuf_t sbuf2(aaa);
+    VERIFY( aaa == sbuf2.get_allocator() );
+
+    VERIFY( sbuf1.get_allocator() != sbuf2.get_allocator() );
+  }
+
+  std::stringbuf::allocator_type a;
+  {
+    std::stringbuf sbuf(std::ios_base::in, a);
+  }
+
+  {
+    std::stringbuf sbuf(a);
+  }
+}
+
+auto const cstr = "This is a test";
+
+void
+test02()
+{
+  std::string s1(cstr);
+  std::stringbuf sbuf(std::move(s1));
+  VERIFY( s1.empty() );
+
+  std::string s2(cstr);
+  VERIFY( sbuf.str() == s2 );
+}
+
+void
+test03()
+{
+  using alloc_type = __gnu_test::tracker_allocator<char>;
+  using str_type = std::basic_string<char, std::char_traits<char>, alloc_type>;
+
+  auto const mode = std::ios_base::in | std::ios_base::out;
+  str_type s1(cstr);
+
+  {
+    std::stringbuf::allocator_type a;
+    std::stringbuf sbuf(s1, mode, a);
+    std::string s2(cstr);
+    VERIFY( sbuf.str() == s2 );
+  }
+
+  {
+    std::stringbuf sbuf(s1, mode);
+    std::string s2(cstr);
+    VERIFY( sbuf.str() == s2 );
+  }
+
+  {
+    std::stringbuf sbuf(s1);
+    std::string s2(cstr);
+    VERIFY( sbuf.str() == s2 );
+  }
+}
+
+void
+test04()
+{
+  std::stringbuf sbuf1(cstr);
+
+  std::stringbuf::allocator_type a;
+  std::stringbuf sbuf2(std::move(sbuf1), a);
+  VERIFY( sbuf1.str().empty() );
+
+  std::string s(cstr);
+  VERIFY( sbuf2.str() == s );
+}
+
+int
+main()
+{
+  test01();
+  test02();
+  test03();
+  test04();
+  return 0;
+}
diff --git a/libstdc++-v3/testsuite/27_io/basic_stringbuf/cons/wchar_t/2.cc b/libstdc++-v3/testsuite/27_io/basic_stringbuf/cons/wchar_t/2.cc
new file mode 100644
index 00000000000..e05acc42165
--- /dev/null
+++ b/libstdc++-v3/testsuite/27_io/basic_stringbuf/cons/wchar_t/2.cc
@@ -0,0 +1,105 @@ 
+// Copyright (C) 2020 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/>.
+
+// 27.7.1.1  basic_stringbuf constructors  [lib.stringbuf.cons]
+
+// { dg-options "-std=gnu++2a" }
+// { dg-do run { target c++2a } }
+// { dg-require-effective-target cxx11-abi }
+
+#include <sstream>
+#include <string>
+#include <testsuite_allocator.h>
+#include <testsuite_hooks.h>
+
+void
+test01()
+{
+  std::wstringbuf::allocator_type a;
+  {
+    std::wstringbuf sbuf(std::ios_base::in, a);
+  }
+
+  {
+    std::wstringbuf sbuf(a);
+  }
+}
+
+auto const cstr = L"This is a test";
+
+void
+test02()
+{
+  std::wstring s1(cstr);
+  std::wstringbuf sbuf(std::move(s1));
+  VERIFY( s1.empty() );
+
+  std::wstring s2(cstr);
+  VERIFY( sbuf.str() == s2 );
+}
+
+void
+test03()
+{
+  using alloc_type = __gnu_test::tracker_allocator<wchar_t>;
+  using str_type = std::basic_string<wchar_t, std::char_traits<wchar_t>, alloc_type>;
+
+  auto const mode = std::ios_base::in | std::ios_base::out;
+  str_type s1(cstr);
+
+  {
+    std::wstringbuf::allocator_type a;
+    std::wstringbuf sbuf(s1, mode, a);
+    std::wstring s2(cstr);
+    VERIFY( sbuf.str() == s2 );
+  }
+
+  {
+    std::wstringbuf sbuf(s1, mode);
+    std::wstring s2(cstr);
+    VERIFY( sbuf.str() == s2 );
+  }
+
+  {
+    std::wstringbuf sbuf(s1);
+    std::wstring s2(cstr);
+    VERIFY( sbuf.str() == s2 );
+  }
+}
+
+void
+test04()
+{
+  std::wstringbuf sbuf1(cstr);
+
+  std::wstringbuf::allocator_type a;
+  std::wstringbuf sbuf2(std::move(sbuf1), a);
+  VERIFY( sbuf1.str().empty() );
+
+  std::wstring s(cstr);
+  VERIFY( sbuf2.str() == s );
+}
+
+int
+main()
+{
+  test01();
+  test02();
+  test03();
+  test04();
+  return 0;
+}
diff --git a/libstdc++-v3/testsuite/27_io/basic_stringbuf/view/char/1.cc b/libstdc++-v3/testsuite/27_io/basic_stringbuf/view/char/1.cc
new file mode 100644
index 00000000000..8f8c62daa21
--- /dev/null
+++ b/libstdc++-v3/testsuite/27_io/basic_stringbuf/view/char/1.cc
@@ -0,0 +1,35 @@ 
+// Copyright (C) 2020 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/>.
+
+// 27.7.1.1  basic_stringbuf constructors  [lib.stringbuf.cons]
+
+// { dg-options "-std=gnu++2a" }
+// { dg-do run { target c++2a } }
+// { dg-require-effective-target cxx11-abi }
+
+#include <sstream>
+#include <string_view>
+#include <testsuite_hooks.h>
+
+int
+main()
+{
+  std::string s("This is a test");
+  std::stringbuf sbuf(s);
+  VERIFY( sbuf.view() == s );
+  return 0;
+}
diff --git a/libstdc++-v3/testsuite/27_io/basic_stringbuf/view/wchar_t/1.cc b/libstdc++-v3/testsuite/27_io/basic_stringbuf/view/wchar_t/1.cc
new file mode 100644
index 00000000000..0d23d7d8e66
--- /dev/null
+++ b/libstdc++-v3/testsuite/27_io/basic_stringbuf/view/wchar_t/1.cc
@@ -0,0 +1,35 @@ 
+// Copyright (C) 2020 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/>.
+
+// 27.7.1.1  basic_stringbuf constructors  [lib.stringbuf.cons]
+
+// { dg-options "-std=gnu++2a" }
+// { dg-do run { target c++2a } }
+// { dg-require-effective-target cxx11-abi }
+
+#include <sstream>
+#include <string_view>
+#include <testsuite_hooks.h>
+
+int
+main()
+{
+  std::wstring s(L"This is a test");
+  std::wstringbuf sbuf(s);
+  VERIFY( sbuf.view() == s );
+  return 0;
+}
diff --git a/libstdc++-v3/testsuite/27_io/basic_stringstream/cons/char/1.cc b/libstdc++-v3/testsuite/27_io/basic_stringstream/cons/char/1.cc
new file mode 100644
index 00000000000..accb1d3b4ec
--- /dev/null
+++ b/libstdc++-v3/testsuite/27_io/basic_stringstream/cons/char/1.cc
@@ -0,0 +1,85 @@ 
+// Copyright (C) 2020 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/>.
+
+// 27.7.1.1  basic_stringbuf constructors  [lib.stringbuf.cons]
+
+// { dg-options "-std=gnu++2a" }
+// { dg-do run { target c++2a } }
+// { dg-require-effective-target cxx11-abi }
+
+#include <sstream>
+#include <string>
+#include <testsuite_allocator.h>
+#include <testsuite_hooks.h>
+
+void
+test01()
+{
+  std::stringstream::allocator_type a;
+  std::stringstream stm(std::ios_base::in, a);
+}
+
+auto const cstr = "This is a test";
+
+void
+test02()
+{
+  std::string s1(cstr);
+  std::stringstream stm(std::move(s1));
+  VERIFY( s1.empty() );
+
+  std::string s2(cstr);
+  VERIFY( stm.str() == s2 );
+}
+
+void
+test03()
+{
+  using alloc_type = __gnu_test::tracker_allocator<char>;
+  using str_type = std::basic_string<char, std::char_traits<char>, alloc_type>;
+
+  auto const mode = std::ios_base::in | std::ios_base::out;
+  str_type s1(cstr);
+
+  {
+    std::stringstream::allocator_type a;
+    std::stringstream sbuf(s1, mode, a);
+    std::string s2(cstr);
+    VERIFY( sbuf.str() == s2 );
+  }
+
+  {
+    std::stringstream sbuf(s1, mode);
+    std::string s2(cstr);
+    VERIFY( sbuf.str() == s2 );
+  }
+
+  {
+    std::stringstream sbuf(s1);
+    std::string s2(cstr);
+    VERIFY( sbuf.str() == s2 );
+  }
+}
+
+int
+main()
+{
+  test01();
+  test02();
+  test03();
+  return 0;
+}
diff --git a/libstdc++-v3/testsuite/27_io/basic_stringstream/cons/wchar_t/1.cc b/libstdc++-v3/testsuite/27_io/basic_stringstream/cons/wchar_t/1.cc
new file mode 100644
index 00000000000..f89402fd24e
--- /dev/null
+++ b/libstdc++-v3/testsuite/27_io/basic_stringstream/cons/wchar_t/1.cc
@@ -0,0 +1,85 @@ 
+// Copyright (C) 2020 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/>.
+
+// 27.7.1.1  basic_stringbuf constructors  [lib.stringbuf.cons]
+
+// { dg-options "-std=gnu++2a" }
+// { dg-do run { target c++2a } }
+// { dg-require-effective-target cxx11-abi }
+
+#include <sstream>
+#include <string>
+#include <testsuite_allocator.h>
+#include <testsuite_hooks.h>
+
+void
+test01()
+{
+  std::wistringstream::allocator_type a;
+  std::wistringstream stm(std::ios_base::in, a);
+}
+
+auto const cstr = L"This is a test";
+
+void
+test02()
+{
+  std::wstring s1(cstr);
+  std::wistringstream stm(std::move(s1));
+  VERIFY( s1.empty() );
+
+  std::wstring s2(cstr);
+  VERIFY( stm.str() == s2 );
+}
+
+void
+test03()
+{
+  using alloc_type = __gnu_test::tracker_allocator<wchar_t>;
+  using str_type = std::basic_string<wchar_t, std::char_traits<wchar_t>, alloc_type>;
+
+  auto const mode = std::ios_base::in;
+  str_type s1(cstr);
+
+  {
+    std::wistringstream::allocator_type a;
+    std::wistringstream sbuf(s1, mode, a);
+    std::wstring s2(cstr);
+    VERIFY( sbuf.str() == s2 );
+  }
+
+  {
+    std::wistringstream sbuf(s1, mode);
+    std::wstring s2(cstr);
+    VERIFY( sbuf.str() == s2 );
+  }
+
+  {
+    std::wistringstream sbuf(s1);
+    std::wstring s2(cstr);
+    VERIFY( sbuf.str() == s2 );
+  }
+}
+
+int
+main()
+{
+  test01();
+  test02();
+  test03();
+  return 0;
+}
diff --git a/libstdc++-v3/testsuite/27_io/basic_stringstream/view/char/1.cc b/libstdc++-v3/testsuite/27_io/basic_stringstream/view/char/1.cc
new file mode 100644
index 00000000000..f47035cf148
--- /dev/null
+++ b/libstdc++-v3/testsuite/27_io/basic_stringstream/view/char/1.cc
@@ -0,0 +1,35 @@ 
+// Copyright (C) 2020 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/>.
+
+// 27.7.1.1  basic_stringbuf constructors  [lib.stringbuf.cons]
+
+// { dg-options "-std=gnu++2a" }
+// { dg-do run { target c++2a } }
+// { dg-require-effective-target cxx11-abi }
+
+#include <sstream>
+#include <string_view>
+#include <testsuite_hooks.h>
+
+int
+main()
+{
+  std::string s("This is a test");
+  std::stringstream stm(s);
+  VERIFY( stm.view() == s );
+  return 0;
+}
diff --git a/libstdc++-v3/testsuite/27_io/basic_stringstream/view/wchar_t/1.cc b/libstdc++-v3/testsuite/27_io/basic_stringstream/view/wchar_t/1.cc
new file mode 100644
index 00000000000..d707cfed243
--- /dev/null
+++ b/libstdc++-v3/testsuite/27_io/basic_stringstream/view/wchar_t/1.cc
@@ -0,0 +1,35 @@ 
+// Copyright (C) 2020 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/>.
+
+// 27.7.1.1  basic_stringbuf constructors  [lib.stringbuf.cons]
+
+// { dg-options "-std=gnu++2a" }
+// { dg-do run { target c++2a } }
+// { dg-require-effective-target cxx11-abi }
+
+#include <sstream>
+#include <string_view>
+#include <testsuite_hooks.h>
+
+int
+main()
+{
+  std::wstring s(L"This is a test");
+  std::wstringstream stm(s);
+  VERIFY( stm.view() == s );
+  return 0;
+}