Skip to content
Snippets Groups Projects
  • Jonathan Wakely's avatar
    1a5e4dd8
    libstdc++: Implement std::formatter<std::thread::id> without <sstream> [PR115099] · 1a5e4dd8
    Jonathan Wakely authored
    The std::thread::id formatter uses std::basic_ostringstream without
    including <sstream>, which went unnoticed because the test for it uses
    a stringstream to check the output is correct.
    
    The fix implemented here is to stop using basic_ostringstream for
    formatting thread::id and just use std::format instead.
    
    As a drive-by fix, the formatter specialization is constrained to
    require that the thread::id::native_handle_type can be formatted, to
    avoid making the formatter ill-formed if the pthread_t type is not a
    pointer or integer. Since non-void pointers can't be formatted, ensure
    that we convert pointers to const void* for formatting. Make a similar
    change to the existing operator<< overload so that in the unlikely case
    that pthread_t is a typedef for char* we don't treat it as a
    null-terminated string when inserting into a stream.
    
    libstdc++-v3/ChangeLog:
    
    	PR libstdc++/115099
    	* include/bits/std_thread.h: Declare formatter as friend of
    	thread::id.
    	* include/std/thread (operator<<): Convert non-void pointers to
    	void pointers for output.
    	(formatter): Add constraint that thread::native_handle_type is a
    	pointer or integer.
    	(formatter::format): Reimplement without basic_ostringstream.
    	* testsuite/30_threads/thread/id/output.cc: Check output
    	compiles before <sstream> has been included.
    1a5e4dd8
    History
    libstdc++: Implement std::formatter<std::thread::id> without <sstream> [PR115099]
    Jonathan Wakely authored
    The std::thread::id formatter uses std::basic_ostringstream without
    including <sstream>, which went unnoticed because the test for it uses
    a stringstream to check the output is correct.
    
    The fix implemented here is to stop using basic_ostringstream for
    formatting thread::id and just use std::format instead.
    
    As a drive-by fix, the formatter specialization is constrained to
    require that the thread::id::native_handle_type can be formatted, to
    avoid making the formatter ill-formed if the pthread_t type is not a
    pointer or integer. Since non-void pointers can't be formatted, ensure
    that we convert pointers to const void* for formatting. Make a similar
    change to the existing operator<< overload so that in the unlikely case
    that pthread_t is a typedef for char* we don't treat it as a
    null-terminated string when inserting into a stream.
    
    libstdc++-v3/ChangeLog:
    
    	PR libstdc++/115099
    	* include/bits/std_thread.h: Declare formatter as friend of
    	thread::id.
    	* include/std/thread (operator<<): Convert non-void pointers to
    	void pointers for output.
    	(formatter): Add constraint that thread::native_handle_type is a
    	pointer or integer.
    	(formatter::format): Reimplement without basic_ostringstream.
    	* testsuite/30_threads/thread/id/output.cc: Check output
    	compiles before <sstream> has been included.