From: Jonathan Wakely Date: Thu, 18 Dec 2025 16:39:46 +0000 (+0000) Subject: libstdc++: Fix chrono::parse to read from wide strings [PR123147] X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=18c306b1f42e3edab6c6fd1a2173d7405a0a9def;p=thirdparty%2Fgcc.git libstdc++: Fix chrono::parse to read from wide strings [PR123147] When we extract wide characters and insert them into a stringstream to be parsed as a floating-point value, we should use a stringstream of char, not wchar_t. libstdc++-v3/ChangeLog: PR libstdc++/123147 * include/bits/chrono_io.h (_Parser::operator()) <%S>: Use a buffer of narrow characters to be parsed by std::from_chars. * testsuite/std/time/parse/parse.cc: Check wchar_t parsing. --- diff --git a/libstdc++-v3/include/bits/chrono_io.h b/libstdc++-v3/include/bits/chrono_io.h index 75dd532a8cb..37a296fed7e 100644 --- a/libstdc++-v3/include/bits/chrono_io.h +++ b/libstdc++-v3/include/bits/chrono_io.h @@ -4977,14 +4977,14 @@ namespace __detail } else // Read fractional seconds { - basic_stringstream<_CharT> __buf; + stringstream __buf; auto __digit = _S_try_read_digit(__is, __err); if (__digit != -1) { - __buf.put(_CharT('0') + __digit); + __buf.put('0' + __digit); __digit = _S_try_read_digit(__is, __err); if (__digit != -1) - __buf.put(_CharT('0') + __digit); + __buf.put('0' + __digit); } auto __i = __is.peek(); @@ -5009,7 +5009,7 @@ namespace __detail { __digit = _S_try_read_digit(__is, __err); if (__digit != -1) - __buf.put(_CharT('0') + __digit); + __buf.put('0' + __digit); else break; } diff --git a/libstdc++-v3/testsuite/std/time/parse/parse.cc b/libstdc++-v3/testsuite/std/time/parse/parse.cc index 78c761c115f..d7c73a1150f 100644 --- a/libstdc++-v3/testsuite/std/time/parse/parse.cc +++ b/libstdc++-v3/testsuite/std/time/parse/parse.cc @@ -317,6 +317,19 @@ test_modifiers() VERIFY( s == 12s ); } +void +test_wchar() +{ + std::wistringstream is; + std::chrono::duration ms; + + is.clear(); + is.str(L"0.125"); + is >> parse(L"%S", ms); + VERIFY( is.good() ); + VERIFY( ms.count() == 125 ); +} + int main() { test_recommended_practice(); @@ -324,4 +337,5 @@ int main() test_whitespace(); test_errors(); test_modifiers(); + test_wchar(); }