https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114876
Bruno Haible <bruno at clisp dot org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |bruno at clisp dot org --- Comment #1 from Bruno Haible <bruno at clisp dot org> --- What does *printf of %lc with a (wint_t) '\0' argument do? Note that the published POSIX:2018 still has a wrong description: Its description requires *printf to produce 0 characters. This was wrong in ISO C as well. It has been corrected in ISO C 23 ยง 7.23.6.1, in the meeting from 2023-06-20 to 2023-06-23. See https://www.open-std.org/JTC1/sc22/wg14/www/docs/n3167.pdf section GB-141 page 23, 24. The decision ("option 1") is detailed in https://www.open-std.org/JTC1/sc22/wg14/www/docs/n3148.doc row GB-141 page 34, 35: "Option 1 (require a NUL) - change the text to: If an l length modifier is present, the wint_t argument is converted as if by a call to the wcrtomb function with a pointer to storage of at least MB_CUR_MAX bytes, the wint_t argument converted to wchar_t, and an initial shift state." This description requires *printf to produce 1 NUL character. Then, the Austin Group followed suit and, through https://austingroupbugs.net/view.php?id=1647 , decided that POSIX will use the same definition: "If an l (ell) qualifier is present, the wint_t argument shall be converted to a multi-byte sequence as if by a call to wcrtomb( ) with the wint_t argument converted to wchar_t and an initial shift state, and the resulting bytes written." This aligns the POSIX behaviour with what glibc was doing all the time, namely to produce 1 NUL character.