This adds <bits/ostream.h> so that other headers don't need to include
all of <ostream>, which pulls in all of <format> since C++23 (for the
std::print and std::println overloads in <ostream>). This new header
allows the constrained operator<< in <bits/unique_ptr.h> to be defined
without all of std::format being compiled.

We could also replace <ostream> with <bits/ostream.h> in all of
<istream>, <fstream>, <sstream>, and <spanstream>. That seems more
likely to cause problems for users who might be expecting <sstream> to
define std::endl, for example. Although the standard doesn't guarantee
that, it is more reasonable than expecting <memory> to define it! We can
look into making those changes for GCC 16.

libstdc++-v3/ChangeLog:

        PR libstdc++/99995
        * include/Makefile.am: Add new header.
        * include/Makefile.in: Regenerate.
        * include/bits/unique_ptr.h: Include bits/ostream.h instead of
        ostream.
        * include/std/ostream: Include new header.
        * include/bits/ostream.h: New file.
---

Tested x86_64-linux. Pushed to trunk to partially address the PR 99995
regression that our headers just keep pulling in too much stuff with
each new -std mode.

 libstdc++-v3/include/Makefile.am       |   1 +
 libstdc++-v3/include/Makefile.in       |   1 +
 libstdc++-v3/include/bits/ostream.h    | 814 +++++++++++++++++++++++++
 libstdc++-v3/include/bits/unique_ptr.h |   2 +-
 libstdc++-v3/include/std/ostream       | 763 +----------------------
 5 files changed, 818 insertions(+), 763 deletions(-)
 create mode 100644 libstdc++-v3/include/bits/ostream.h

diff --git a/libstdc++-v3/include/Makefile.am b/libstdc++-v3/include/Makefile.am
index 69f6c33b2955..de25aadd219d 100644
--- a/libstdc++-v3/include/Makefile.am
+++ b/libstdc++-v3/include/Makefile.am
@@ -137,6 +137,7 @@ bits_freestanding = \
        ${bits_srcdir}/memoryfwd.h \
        ${bits_srcdir}/monostate.h \
        ${bits_srcdir}/move.h \
+       ${bits_srcdir}/ostream.h \
        ${bits_srcdir}/out_ptr.h \
        ${bits_srcdir}/predefined_ops.h \
        ${bits_srcdir}/parse_numbers.h \
diff --git a/libstdc++-v3/include/Makefile.in b/libstdc++-v3/include/Makefile.in
index 4c461afb7513..5a20dfb69b0e 100644
--- a/libstdc++-v3/include/Makefile.in
+++ b/libstdc++-v3/include/Makefile.in
@@ -492,6 +492,7 @@ bits_freestanding = \
        ${bits_srcdir}/memoryfwd.h \
        ${bits_srcdir}/monostate.h \
        ${bits_srcdir}/move.h \
+       ${bits_srcdir}/ostream.h \
        ${bits_srcdir}/out_ptr.h \
        ${bits_srcdir}/predefined_ops.h \
        ${bits_srcdir}/parse_numbers.h \
diff --git a/libstdc++-v3/include/bits/ostream.h 
b/libstdc++-v3/include/bits/ostream.h
new file mode 100644
index 000000000000..8ee63d2d66e5
--- /dev/null
+++ b/libstdc++-v3/include/bits/ostream.h
@@ -0,0 +1,814 @@
+// Output streams -*- C++ -*-
+
+// Copyright (C) 1997-2024 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/>.
+
+/** @file bits/ostream.h
+ *  This is an internal header file, included by other library headers.
+ *  Do not attempt to use it directly. @headername{ostream}
+ */
+
+//
+// ISO C++ 14882: 27.6.2  Output streams
+//
+
+#ifndef _GLIBCXX_OSTREAM_H
+#define _GLIBCXX_OSTREAM_H 1
+
+#ifdef _GLIBCXX_SYSHDR
+#pragma GCC system_header
+#endif
+
+#include <bits/requires_hosted.h> // iostreams
+
+#include <ios>
+#include <bits/ostream_insert.h>
+
+# define __glibcxx_want_print
+#include <bits/version.h> // __glibcxx_syncbuf
+
+namespace std _GLIBCXX_VISIBILITY(default)
+{
+_GLIBCXX_BEGIN_NAMESPACE_VERSION
+
+  /**
+   *  @brief  Template class basic_ostream.
+   *  @ingroup io
+   *
+   *  @tparam _CharT  Type of character stream.
+   *  @tparam _Traits  Traits for character type, defaults to
+   *                   char_traits<_CharT>.
+   *
+   *  This is the base class for all output streams.  It provides text
+   *  formatting of all builtin types, and communicates with any class
+   *  derived from basic_streambuf to do the actual output.
+  */
+  template<typename _CharT, typename _Traits>
+    class basic_ostream : virtual public basic_ios<_CharT, _Traits>
+    {
+    public:
+      // Types (inherited from basic_ios):
+      typedef _CharT                                   char_type;
+      typedef typename _Traits::int_type               int_type;
+      typedef typename _Traits::pos_type               pos_type;
+      typedef typename _Traits::off_type               off_type;
+      typedef _Traits                                  traits_type;
+
+      // Non-standard Types:
+      typedef basic_streambuf<_CharT, _Traits>                 
__streambuf_type;
+      typedef basic_ios<_CharT, _Traits>               __ios_type;
+      typedef basic_ostream<_CharT, _Traits>           __ostream_type;
+      typedef num_put<_CharT, ostreambuf_iterator<_CharT, _Traits> >
+                                                       __num_put_type;
+      typedef ctype<_CharT>                            __ctype_type;
+
+      /**
+       *  @brief  Base constructor.
+       *
+       *  This ctor is almost never called by the user directly, rather from
+       *  derived classes' initialization lists, which pass a pointer to
+       *  their own stream buffer.
+      */
+      explicit
+      basic_ostream(__streambuf_type* __sb)
+      { this->init(__sb); }
+
+      /**
+       *  @brief  Base destructor.
+       *
+       *  This does very little apart from providing a virtual base dtor.
+      */
+      virtual
+      ~basic_ostream() { }
+
+      /// Safe prefix/suffix operations.
+      class sentry;
+      friend class sentry;
+
+      ///@{
+      /**
+       *  @brief  Interface for manipulators.
+       *
+       *  Manipulators such as @c std::endl and @c std::hex use these
+       *  functions in constructs like "std::cout << std::endl".  For more
+       *  information, see the iomanip header.
+      */
+      __ostream_type&
+      operator<<(__ostream_type& (*__pf)(__ostream_type&))
+      {
+       // _GLIBCXX_RESOLVE_LIB_DEFECTS
+       // DR 60. What is a formatted input function?
+       // The inserters for manipulators are *not* formatted output functions.
+       return __pf(*this);
+      }
+
+      __ostream_type&
+      operator<<(__ios_type& (*__pf)(__ios_type&))
+      {
+       // _GLIBCXX_RESOLVE_LIB_DEFECTS
+       // DR 60. What is a formatted input function?
+       // The inserters for manipulators are *not* formatted output functions.
+       __pf(*this);
+       return *this;
+      }
+
+      __ostream_type&
+      operator<<(ios_base& (*__pf) (ios_base&))
+      {
+       // _GLIBCXX_RESOLVE_LIB_DEFECTS
+       // DR 60. What is a formatted input function?
+       // The inserters for manipulators are *not* formatted output functions.
+       __pf(*this);
+       return *this;
+      }
+      ///@}
+
+      ///@{
+      /**
+       *  @name Inserters
+       *
+       *  All the @c operator<< functions (aka <em>formatted output
+       *  functions</em>) have some common behavior.  Each starts by
+       *  constructing a temporary object of type std::basic_ostream::sentry.
+       *  This can have several effects, concluding with the setting of a
+       *  status flag; see the sentry documentation for more.
+       *
+       *  If the sentry status is good, the function tries to generate
+       *  whatever data is appropriate for the type of the argument.
+       *
+       *  If an exception is thrown during insertion, ios_base::badbit
+       *  will be turned on in the stream's error state without causing an
+       *  ios_base::failure to be thrown.  The original exception will then
+       *  be rethrown.
+      */
+
+      ///@{
+      /**
+       *  @brief Integer arithmetic inserters
+       *  @param  __n A variable of builtin integral type.
+       *  @return  @c *this if successful
+       *
+       *  These functions use the stream's current locale (specifically, the
+       *  @c num_get facet) to perform numeric formatting.
+      */
+      __ostream_type&
+      operator<<(long __n)
+      { return _M_insert(__n); }
+
+      __ostream_type&
+      operator<<(unsigned long __n)
+      { return _M_insert(__n); }
+
+      __ostream_type&
+      operator<<(bool __n)
+      { return _M_insert(__n); }
+
+      __ostream_type&
+      operator<<(short __n);
+
+      __ostream_type&
+      operator<<(unsigned short __n)
+      {
+       // _GLIBCXX_RESOLVE_LIB_DEFECTS
+       // 117. basic_ostream uses nonexistent num_put member functions.
+       return _M_insert(static_cast<unsigned long>(__n));
+      }
+
+      __ostream_type&
+      operator<<(int __n);
+
+      __ostream_type&
+      operator<<(unsigned int __n)
+      {
+       // _GLIBCXX_RESOLVE_LIB_DEFECTS
+       // 117. basic_ostream uses nonexistent num_put member functions.
+       return _M_insert(static_cast<unsigned long>(__n));
+      }
+
+#ifdef _GLIBCXX_USE_LONG_LONG
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wlong-long"
+      __ostream_type&
+      operator<<(long long __n)
+      { return _M_insert(__n); }
+
+      __ostream_type&
+      operator<<(unsigned long long __n)
+      { return _M_insert(__n); }
+#pragma GCC diagnostic pop
+#endif
+      ///@}
+
+      ///@{
+      /**
+       *  @brief  Floating point arithmetic inserters
+       *  @param  __f A variable of builtin floating point type.
+       *  @return  @c *this if successful
+       *
+       *  These functions use the stream's current locale (specifically, the
+       *  @c num_get facet) to perform numeric formatting.
+      */
+      __ostream_type&
+      operator<<(double __f)
+      { return _M_insert(__f); }
+
+      __ostream_type&
+      operator<<(float __f)
+      {
+       // _GLIBCXX_RESOLVE_LIB_DEFECTS
+       // 117. basic_ostream uses nonexistent num_put member functions.
+       return _M_insert(_S_cast_flt<double>(__f));
+      }
+
+      __ostream_type&
+      operator<<(long double __f)
+      { return _M_insert(__f); }
+      ///@}
+
+#if defined(__STDCPP_FLOAT16_T__) && defined(_GLIBCXX_DOUBLE_IS_IEEE_BINARY64)
+      __attribute__((__always_inline__))
+      __ostream_type&
+      operator<<(_Float16 __f)
+      {
+       return _M_insert(_S_cast_flt<double>(__f));
+      }
+#endif
+
+#if defined(__STDCPP_FLOAT32_T__) && defined(_GLIBCXX_DOUBLE_IS_IEEE_BINARY64)
+      __attribute__((__always_inline__))
+      __ostream_type&
+      operator<<(_Float32 __f)
+      {
+       return _M_insert(_S_cast_flt<double>(__f));
+      }
+#endif
+
+#if defined(__STDCPP_FLOAT64_T__) && defined(_GLIBCXX_DOUBLE_IS_IEEE_BINARY64)
+      __attribute__((__always_inline__))
+      __ostream_type&
+      operator<<(_Float64 __f)
+      {
+       return _M_insert(_S_cast_flt<double>(__f));
+      }
+#endif
+
+#if defined(__STDCPP_FLOAT128_T__) && 
defined(_GLIBCXX_LDOUBLE_IS_IEEE_BINARY128)
+      __attribute__((__always_inline__))
+      __ostream_type&
+      operator<<(_Float128 __f)
+      {
+       return _M_insert(_S_cast_flt<long double>(__f));
+      }
+#endif
+
+#if defined(__STDCPP_BFLOAT16_T__) && defined(_GLIBCXX_DOUBLE_IS_IEEE_BINARY64)
+      __attribute__((__always_inline__))
+      __ostream_type&
+      operator<<(__gnu_cxx::__bfloat16_t __f)
+      {
+       return _M_insert(_S_cast_flt<double>(__f));
+      }
+#endif
+
+      /**
+       *  @brief  Pointer arithmetic inserters
+       *  @param  __p A variable of pointer type.
+       *  @return  @c *this if successful
+       *
+       *  These functions use the stream's current locale (specifically, the
+       *  @c num_get facet) to perform numeric formatting.
+      */
+      __ostream_type&
+      operator<<(const void* __p)
+      { return _M_insert(__p); }
+
+#if __cplusplus >= 201703L
+      __ostream_type&
+      operator<<(nullptr_t)
+      { return *this << "nullptr"; }
+#endif
+
+#if __cplusplus > 202002L
+      __attribute__((__always_inline__))
+      __ostream_type&
+      operator<<(const volatile void* __p)
+      { return _M_insert(const_cast<const void*>(__p)); }
+#endif
+
+      /**
+       *  @brief  Extracting from another streambuf.
+       *  @param  __sb  A pointer to a streambuf
+       *
+       *  This function behaves like one of the basic arithmetic extractors,
+       *  in that it also constructs a sentry object and has the same error
+       *  handling behavior.
+       *
+       *  If @p __sb is NULL, the stream will set failbit in its error state.
+       *
+       *  Characters are extracted from @p __sb and inserted into @c *this
+       *  until one of the following occurs:
+       *
+       *  - the input stream reaches end-of-file,
+       *  - insertion into the output sequence fails (in this case, the
+       *    character that would have been inserted is not extracted), or
+       *  - an exception occurs while getting a character from @p __sb, which
+       *    sets failbit in the error state
+       *
+       *  If the function inserts no characters, failbit is set.
+      */
+      __ostream_type&
+      operator<<(__streambuf_type* __sb);
+      ///@}
+
+      ///@{
+      /**
+       *  @name Unformatted Output Functions
+       *
+       *  All the unformatted output functions have some common behavior.
+       *  Each starts by constructing a temporary object of type
+       *  std::basic_ostream::sentry.  This has several effects, concluding
+       *  with the setting of a status flag; see the sentry documentation
+       *  for more.
+       *
+       *  If the sentry status is good, the function tries to generate
+       *  whatever data is appropriate for the type of the argument.
+       *
+       *  If an exception is thrown during insertion, ios_base::badbit
+       *  will be turned on in the stream's error state.  If badbit is on in
+       *  the stream's exceptions mask, the exception will be rethrown
+       *  without completing its actions.
+      */
+
+      /**
+       *  @brief  Simple insertion.
+       *  @param  __c  The character to insert.
+       *  @return  *this
+       *
+       *  Tries to insert @p __c.
+       *
+       *  @note  This function is not overloaded on signed char and
+       *         unsigned char.
+      */
+      __ostream_type&
+      put(char_type __c);
+
+      /**
+       *  @brief  Character string insertion.
+       *  @param  __s  The array to insert.
+       *  @param  __n  Maximum number of characters to insert.
+       *  @return  *this
+       *
+       *  Characters are copied from @p __s and inserted into the stream until
+       *  one of the following happens:
+       *
+       *  - @p __n characters are inserted
+       *  - inserting into the output sequence fails (in this case, badbit
+       *    will be set in the stream's error state)
+       *
+       *  @note  This function is not overloaded on signed char and
+       *         unsigned char.
+      */
+      __ostream_type&
+      write(const char_type* __s, streamsize __n);
+      ///@}
+
+      /**
+       *  @brief  Synchronizing the stream buffer.
+       *  @return  *this
+       *
+       *  If @c rdbuf() is a null pointer, changes nothing.
+       *
+       *  Otherwise, calls @c rdbuf()->pubsync(), and if that returns -1,
+       *  sets badbit.
+      */
+      __ostream_type&
+      flush();
+
+      /**
+       *  @brief  Getting the current write position.
+       *  @return  A file position object.
+       *
+       *  If @c fail() is not false, returns @c pos_type(-1) to indicate
+       *  failure.  Otherwise returns @c rdbuf()->pubseekoff(0,cur,out).
+      */
+      pos_type
+      tellp();
+
+      /**
+       *  @brief  Changing the current write position.
+       *  @param  __pos  A file position object.
+       *  @return  *this
+       *
+       *  If @c fail() is not true, calls @c rdbuf()->pubseekpos(pos).  If
+       *  that function fails, sets failbit.
+      */
+      __ostream_type&
+      seekp(pos_type);
+
+      /**
+       *  @brief  Changing the current write position.
+       *  @param  __off  A file offset object.
+       *  @param  __dir  The direction in which to seek.
+       *  @return  *this
+       *
+       *  If @c fail() is not true, calls @c rdbuf()->pubseekoff(off,dir).
+       *  If that function fails, sets failbit.
+      */
+       __ostream_type&
+      seekp(off_type, ios_base::seekdir);
+
+    protected:
+      basic_ostream()
+      { this->init(0); }
+
+#if __cplusplus >= 201103L
+      // Non-standard constructor that does not call init()
+      basic_ostream(basic_iostream<_CharT, _Traits>&) { }
+
+      basic_ostream(const basic_ostream&) = delete;
+
+      basic_ostream(basic_ostream&& __rhs)
+      : __ios_type()
+      { __ios_type::move(__rhs); }
+
+      // 27.7.3.3 Assign/swap
+
+      basic_ostream& operator=(const basic_ostream&) = delete;
+
+      basic_ostream&
+      operator=(basic_ostream&& __rhs)
+      {
+       swap(__rhs);
+       return *this;
+      }
+
+      void
+      swap(basic_ostream& __rhs)
+      { __ios_type::swap(__rhs); }
+#endif
+
+      template<typename _ValueT>
+       __ostream_type&
+       _M_insert(_ValueT __v);
+
+    private:
+#if !_GLIBCXX_INLINE_VERSION
+      void
+      _M_write(const char_type* __s, streamsize __n)
+      { std::__ostream_insert(*this, __s, __n); }
+#endif
+
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wc++17-extensions" // for if-constexpr
+      template<typename _To, typename _From>
+       static _To
+       _S_cast_flt(_From __f)
+       {
+         _To __d = static_cast<_To>(__f);
+         // _GLIBCXX_RESOLVE_LIB_DEFECTS
+         // 4101: LWG 117 loses the sign for negative NaN on some arches.
+#if defined __riscv
+         _To __sign;
+#if __cpp_constexpr && __has_builtin(__builtin_bit_cast)
+         if constexpr (sizeof(__f) == sizeof(short))
+           __sign = static_cast<_To>(__builtin_bit_cast(short, __f));
+         else if constexpr (sizeof(__f) == sizeof(int))
+           __sign = static_cast<_To>(__builtin_bit_cast(int, __f));
+         else if constexpr (sizeof(__f) == sizeof(long long))
+           __sign = static_cast<_To>(__builtin_bit_cast(long long, __f));
+         else
+#endif
+         __sign = __builtin_signbit(__f) ? _To(-1.0) : _To(+1.0);
+
+         if _GLIBCXX17_CONSTEXPR (__is_same(_To, double))
+           __d = __builtin_copysign(__d, __sign);
+         else if _GLIBCXX17_CONSTEXPR (__is_same(_To, long double))
+           __d = __builtin_copysignl(__d, __sign);
+#endif
+         return __d;
+       }
+#pragma GCC diagnostic pop
+    };
+
+  /**
+   *  @brief  Performs setup work for output streams.
+   *
+   *  Objects of this class are created before all of the standard
+   *  inserters are run.  It is responsible for <em>exception-safe prefix and
+   *  suffix operations</em>.
+  */
+  template <typename _CharT, typename _Traits>
+    class basic_ostream<_CharT, _Traits>::sentry
+    {
+      // Data Members.
+      bool                             _M_ok;
+      basic_ostream<_CharT, _Traits>&  _M_os;
+
+    public:
+      /**
+       *  @brief  The constructor performs preparatory work.
+       *  @param  __os  The output stream to guard.
+       *
+       *  If the stream state is good (@a __os.good() is true), then if the
+       *  stream is tied to another output stream, @c is.tie()->flush()
+       *  is called to synchronize the output sequences.
+       *
+       *  If the stream state is still good, then the sentry state becomes
+       *  true (@a okay).
+      */
+      explicit
+      sentry(basic_ostream<_CharT, _Traits>& __os);
+
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
+      /**
+       *  @brief  Possibly flushes the stream.
+       *
+       *  If @c ios_base::unitbuf is set in @c os.flags(), and
+       *  @c std::uncaught_exception() is true, the sentry destructor calls
+       *  @c flush() on the output stream.
+      */
+      ~sentry()
+      {
+       // XXX MT
+       if (bool(_M_os.flags() & ios_base::unitbuf) && !uncaught_exception())
+         {
+           // Can't call flush directly or else will get into recursive lock.
+           if (_M_os.rdbuf() && _M_os.rdbuf()->pubsync() == -1)
+             _M_os.setstate(ios_base::badbit);
+         }
+      }
+#pragma GCC diagnostic pop
+
+      /**
+       *  @brief  Quick status checking.
+       *  @return  The sentry state.
+       *
+       *  For ease of use, sentries may be converted to booleans.  The
+       *  return value is that of the sentry state (true == okay).
+      */
+#if __cplusplus >= 201103L
+      explicit
+#endif
+      operator bool() const
+      { return _M_ok; }
+    };
+
+  ///@{
+  /**
+   *  @brief  Character inserters
+   *  @param  __out  An output stream.
+   *  @param  __c  A character.
+   *  @return  out
+   *
+   *  Behaves like one of the formatted arithmetic inserters described in
+   *  std::basic_ostream.  After constructing a sentry object with good
+   *  status, this function inserts a single character and any required
+   *  padding (as determined by [22.2.2.2.2]).  @c __out.width(0) is then
+   *  called.
+   *
+   *  If @p __c is of type @c char and the character type of the stream is not
+   *  @c char, the character is widened before insertion.
+  */
+  template<typename _CharT, typename _Traits>
+    inline basic_ostream<_CharT, _Traits>&
+    operator<<(basic_ostream<_CharT, _Traits>& __out, _CharT __c)
+    {
+      if (__out.width() != 0)
+       return __ostream_insert(__out, &__c, 1);
+      __out.put(__c);
+      return __out;
+    }
+
+  template<typename _CharT, typename _Traits>
+    inline basic_ostream<_CharT, _Traits>&
+    operator<<(basic_ostream<_CharT, _Traits>& __out, char __c)
+    { return (__out << __out.widen(__c)); }
+
+  // Specialization
+  template<typename _Traits>
+    inline basic_ostream<char, _Traits>&
+    operator<<(basic_ostream<char, _Traits>& __out, char __c)
+    {
+      if (__out.width() != 0)
+       return __ostream_insert(__out, &__c, 1);
+      __out.put(__c);
+      return __out;
+    }
+
+  // Signed and unsigned
+  template<typename _Traits>
+    inline basic_ostream<char, _Traits>&
+    operator<<(basic_ostream<char, _Traits>& __out, signed char __c)
+    { return (__out << static_cast<char>(__c)); }
+
+  template<typename _Traits>
+    inline basic_ostream<char, _Traits>&
+    operator<<(basic_ostream<char, _Traits>& __out, unsigned char __c)
+    { return (__out << static_cast<char>(__c)); }
+
+#if __cplusplus > 201703L
+  // The following deleted overloads prevent formatting character values as
+  // numeric values.
+
+  template<typename _Traits>
+    basic_ostream<char, _Traits>&
+    operator<<(basic_ostream<char, _Traits>&, wchar_t) = delete;
+
+#ifdef _GLIBCXX_USE_CHAR8_T
+  template<typename _Traits>
+    basic_ostream<char, _Traits>&
+    operator<<(basic_ostream<char, _Traits>&, char8_t) = delete;
+#endif
+
+  template<typename _Traits>
+    basic_ostream<char, _Traits>&
+    operator<<(basic_ostream<char, _Traits>&, char16_t) = delete;
+
+  template<typename _Traits>
+    basic_ostream<char, _Traits>&
+    operator<<(basic_ostream<char, _Traits>&, char32_t) = delete;
+
+#ifdef _GLIBCXX_USE_WCHAR_T
+#ifdef _GLIBCXX_USE_CHAR8_T
+  template<typename _Traits>
+    basic_ostream<wchar_t, _Traits>&
+    operator<<(basic_ostream<wchar_t, _Traits>&, char8_t) = delete;
+#endif // _GLIBCXX_USE_CHAR8_T
+
+  template<typename _Traits>
+    basic_ostream<wchar_t, _Traits>&
+    operator<<(basic_ostream<wchar_t, _Traits>&, char16_t) = delete;
+
+  template<typename _Traits>
+    basic_ostream<wchar_t, _Traits>&
+    operator<<(basic_ostream<wchar_t, _Traits>&, char32_t) = delete;
+#endif // _GLIBCXX_USE_WCHAR_T
+#endif // C++20
+  ///@}
+
+  ///@{
+  /**
+   *  @brief  String inserters
+   *  @param  __out  An output stream.
+   *  @param  __s  A character string.
+   *  @return  out
+   *  @pre  @p __s must be a non-NULL pointer
+   *
+   *  Behaves like one of the formatted arithmetic inserters described in
+   *  std::basic_ostream.  After constructing a sentry object with good
+   *  status, this function inserts @c traits::length(__s) characters starting
+   *  at @p __s, widened if necessary, followed by any required padding (as
+   *  determined by [22.2.2.2.2]).  @c __out.width(0) is then called.
+  */
+  template<typename _CharT, typename _Traits>
+    inline basic_ostream<_CharT, _Traits>&
+    operator<<(basic_ostream<_CharT, _Traits>& __out, const _CharT* __s)
+    {
+      if (!__s)
+       __out.setstate(ios_base::badbit);
+      else
+       __ostream_insert(__out, __s,
+                        static_cast<streamsize>(_Traits::length(__s)));
+      return __out;
+    }
+
+  template<typename _CharT, typename _Traits>
+    basic_ostream<_CharT, _Traits> &
+    operator<<(basic_ostream<_CharT, _Traits>& __out, const char* __s);
+
+  // Partial specializations
+  template<typename _Traits>
+    inline basic_ostream<char, _Traits>&
+    operator<<(basic_ostream<char, _Traits>& __out, const char* __s)
+    {
+      if (!__s)
+       __out.setstate(ios_base::badbit);
+      else
+       __ostream_insert(__out, __s,
+                        static_cast<streamsize>(_Traits::length(__s)));
+      return __out;
+    }
+
+  // Signed and unsigned
+  template<typename _Traits>
+    inline basic_ostream<char, _Traits>&
+    operator<<(basic_ostream<char, _Traits>& __out, const signed char* __s)
+    { return (__out << reinterpret_cast<const char*>(__s)); }
+
+  template<typename _Traits>
+    inline basic_ostream<char, _Traits> &
+    operator<<(basic_ostream<char, _Traits>& __out, const unsigned char* __s)
+    { return (__out << reinterpret_cast<const char*>(__s)); }
+
+#if __cplusplus > 201703L
+   // The following deleted overloads prevent formatting strings as
+   // pointer values.
+
+  template<typename _Traits>
+    basic_ostream<char, _Traits>&
+    operator<<(basic_ostream<char, _Traits>&, const wchar_t*) = delete;
+
+#ifdef _GLIBCXX_USE_CHAR8_T
+  template<typename _Traits>
+    basic_ostream<char, _Traits>&
+    operator<<(basic_ostream<char, _Traits>&, const char8_t*) = delete;
+#endif // _GLIBCXX_USE_CHAR8_T
+
+  template<typename _Traits>
+    basic_ostream<char, _Traits>&
+    operator<<(basic_ostream<char, _Traits>&, const char16_t*) = delete;
+
+  template<typename _Traits>
+    basic_ostream<char, _Traits>&
+    operator<<(basic_ostream<char, _Traits>&, const char32_t*) = delete;
+
+#ifdef _GLIBCXX_USE_WCHAR_T
+#ifdef _GLIBCXX_USE_CHAR8_T
+  template<typename _Traits>
+    basic_ostream<wchar_t, _Traits>&
+    operator<<(basic_ostream<wchar_t, _Traits>&, const char8_t*) = delete;
+#endif
+
+  template<typename _Traits>
+    basic_ostream<wchar_t, _Traits>&
+    operator<<(basic_ostream<wchar_t, _Traits>&, const char16_t*) = delete;
+
+  template<typename _Traits>
+    basic_ostream<wchar_t, _Traits>&
+    operator<<(basic_ostream<wchar_t, _Traits>&, const char32_t*) = delete;
+#endif // _GLIBCXX_USE_WCHAR_T
+#endif // C++20
+  ///@}
+
+#if __cplusplus >= 201103L
+  // C++11 27.7.3.9 Rvalue stream insertion [ostream.rvalue]
+  // _GLIBCXX_RESOLVE_LIB_DEFECTS
+  // 1203. More useful rvalue stream insertion
+
+#if __cpp_concepts >= 201907L && __glibcxx_type_trait_variable_templates
+  // Use concepts if possible because they're cheaper to evaluate.
+  template<typename _Tp>
+    concept __derived_from_ios_base = is_class_v<_Tp>
+      && (!is_same_v<_Tp, ios_base>)
+      && requires (_Tp* __t, ios_base* __b) { __b = __t; };
+
+  template<typename _Os, typename _Tp>
+    requires __derived_from_ios_base<_Os>
+      && requires (_Os& __os, const _Tp& __t) { __os << __t; }
+    using __rvalue_stream_insertion_t = _Os&&;
+#else
+  template<typename _Tp>
+    using _Require_derived_from_ios_base
+      = _Require<is_class<_Tp>, __not_<is_same<_Tp, ios_base>>,
+                is_convertible<typename add_pointer<_Tp>::type, ios_base*>>;
+
+  template<typename _Os, typename _Tp,
+          typename = _Require_derived_from_ios_base<_Os>,
+          typename
+            = decltype(std::declval<_Os&>() << std::declval<const _Tp&>())>
+    using __rvalue_stream_insertion_t = _Os&&;
+#endif
+
+  /**
+   *  @brief  Generic inserter for rvalue stream
+   *  @param  __os  An input stream.
+   *  @param  __x  A reference to the object being inserted.
+   *  @return  __os
+   *
+   *  This is just a forwarding function to allow insertion to
+   *  rvalue streams since they won't bind to the inserter functions
+   *  that take an lvalue reference.
+  */
+  template<typename _Ostream, typename _Tp>
+    inline __rvalue_stream_insertion_t<_Ostream, _Tp>
+    operator<<(_Ostream&& __os, const _Tp& __x)
+    {
+      __os << __x;
+      return std::move(__os);
+    }
+#endif // C++11
+
+_GLIBCXX_END_NAMESPACE_VERSION
+} // namespace std
+
+#endif /* _GLIBCXX_OSTREAM_H */
diff --git a/libstdc++-v3/include/bits/unique_ptr.h 
b/libstdc++-v3/include/bits/unique_ptr.h
index b11c59f303f4..746989dfe47e 100644
--- a/libstdc++-v3/include/bits/unique_ptr.h
+++ b/libstdc++-v3/include/bits/unique_ptr.h
@@ -40,7 +40,7 @@
 #if __cplusplus >= 202002L
 # include <compare>
 # if _GLIBCXX_HOSTED
-#  include <ostream>
+#  include <bits/ostream.h>
 # endif
 #endif
 
diff --git a/libstdc++-v3/include/std/ostream b/libstdc++-v3/include/std/ostream
index d6b366728dfd..644e568e8829 100644
--- a/libstdc++-v3/include/std/ostream
+++ b/libstdc++-v3/include/std/ostream
@@ -39,8 +39,7 @@
 
 #include <bits/requires_hosted.h> // iostreams
 
-#include <ios>
-#include <bits/ostream_insert.h>
+#include <bits/ostream.h>
 #if __cplusplus > 202002L
 # include <format>
 #endif
@@ -52,716 +51,6 @@ namespace std _GLIBCXX_VISIBILITY(default)
 {
 _GLIBCXX_BEGIN_NAMESPACE_VERSION
 
-  /**
-   *  @brief  Template class basic_ostream.
-   *  @ingroup io
-   *
-   *  @tparam _CharT  Type of character stream.
-   *  @tparam _Traits  Traits for character type, defaults to
-   *                   char_traits<_CharT>.
-   *
-   *  This is the base class for all output streams.  It provides text
-   *  formatting of all builtin types, and communicates with any class
-   *  derived from basic_streambuf to do the actual output.
-  */
-  template<typename _CharT, typename _Traits>
-    class basic_ostream : virtual public basic_ios<_CharT, _Traits>
-    {
-    public:
-      // Types (inherited from basic_ios):
-      typedef _CharT                                   char_type;
-      typedef typename _Traits::int_type               int_type;
-      typedef typename _Traits::pos_type               pos_type;
-      typedef typename _Traits::off_type               off_type;
-      typedef _Traits                                  traits_type;
-
-      // Non-standard Types:
-      typedef basic_streambuf<_CharT, _Traits>                 
__streambuf_type;
-      typedef basic_ios<_CharT, _Traits>               __ios_type;
-      typedef basic_ostream<_CharT, _Traits>           __ostream_type;
-      typedef num_put<_CharT, ostreambuf_iterator<_CharT, _Traits> >
-                                                       __num_put_type;
-      typedef ctype<_CharT>                            __ctype_type;
-
-      /**
-       *  @brief  Base constructor.
-       *
-       *  This ctor is almost never called by the user directly, rather from
-       *  derived classes' initialization lists, which pass a pointer to
-       *  their own stream buffer.
-      */
-      explicit
-      basic_ostream(__streambuf_type* __sb)
-      { this->init(__sb); }
-
-      /**
-       *  @brief  Base destructor.
-       *
-       *  This does very little apart from providing a virtual base dtor.
-      */
-      virtual
-      ~basic_ostream() { }
-
-      /// Safe prefix/suffix operations.
-      class sentry;
-      friend class sentry;
-
-      ///@{
-      /**
-       *  @brief  Interface for manipulators.
-       *
-       *  Manipulators such as @c std::endl and @c std::hex use these
-       *  functions in constructs like "std::cout << std::endl".  For more
-       *  information, see the iomanip header.
-      */
-      __ostream_type&
-      operator<<(__ostream_type& (*__pf)(__ostream_type&))
-      {
-       // _GLIBCXX_RESOLVE_LIB_DEFECTS
-       // DR 60. What is a formatted input function?
-       // The inserters for manipulators are *not* formatted output functions.
-       return __pf(*this);
-      }
-
-      __ostream_type&
-      operator<<(__ios_type& (*__pf)(__ios_type&))
-      {
-       // _GLIBCXX_RESOLVE_LIB_DEFECTS
-       // DR 60. What is a formatted input function?
-       // The inserters for manipulators are *not* formatted output functions.
-       __pf(*this);
-       return *this;
-      }
-
-      __ostream_type&
-      operator<<(ios_base& (*__pf) (ios_base&))
-      {
-       // _GLIBCXX_RESOLVE_LIB_DEFECTS
-       // DR 60. What is a formatted input function?
-       // The inserters for manipulators are *not* formatted output functions.
-       __pf(*this);
-       return *this;
-      }
-      ///@}
-
-      ///@{
-      /**
-       *  @name Inserters
-       *
-       *  All the @c operator<< functions (aka <em>formatted output
-       *  functions</em>) have some common behavior.  Each starts by
-       *  constructing a temporary object of type std::basic_ostream::sentry.
-       *  This can have several effects, concluding with the setting of a
-       *  status flag; see the sentry documentation for more.
-       *
-       *  If the sentry status is good, the function tries to generate
-       *  whatever data is appropriate for the type of the argument.
-       *
-       *  If an exception is thrown during insertion, ios_base::badbit
-       *  will be turned on in the stream's error state without causing an
-       *  ios_base::failure to be thrown.  The original exception will then
-       *  be rethrown.
-      */
-
-      ///@{
-      /**
-       *  @brief Integer arithmetic inserters
-       *  @param  __n A variable of builtin integral type.
-       *  @return  @c *this if successful
-       *
-       *  These functions use the stream's current locale (specifically, the
-       *  @c num_get facet) to perform numeric formatting.
-      */
-      __ostream_type&
-      operator<<(long __n)
-      { return _M_insert(__n); }
-
-      __ostream_type&
-      operator<<(unsigned long __n)
-      { return _M_insert(__n); }
-
-      __ostream_type&
-      operator<<(bool __n)
-      { return _M_insert(__n); }
-
-      __ostream_type&
-      operator<<(short __n);
-
-      __ostream_type&
-      operator<<(unsigned short __n)
-      {
-       // _GLIBCXX_RESOLVE_LIB_DEFECTS
-       // 117. basic_ostream uses nonexistent num_put member functions.
-       return _M_insert(static_cast<unsigned long>(__n));
-      }
-
-      __ostream_type&
-      operator<<(int __n);
-
-      __ostream_type&
-      operator<<(unsigned int __n)
-      {
-       // _GLIBCXX_RESOLVE_LIB_DEFECTS
-       // 117. basic_ostream uses nonexistent num_put member functions.
-       return _M_insert(static_cast<unsigned long>(__n));
-      }
-
-#ifdef _GLIBCXX_USE_LONG_LONG
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wlong-long"
-      __ostream_type&
-      operator<<(long long __n)
-      { return _M_insert(__n); }
-
-      __ostream_type&
-      operator<<(unsigned long long __n)
-      { return _M_insert(__n); }
-#pragma GCC diagnostic pop
-#endif
-      ///@}
-
-      ///@{
-      /**
-       *  @brief  Floating point arithmetic inserters
-       *  @param  __f A variable of builtin floating point type.
-       *  @return  @c *this if successful
-       *
-       *  These functions use the stream's current locale (specifically, the
-       *  @c num_get facet) to perform numeric formatting.
-      */
-      __ostream_type&
-      operator<<(double __f)
-      { return _M_insert(__f); }
-
-      __ostream_type&
-      operator<<(float __f)
-      {
-       // _GLIBCXX_RESOLVE_LIB_DEFECTS
-       // 117. basic_ostream uses nonexistent num_put member functions.
-       return _M_insert(_S_cast_flt<double>(__f));
-      }
-
-      __ostream_type&
-      operator<<(long double __f)
-      { return _M_insert(__f); }
-      ///@}
-
-#if defined(__STDCPP_FLOAT16_T__) && defined(_GLIBCXX_DOUBLE_IS_IEEE_BINARY64)
-      __attribute__((__always_inline__))
-      __ostream_type&
-      operator<<(_Float16 __f)
-      {
-       return _M_insert(_S_cast_flt<double>(__f));
-      }
-#endif
-
-#if defined(__STDCPP_FLOAT32_T__) && defined(_GLIBCXX_DOUBLE_IS_IEEE_BINARY64)
-      __attribute__((__always_inline__))
-      __ostream_type&
-      operator<<(_Float32 __f)
-      {
-       return _M_insert(_S_cast_flt<double>(__f));
-      }
-#endif
-
-#if defined(__STDCPP_FLOAT64_T__) && defined(_GLIBCXX_DOUBLE_IS_IEEE_BINARY64)
-      __attribute__((__always_inline__))
-      __ostream_type&
-      operator<<(_Float64 __f)
-      {
-       return _M_insert(_S_cast_flt<double>(__f));
-      }
-#endif
-
-#if defined(__STDCPP_FLOAT128_T__) && 
defined(_GLIBCXX_LDOUBLE_IS_IEEE_BINARY128)
-      __attribute__((__always_inline__))
-      __ostream_type&
-      operator<<(_Float128 __f)
-      {
-       return _M_insert(_S_cast_flt<long double>(__f));
-      }
-#endif
-
-#if defined(__STDCPP_BFLOAT16_T__) && defined(_GLIBCXX_DOUBLE_IS_IEEE_BINARY64)
-      __attribute__((__always_inline__))
-      __ostream_type&
-      operator<<(__gnu_cxx::__bfloat16_t __f)
-      {
-       return _M_insert(_S_cast_flt<double>(__f));
-      }
-#endif
-
-      /**
-       *  @brief  Pointer arithmetic inserters
-       *  @param  __p A variable of pointer type.
-       *  @return  @c *this if successful
-       *
-       *  These functions use the stream's current locale (specifically, the
-       *  @c num_get facet) to perform numeric formatting.
-      */
-      __ostream_type&
-      operator<<(const void* __p)
-      { return _M_insert(__p); }
-
-#if __cplusplus >= 201703L
-      __ostream_type&
-      operator<<(nullptr_t)
-      { return *this << "nullptr"; }
-#endif
-
-#if __cplusplus > 202002L
-      __attribute__((__always_inline__))
-      __ostream_type&
-      operator<<(const volatile void* __p)
-      { return _M_insert(const_cast<const void*>(__p)); }
-#endif
-
-      /**
-       *  @brief  Extracting from another streambuf.
-       *  @param  __sb  A pointer to a streambuf
-       *
-       *  This function behaves like one of the basic arithmetic extractors,
-       *  in that it also constructs a sentry object and has the same error
-       *  handling behavior.
-       *
-       *  If @p __sb is NULL, the stream will set failbit in its error state.
-       *
-       *  Characters are extracted from @p __sb and inserted into @c *this
-       *  until one of the following occurs:
-       *
-       *  - the input stream reaches end-of-file,
-       *  - insertion into the output sequence fails (in this case, the
-       *    character that would have been inserted is not extracted), or
-       *  - an exception occurs while getting a character from @p __sb, which
-       *    sets failbit in the error state
-       *
-       *  If the function inserts no characters, failbit is set.
-      */
-      __ostream_type&
-      operator<<(__streambuf_type* __sb);
-      ///@}
-
-      ///@{
-      /**
-       *  @name Unformatted Output Functions
-       *
-       *  All the unformatted output functions have some common behavior.
-       *  Each starts by constructing a temporary object of type
-       *  std::basic_ostream::sentry.  This has several effects, concluding
-       *  with the setting of a status flag; see the sentry documentation
-       *  for more.
-       *
-       *  If the sentry status is good, the function tries to generate
-       *  whatever data is appropriate for the type of the argument.
-       *
-       *  If an exception is thrown during insertion, ios_base::badbit
-       *  will be turned on in the stream's error state.  If badbit is on in
-       *  the stream's exceptions mask, the exception will be rethrown
-       *  without completing its actions.
-      */
-
-      /**
-       *  @brief  Simple insertion.
-       *  @param  __c  The character to insert.
-       *  @return  *this
-       *
-       *  Tries to insert @p __c.
-       *
-       *  @note  This function is not overloaded on signed char and
-       *         unsigned char.
-      */
-      __ostream_type&
-      put(char_type __c);
-
-      /**
-       *  @brief  Character string insertion.
-       *  @param  __s  The array to insert.
-       *  @param  __n  Maximum number of characters to insert.
-       *  @return  *this
-       *
-       *  Characters are copied from @p __s and inserted into the stream until
-       *  one of the following happens:
-       *
-       *  - @p __n characters are inserted
-       *  - inserting into the output sequence fails (in this case, badbit
-       *    will be set in the stream's error state)
-       *
-       *  @note  This function is not overloaded on signed char and
-       *         unsigned char.
-      */
-      __ostream_type&
-      write(const char_type* __s, streamsize __n);
-      ///@}
-
-      /**
-       *  @brief  Synchronizing the stream buffer.
-       *  @return  *this
-       *
-       *  If @c rdbuf() is a null pointer, changes nothing.
-       *
-       *  Otherwise, calls @c rdbuf()->pubsync(), and if that returns -1,
-       *  sets badbit.
-      */
-      __ostream_type&
-      flush();
-
-      /**
-       *  @brief  Getting the current write position.
-       *  @return  A file position object.
-       *
-       *  If @c fail() is not false, returns @c pos_type(-1) to indicate
-       *  failure.  Otherwise returns @c rdbuf()->pubseekoff(0,cur,out).
-      */
-      pos_type
-      tellp();
-
-      /**
-       *  @brief  Changing the current write position.
-       *  @param  __pos  A file position object.
-       *  @return  *this
-       *
-       *  If @c fail() is not true, calls @c rdbuf()->pubseekpos(pos).  If
-       *  that function fails, sets failbit.
-      */
-      __ostream_type&
-      seekp(pos_type);
-
-      /**
-       *  @brief  Changing the current write position.
-       *  @param  __off  A file offset object.
-       *  @param  __dir  The direction in which to seek.
-       *  @return  *this
-       *
-       *  If @c fail() is not true, calls @c rdbuf()->pubseekoff(off,dir).
-       *  If that function fails, sets failbit.
-      */
-       __ostream_type&
-      seekp(off_type, ios_base::seekdir);
-
-    protected:
-      basic_ostream()
-      { this->init(0); }
-
-#if __cplusplus >= 201103L
-      // Non-standard constructor that does not call init()
-      basic_ostream(basic_iostream<_CharT, _Traits>&) { }
-
-      basic_ostream(const basic_ostream&) = delete;
-
-      basic_ostream(basic_ostream&& __rhs)
-      : __ios_type()
-      { __ios_type::move(__rhs); }
-
-      // 27.7.3.3 Assign/swap
-
-      basic_ostream& operator=(const basic_ostream&) = delete;
-
-      basic_ostream&
-      operator=(basic_ostream&& __rhs)
-      {
-       swap(__rhs);
-       return *this;
-      }
-
-      void
-      swap(basic_ostream& __rhs)
-      { __ios_type::swap(__rhs); }
-#endif
-
-      template<typename _ValueT>
-       __ostream_type&
-       _M_insert(_ValueT __v);
-
-    private:
-#if !_GLIBCXX_INLINE_VERSION
-      void
-      _M_write(const char_type* __s, streamsize __n)
-      { std::__ostream_insert(*this, __s, __n); }
-#endif
-
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wc++17-extensions" // for if-constexpr
-      template<typename _To, typename _From>
-       static _To
-       _S_cast_flt(_From __f)
-       {
-         _To __d = static_cast<_To>(__f);
-         // _GLIBCXX_RESOLVE_LIB_DEFECTS
-         // 4101: LWG 117 loses the sign for negative NaN on some arches.
-#if defined __riscv
-         _To __sign;
-#if __cpp_constexpr && __has_builtin(__builtin_bit_cast)
-         if constexpr (sizeof(__f) == sizeof(short))
-           __sign = static_cast<_To>(__builtin_bit_cast(short, __f));
-         else if constexpr (sizeof(__f) == sizeof(int))
-           __sign = static_cast<_To>(__builtin_bit_cast(int, __f));
-         else if constexpr (sizeof(__f) == sizeof(long long))
-           __sign = static_cast<_To>(__builtin_bit_cast(long long, __f));
-         else
-#endif
-         __sign = __builtin_signbit(__f) ? _To(-1.0) : _To(+1.0);
-
-         if _GLIBCXX17_CONSTEXPR (__is_same(_To, double))
-           __d = __builtin_copysign(__d, __sign);
-         else if _GLIBCXX17_CONSTEXPR (__is_same(_To, long double))
-           __d = __builtin_copysignl(__d, __sign);
-#endif
-         return __d;
-       }
-    };
-#pragma GCC diagnostic pop
-
-  /**
-   *  @brief  Performs setup work for output streams.
-   *
-   *  Objects of this class are created before all of the standard
-   *  inserters are run.  It is responsible for <em>exception-safe prefix and
-   *  suffix operations</em>.
-  */
-  template <typename _CharT, typename _Traits>
-    class basic_ostream<_CharT, _Traits>::sentry
-    {
-      // Data Members.
-      bool                             _M_ok;
-      basic_ostream<_CharT, _Traits>&  _M_os;
-
-    public:
-      /**
-       *  @brief  The constructor performs preparatory work.
-       *  @param  __os  The output stream to guard.
-       *
-       *  If the stream state is good (@a __os.good() is true), then if the
-       *  stream is tied to another output stream, @c is.tie()->flush()
-       *  is called to synchronize the output sequences.
-       *
-       *  If the stream state is still good, then the sentry state becomes
-       *  true (@a okay).
-      */
-      explicit
-      sentry(basic_ostream<_CharT, _Traits>& __os);
-
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
-      /**
-       *  @brief  Possibly flushes the stream.
-       *
-       *  If @c ios_base::unitbuf is set in @c os.flags(), and
-       *  @c std::uncaught_exception() is true, the sentry destructor calls
-       *  @c flush() on the output stream.
-      */
-      ~sentry()
-      {
-       // XXX MT
-       if (bool(_M_os.flags() & ios_base::unitbuf) && !uncaught_exception())
-         {
-           // Can't call flush directly or else will get into recursive lock.
-           if (_M_os.rdbuf() && _M_os.rdbuf()->pubsync() == -1)
-             _M_os.setstate(ios_base::badbit);
-         }
-      }
-#pragma GCC diagnostic pop
-
-      /**
-       *  @brief  Quick status checking.
-       *  @return  The sentry state.
-       *
-       *  For ease of use, sentries may be converted to booleans.  The
-       *  return value is that of the sentry state (true == okay).
-      */
-#if __cplusplus >= 201103L
-      explicit
-#endif
-      operator bool() const
-      { return _M_ok; }
-    };
-
-  ///@{
-  /**
-   *  @brief  Character inserters
-   *  @param  __out  An output stream.
-   *  @param  __c  A character.
-   *  @return  out
-   *
-   *  Behaves like one of the formatted arithmetic inserters described in
-   *  std::basic_ostream.  After constructing a sentry object with good
-   *  status, this function inserts a single character and any required
-   *  padding (as determined by [22.2.2.2.2]).  @c __out.width(0) is then
-   *  called.
-   *
-   *  If @p __c is of type @c char and the character type of the stream is not
-   *  @c char, the character is widened before insertion.
-  */
-  template<typename _CharT, typename _Traits>
-    inline basic_ostream<_CharT, _Traits>&
-    operator<<(basic_ostream<_CharT, _Traits>& __out, _CharT __c)
-    {
-      if (__out.width() != 0)
-       return __ostream_insert(__out, &__c, 1);
-      __out.put(__c);
-      return __out;
-    }
-
-  template<typename _CharT, typename _Traits>
-    inline basic_ostream<_CharT, _Traits>&
-    operator<<(basic_ostream<_CharT, _Traits>& __out, char __c)
-    { return (__out << __out.widen(__c)); }
-
-  // Specialization
-  template<typename _Traits>
-    inline basic_ostream<char, _Traits>&
-    operator<<(basic_ostream<char, _Traits>& __out, char __c)
-    {
-      if (__out.width() != 0)
-       return __ostream_insert(__out, &__c, 1);
-      __out.put(__c);
-      return __out;
-    }
-
-  // Signed and unsigned
-  template<typename _Traits>
-    inline basic_ostream<char, _Traits>&
-    operator<<(basic_ostream<char, _Traits>& __out, signed char __c)
-    { return (__out << static_cast<char>(__c)); }
-
-  template<typename _Traits>
-    inline basic_ostream<char, _Traits>&
-    operator<<(basic_ostream<char, _Traits>& __out, unsigned char __c)
-    { return (__out << static_cast<char>(__c)); }
-
-#if __cplusplus > 201703L
-  // The following deleted overloads prevent formatting character values as
-  // numeric values.
-
-  template<typename _Traits>
-    basic_ostream<char, _Traits>&
-    operator<<(basic_ostream<char, _Traits>&, wchar_t) = delete;
-
-#ifdef _GLIBCXX_USE_CHAR8_T
-  template<typename _Traits>
-    basic_ostream<char, _Traits>&
-    operator<<(basic_ostream<char, _Traits>&, char8_t) = delete;
-#endif
-
-  template<typename _Traits>
-    basic_ostream<char, _Traits>&
-    operator<<(basic_ostream<char, _Traits>&, char16_t) = delete;
-
-  template<typename _Traits>
-    basic_ostream<char, _Traits>&
-    operator<<(basic_ostream<char, _Traits>&, char32_t) = delete;
-
-#ifdef _GLIBCXX_USE_WCHAR_T
-#ifdef _GLIBCXX_USE_CHAR8_T
-  template<typename _Traits>
-    basic_ostream<wchar_t, _Traits>&
-    operator<<(basic_ostream<wchar_t, _Traits>&, char8_t) = delete;
-#endif // _GLIBCXX_USE_CHAR8_T
-
-  template<typename _Traits>
-    basic_ostream<wchar_t, _Traits>&
-    operator<<(basic_ostream<wchar_t, _Traits>&, char16_t) = delete;
-
-  template<typename _Traits>
-    basic_ostream<wchar_t, _Traits>&
-    operator<<(basic_ostream<wchar_t, _Traits>&, char32_t) = delete;
-#endif // _GLIBCXX_USE_WCHAR_T
-#endif // C++20
-  ///@}
-
-  ///@{
-  /**
-   *  @brief  String inserters
-   *  @param  __out  An output stream.
-   *  @param  __s  A character string.
-   *  @return  out
-   *  @pre  @p __s must be a non-NULL pointer
-   *
-   *  Behaves like one of the formatted arithmetic inserters described in
-   *  std::basic_ostream.  After constructing a sentry object with good
-   *  status, this function inserts @c traits::length(__s) characters starting
-   *  at @p __s, widened if necessary, followed by any required padding (as
-   *  determined by [22.2.2.2.2]).  @c __out.width(0) is then called.
-  */
-  template<typename _CharT, typename _Traits>
-    inline basic_ostream<_CharT, _Traits>&
-    operator<<(basic_ostream<_CharT, _Traits>& __out, const _CharT* __s)
-    {
-      if (!__s)
-       __out.setstate(ios_base::badbit);
-      else
-       __ostream_insert(__out, __s,
-                        static_cast<streamsize>(_Traits::length(__s)));
-      return __out;
-    }
-
-  template<typename _CharT, typename _Traits>
-    basic_ostream<_CharT, _Traits> &
-    operator<<(basic_ostream<_CharT, _Traits>& __out, const char* __s);
-
-  // Partial specializations
-  template<typename _Traits>
-    inline basic_ostream<char, _Traits>&
-    operator<<(basic_ostream<char, _Traits>& __out, const char* __s)
-    {
-      if (!__s)
-       __out.setstate(ios_base::badbit);
-      else
-       __ostream_insert(__out, __s,
-                        static_cast<streamsize>(_Traits::length(__s)));
-      return __out;
-    }
-
-  // Signed and unsigned
-  template<typename _Traits>
-    inline basic_ostream<char, _Traits>&
-    operator<<(basic_ostream<char, _Traits>& __out, const signed char* __s)
-    { return (__out << reinterpret_cast<const char*>(__s)); }
-
-  template<typename _Traits>
-    inline basic_ostream<char, _Traits> &
-    operator<<(basic_ostream<char, _Traits>& __out, const unsigned char* __s)
-    { return (__out << reinterpret_cast<const char*>(__s)); }
-
-#if __cplusplus > 201703L
-   // The following deleted overloads prevent formatting strings as
-   // pointer values.
-
-  template<typename _Traits>
-    basic_ostream<char, _Traits>&
-    operator<<(basic_ostream<char, _Traits>&, const wchar_t*) = delete;
-
-#ifdef _GLIBCXX_USE_CHAR8_T
-  template<typename _Traits>
-    basic_ostream<char, _Traits>&
-    operator<<(basic_ostream<char, _Traits>&, const char8_t*) = delete;
-#endif // _GLIBCXX_USE_CHAR8_T
-
-  template<typename _Traits>
-    basic_ostream<char, _Traits>&
-    operator<<(basic_ostream<char, _Traits>&, const char16_t*) = delete;
-
-  template<typename _Traits>
-    basic_ostream<char, _Traits>&
-    operator<<(basic_ostream<char, _Traits>&, const char32_t*) = delete;
-
-#ifdef _GLIBCXX_USE_WCHAR_T
-#ifdef _GLIBCXX_USE_CHAR8_T
-  template<typename _Traits>
-    basic_ostream<wchar_t, _Traits>&
-    operator<<(basic_ostream<wchar_t, _Traits>&, const char8_t*) = delete;
-#endif
-
-  template<typename _Traits>
-    basic_ostream<wchar_t, _Traits>&
-    operator<<(basic_ostream<wchar_t, _Traits>&, const char16_t*) = delete;
-
-  template<typename _Traits>
-    basic_ostream<wchar_t, _Traits>&
-    operator<<(basic_ostream<wchar_t, _Traits>&, const char32_t*) = delete;
-#endif // _GLIBCXX_USE_WCHAR_T
-#endif // C++20
-  ///@}
-
   // Standard basic_ostream manipulators
 
   /**
@@ -799,53 +88,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
     flush(basic_ostream<_CharT, _Traits>& __os)
     { return __os.flush(); }
 
-#if __cplusplus >= 201103L
-  // C++11 27.7.3.9 Rvalue stream insertion [ostream.rvalue]
-  // _GLIBCXX_RESOLVE_LIB_DEFECTS
-  // 1203. More useful rvalue stream insertion
-
-#if __cpp_concepts >= 201907L && __glibcxx_type_trait_variable_templates
-  // Use concepts if possible because they're cheaper to evaluate.
-  template<typename _Tp>
-    concept __derived_from_ios_base = is_class_v<_Tp>
-      && (!is_same_v<_Tp, ios_base>)
-      && requires (_Tp* __t, ios_base* __b) { __b = __t; };
-
-  template<typename _Os, typename _Tp>
-    requires __derived_from_ios_base<_Os>
-      && requires (_Os& __os, const _Tp& __t) { __os << __t; }
-    using __rvalue_stream_insertion_t = _Os&&;
-#else
-  template<typename _Tp>
-    using _Require_derived_from_ios_base
-      = _Require<is_class<_Tp>, __not_<is_same<_Tp, ios_base>>,
-                is_convertible<typename add_pointer<_Tp>::type, ios_base*>>;
-
-  template<typename _Os, typename _Tp,
-          typename = _Require_derived_from_ios_base<_Os>,
-          typename
-            = decltype(std::declval<_Os&>() << std::declval<const _Tp&>())>
-    using __rvalue_stream_insertion_t = _Os&&;
-#endif
-
-  /**
-   *  @brief  Generic inserter for rvalue stream
-   *  @param  __os  An input stream.
-   *  @param  __x  A reference to the object being inserted.
-   *  @return  __os
-   *
-   *  This is just a forwarding function to allow insertion to
-   *  rvalue streams since they won't bind to the inserter functions
-   *  that take an lvalue reference.
-  */
-  template<typename _Ostream, typename _Tp>
-    inline __rvalue_stream_insertion_t<_Ostream, _Tp>
-    operator<<(_Ostream&& __os, const _Tp& __x)
-    {
-      __os << __x;
-      return std::move(__os);
-    }
-
 #ifdef __glibcxx_syncbuf // C++ >= 20 && HOSTED && CXX11ABI
   template<typename _CharT, typename _Traits>
     class __syncbuf_base : public basic_streambuf<_CharT, _Traits>
@@ -914,7 +156,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 #endif // __glibcxx_syncbuf
 
 #if __cpp_lib_print // C++ >= 23
-
   inline void
   vprint_nonunicode(ostream& __os, string_view __fmt, format_args __args)
   {
@@ -1047,8 +288,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 
 #endif // __cpp_lib_print
 
-#endif // C++11
-
 _GLIBCXX_END_NAMESPACE_VERSION
 } // namespace std
 
-- 
2.47.1

Reply via email to