aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely@redhat.com>2023-08-10 14:33:44 +0100
committerJonathan Wakely <jwakely@redhat.com>2023-08-10 23:31:37 +0100
commitf48a5423964f72e2e1ba0ad6a14d9d1464a78bed (patch)
tree6233eb1aebd3e703337aee24439bc40d862a5185
parent9cb2a7c8d54b1f6685bc509a07104c458262cb9f (diff)
downloadgcc-f48a5423964f72e2e1ba0ad6a14d9d1464a78bed.zip
gcc-f48a5423964f72e2e1ba0ad6a14d9d1464a78bed.tar.gz
gcc-f48a5423964f72e2e1ba0ad6a14d9d1464a78bed.tar.bz2
libstdc++: Fix std::format for localized floats [PR110968]
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.
-rw-r--r--libstdc++-v3/include/std/format5
-rw-r--r--libstdc++-v3/testsuite/std/format/functions/format.cc3
2 files changed, 6 insertions, 2 deletions
diff --git a/libstdc++-v3/include/std/format b/libstdc++-v3/include/std/format
index 96eb4cd..5d7af53 100644
--- a/libstdc++-v3/include/std/format
+++ b/libstdc++-v3/include/std/format
@@ -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);
diff --git a/libstdc++-v3/testsuite/std/format/functions/format.cc b/libstdc++-v3/testsuite/std/format/functions/format.cc
index bd914df..471cffb 100644
--- a/libstdc++-v3/testsuite/std/format/functions/format.cc
+++ b/libstdc++-v3/testsuite/std/format/functions/format.cc
@@ -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);
}