]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
libstdc++: Fix std::format for localized floats [PR110968]
authorJonathan Wakely <jwakely@redhat.com>
Thu, 10 Aug 2023 13:33:44 +0000 (14:33 +0100)
committerJonathan Wakely <jwakely@redhat.com>
Thu, 10 Aug 2023 22:31:37 +0000 (23:31 +0100)
The __formatter_fp::_M_localize function just returns an empty string if
the formatting locale is the C locale, as there is nothing to do. But
the caller was assuming that the returned string contains the localized
string. The caller should use the original string if _M_localize returns
an empty string.

libstdc++-v3/ChangeLog:

PR libstdc++/110968
* include/std/format (__formatter_fp::format): Check return
value of _M_localize.
* testsuite/std/format/functions/format.cc: Check classic
locale.

libstdc++-v3/include/std/format
libstdc++-v3/testsuite/std/format/functions/format.cc

index 96eb4cd742e245da0c3b2009641a691479dc59fa..5d7af53fc947dfc69a4ea61ad0b9a841b1f72665 100644 (file)
@@ -1610,8 +1610,8 @@ namespace __format
 
 
          _Optional_locale __loc;
-         basic_string_view<_CharT> __str;
          basic_string<_CharT> __wstr;
+         basic_string_view<_CharT> __str;
          if constexpr (is_same_v<_CharT, char>)
            __str = __narrow_str;
          else
@@ -1634,7 +1634,8 @@ namespace __format
                __wstr = _M_localize(__str, __expc, __fc.locale());
              else
                __wstr = _M_localize(__str, __expc, __loc.value());
-             __str = __wstr;
+             if (!__wstr.empty())
+               __str = __wstr;
            }
 
          size_t __width = _M_spec._M_get_width(__fc);
index bd914df6d7c8916a6a6d89884f175df0fdcf49e3..471cffb2b36883f064c5a1214e302fcdd8b9a8d4 100644 (file)
@@ -197,6 +197,9 @@ test_locale()
   s = std::format(eloc, "{0:#Lg} {0:+#.3Lg} {0:#08.4Lg}", -1234.);
   VERIFY( s == "-1.234,00 -1,23e+03 -01.234," );
 
+  s = std::format(cloc, "{:05L}", -1.0); // PR libstdc++/110968
+  VERIFY( s == "-0001" );
+
   // Restore
   std::locale::global(cloc);
 }