]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
libstdc++: Do not add padding for std::print to std::ostream
authorJonathan Wakely <jwakely@redhat.com>
Fri, 15 Dec 2023 12:21:36 +0000 (12:21 +0000)
committerJonathan Wakely <jwakely@redhat.com>
Fri, 15 Dec 2023 13:20:49 +0000 (13:20 +0000)
Tim Song pointed out that although std::print behaves as a formatted
output function, it does "determine padding" using the stream's flags.

libstdc++-v3/ChangeLog:

* include/std/ostream (vprint_nonunicode, vprint_unicode): Do
not insert padding.
* testsuite/27_io/basic_ostream/print/1.cc: Adjust expected
behaviour.

libstdc++-v3/include/std/ostream
libstdc++-v3/testsuite/27_io/basic_ostream/print/1.cc

index 4f1cdc281a3c1146db57122b512dc688b2516a62..0cac293e4d6c156abef961e4dcb7f502965c807b 100644 (file)
@@ -891,21 +891,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 
        __try
          {
-           const streamsize __w = __os.width();
-           const streamsize __n = __out.size();
-           if (__w > __n)
-             {
-               const bool __left
-                 = (__os.flags() & ios_base::adjustfield) == ios_base::left;
-               if (!__left)
-                 std::__ostream_fill(__os, __w - __n);
-               if (__os.good())
-                 std::__ostream_write(__os, __out.data(), __n);
-               if (__left && __os.good())
-                 std::__ostream_fill(__os, __w - __n);
-             }
-           else
-             std::__ostream_write(__os, __out.data(), __n);
+           std::__ostream_write(__os, __out.data(), __out.size());
          }
        __catch(const __cxxabiv1::__forced_unwind&)
          {
@@ -923,11 +909,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
     ostream::sentry __cerb(__os);
     if (__cerb)
       {
-
-       const streamsize __w = __os.width();
-       const bool __left
-         = (__os.flags() & ios_base::adjustfield) == ios_base::left;
-
        __format::_Str_sink<char> __buf;
        std::vformat_to(__buf.out(), __os.getloc(), __fmt, __args);
        auto __out = __buf.view();
@@ -938,18 +919,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
        // If stream refers to a terminal, write a Unicode string to it.
        if (auto __term = __open_terminal(__os.rdbuf()))
          {
-           __format::_Str_sink<char> __buf2;
-           if (__w != 0)
-             {
-               char __fmt[] = "{0:..{1}}";
-               __fmt[3] == __os.fill();
-               __fmt[4] == __left ? '<' : '>';
-               string_view __str(__out);
-               std::vformat_to(__buf2.out(), // N.B. no need to use getloc()
-                               __fmt, std::make_format_args(__str, __w));
-               __out = __buf2.view();
-             }
-
            ios_base::iostate __err = ios_base::goodbit;
            __try
              {
@@ -981,18 +950,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
        // Otherwise just insert the string as normal.
        __try
          {
-           const streamsize __n = __out.size();
-           if (__w > __n)
-             {
-               if (!__left)
-                 std::__ostream_fill(__os, __w - __n);
-               if (__os.good())
-                 std::__ostream_write(__os, __out.data(), __n);
-               if (__left && __os.good())
-                 std::__ostream_fill(__os, __w - __n);
-             }
-           else
-             std::__ostream_write(__os, __out.data(), __n);
+           std::__ostream_write(__os, __out.data(), __out.size());
          }
        __catch(const __cxxabiv1::__forced_unwind&)
          {
index 28dc8af33e60ada25d67063848a87a4c03643afd..b3abc570d1e1622ee975f7f69264cbe340077d1e 100644 (file)
@@ -42,14 +42,16 @@ test_print_raw()
 }
 
 void
-test_print_formatted()
+test_print_no_padding()
 {
+  // [ostream.formatted.print] does not say this function "determines padding",
+  // see https://gcc.gnu.org/pipermail/gcc-patches/2023-December/640680.html
   char buf[64];
   std::spanstream os(buf);
-  os << std::setw(20) << std::setfill('*') << std::right;
+  os << std::setw(60) << std::setfill('?') << std::right; // should be ignored
   std::print(os, "{} Luftballons", 99);
   std::string_view txt(os.span());
-  VERIFY( txt == "******99 Luftballons" );
+  VERIFY( txt == "99 Luftballons" );
 }
 
 void
@@ -106,7 +108,7 @@ int main()
   test_print_ostream();
   test_println_ostream();
   test_print_raw();
-  test_print_formatted();
+  test_print_no_padding();
   test_vprint_nonunicode();
   test_locale();
 }