Skip to content
Snippets Groups Projects
Commit 74a0dab1 authored by Jonathan Wakely's avatar Jonathan Wakely
Browse files

libstdc++: Implement P2909R4 ("Dude, where's my char?") for C++20

This change ensures that char and wchar_t arguments are formatted
consistently when using integer presentation types. This avoids
non-portable std::format output that depends on whether char and wchar_t
happen to be signed or unsigned on the target. Formatting '\xff' as an
integer will now always format 255 and not sometimes -1. This was
approved in Kona 2023 as a DR for C++20 so the change is implemented
unconditionally.

Also make character formatters check for _Pres_c explicitly and call
_M_format_character directly. This avoid the overhead of calling format
and _S_to_character and then calling _M_format_character anyway.

libstdc++-v3/ChangeLog:

	* include/bits/version.def (format_uchar): Define.
	* include/bits/version.h: Regenerate.
	* include/std/format (formatter<C, C>::format): Check for
	_Pres_c and call _M_format_character directly. Cast C to its
	unsigned equivalent for formatting as an integer.
	(formatter<char, wchar_t>::format): Likewise.
	(basic_format_arg(T&)): Store char arguments as unsigned char
	for formatting to a wide string.
	* testsuite/std/format/functions/format.cc: Adjust test. Check
	formatting of
parent c97436f8
No related branches found
No related tags found
No related merge requests found
Loading
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment