[gcc r16-6279] libstdc++: Fix chrono::parse to read from wide strings [PR123147]

Jonathan Wakely redi@gcc.gnu.org
Fri Dec 19 14:11:04 GMT 2025


https://gcc.gnu.org/g:18c306b1f42e3edab6c6fd1a2173d7405a0a9def

commit r16-6279-g18c306b1f42e3edab6c6fd1a2173d7405a0a9def
Author: Jonathan Wakely <jwakely@redhat.com>
Date:   Thu Dec 18 16:39:46 2025 +0000

    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:
---
 libstdc++-v3/include/bits/chrono_io.h          |  8 ++++----
 libstdc++-v3/testsuite/std/time/parse/parse.cc | 14 ++++++++++++++
 2 files changed, 18 insertions(+), 4 deletions(-)

diff --git a/libstdc++-v3/include/bits/chrono_io.h b/libstdc++-v3/include/bits/chrono_io.h
index 75dd532a8cb3..37a296fed7ec 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 78c761c115f6..d7c73a1150fc 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<double, std::milli> 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();
 }


More information about the Libstdc++-cvs mailing list