On 26/10/20 13:47 -0700, Thomas Rodgers wrote:
From: Thomas Rodgers <trodg...@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().

As discussed on IRC< please don't name every one of these functions
for the linker script changes, it's just redundant noise. They're
already listed below in the include/std/sstream changes.

Look at past changelog entries for the gnu.ver file.

        * 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.

New line before the Likewise.


There are a few formatting changes mentioned below. OK for trunk with
those changes. Thanks. Go ahead and commit the <syncstream> patch
after this one too.


        (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              | 190 +++++
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        | 108 +++
.../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, 2231 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

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..b191c471b39 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
+      using __sv_type = basic_string_view<char_type, traits_type>;
+
+      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 )
+      { }
+
+      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,38 @@ _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(std::__addressof(_M_stringbuf)); }
+
+      explicit basic_istringstream(__string_type&& __str,

Newline after explicit.

+                                  ios_base::openmode __mode = ios_base::in )
+      : __istream_type(), _M_stringbuf(std::move(__str), __mode | ios_base::in)
+      { this->init(std::__addressof(_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)
+       { }
+
+      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(std::__addressof(_M_stringbuf)); }
+
+      template<typename _SAlloc>
+       explicit basic_istringstream(const basic_string<_CharT, _Traits, 
_SAlloc>& __str,

Newline after explicit.

+                                    ios_base::openmode __mode = ios_base::in)
+       : basic_istringstream(__str, __mode, allocator_type())
+       { }
+#endif
+
      // Members:
      /**
       *  @brief  Accessing the underlying buffer.
@@ -528,6 +636,12 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11
      void
      str(const __string_type& __s)
      { _M_stringbuf.str(__s); }
+
+#if __cplusplus > 201703L && _GLIBCXX_USE_CXX11_ABI
+      basic_string_view<char_type, traits_type>
+      view() const noexcept
+      { return _M_stringbuf.view(); }
+#endif
    };


@@ -658,6 +772,38 @@ _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(std::__addressof(_M_stringbuf)); }
+
+      explicit basic_ostringstream(__string_type&& __str,

Newline after explicit.

+                                  ios_base::openmode __mode = ios_base::out )
+      : __ostream_type(), _M_stringbuf(std::move(__str), __mode | 
ios_base::out)
+      { this->init(std::__addressof(_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)
+       { }
+
+      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(std::__addressof(_M_stringbuf)); }
+
+      template<typename _SAlloc>
+       explicit basic_ostringstream(const basic_string<_CharT, _Traits, 
_SAlloc>& __str,

Newline after explicit.

+                                    ios_base::openmode __mode = ios_base::out)
+       : basic_ostringstream(__str, __mode, allocator_type())
+       { }
+#endif
+
      // Members:
      /**
       *  @brief  Accessing the underlying buffer.
@@ -686,6 +832,12 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11
      void
      str(const __string_type& __s)
      { _M_stringbuf.str(__s); }
+
+#if __cplusplus > 201703L && _GLIBCXX_USE_CXX11_ABI
+      basic_string_view<char_type, traits_type>
+      view() const noexcept
+      { return _M_stringbuf.view(); }
+#endif
    };


@@ -812,6 +964,38 @@ _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,

Newline after explicit.

+                                 ios_base::openmode __mode = ios_base::out
+                                                             | ios_base::out)
+      : __iostream_type(), _M_stringbuf(std::move(__str), __mode)
+      { this->init(std::__addressof(_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)
+       { }
+
+      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(std::__addressof(_M_stringbuf)); }
+
+      template<typename _SAlloc>
+       explicit basic_stringstream(const basic_string<_CharT, _Traits, 
_SAlloc>& __str,

Newline after explicit.

+                                   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 +1024,12 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11
      void
      str(const __string_type& __s)
      { _M_stringbuf.str(__s); }
+
+#if __cplusplus > 201703L && _GLIBCXX_USE_CXX11_ABI
+      basic_string_view<char_type, traits_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..e04560d28c8
--- /dev/null
+++ b/libstdc++-v3/src/c++20/sstream-inst.cc
@@ -0,0 +1,108 @@
+// Explicit instantiation file.
+
+// 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.
+
+// 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:
+//
+
+// Instantiations in this file are only for the new SSO std::string ABI
+#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 string_view
+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 string_view
+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 string_view
+basic_stringstream<char>::view() const noexcept;
+
+#ifdef _GLIBCXX_USE_WCHAR_T
+using wsv_type = basic_string_view<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_istringstream<wchar_t>::__stringbuf_type::__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 wstring_view
+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 wstring_view
+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 wstring_view
+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..496aa6963e0
--- /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/>.
+
+// C++20 29.8.2.2  basic_stringbuf constructors  [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..26a3a86c46e
--- /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/>.
+
+// C++20 29.8.2.2  basic_stringbuf constructors  [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..cba69f80931
--- /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/>.
+
+// C++20 29.8.2.2  basic_stringbuf constructors  [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..9021186d2c8
--- /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/>.
+
+// C++20 29.8.2.2  basic_stringbuf constructors  [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..83a3374b3cd
--- /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/>.
+
+// C++20 29.8.2.2  basic_stringbuf constructors  [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..26a3a86c46e
--- /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/>.
+
+// C++20 29.8.2.2  basic_stringbuf constructors  [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;
+}
--
2.26.2


Reply via email to