On Wed, 24 Dec 2025 at 17:01, 王靖淏 <[email protected]> wrote: > > On Mon, Dec 22, 2025 at 4:37 AM Jonathan Wakely <[email protected]> wrote: > > > > > > > > On Sun, 21 Dec 2025, 19:44 Wang Jinghao, <[email protected]> wrote: > >> > >> Ignoring FORMAT_MESSAGE_IGNORE_INSERTS when retrieving system > >> error messages from FormatMessage may result in unexpected error messages > >> and > >> trigger new exceptions. > > > > > > For those like me who have no idea what this is about, this explains it: > > https://devblogs.microsoft.com/oldnewthing/20071128-00/?p=24353 > > > > Can we add a test with error code 87? > I discovered that `std::local` does not affect the language used by > the system error information obtained by `FormatMessage`. It seems > that `void test3()` in > `libstdc++-v3\testsuite\19_diagnostics\error_category\system_category.cc` > cannot pass errors in non-English language environments. > > > > > >> This patch changes the > >> std::system_category.message(int) to be the same as the flags in > >> gcc/plugin.cc:win32_error_msg() > >> > >> libstdc++-v3/ChangeLog: > >> > >> * src/c++11/system_error.cc: > > > > > > This changelog entry is missing a description. > I'am sorry I forgot. ; ( > > libstdc++-v3/ChangeLog: > > * src/c++11/system_error.cc (std::system_category): Add flag > FORMAT_MESSAGE_IGNORE_INSERTS and > FORMAT_MESSAGE_MAX_WIDTH_MASK to > dwFlag parameter of the FormatMessage function. > > >> --- > >> libstdc++-v3/src/c++11/system_error.cc | 4 +++- > >> 1 file changed, 3 insertions(+), 1 deletion(-) > >> > >> diff --git a/libstdc++-v3/src/c++11/system_error.cc > >> b/libstdc++-v3/src/c++11/system_error.cc > >> index b9a0b2c158f..ea7b5cd1226 100644 > >> --- a/libstdc++-v3/src/c++11/system_error.cc > >> +++ b/libstdc++-v3/src/c++11/system_error.cc > >> @@ -162,7 +162,9 @@ namespace > >> char* buf = nullptr; > >> auto len > >> = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM > >> - | FORMAT_MESSAGE_ALLOCATE_BUFFER, > >> + | FORMAT_MESSAGE_ALLOCATE_BUFFER > >> + | FORMAT_MESSAGE_IGNORE_INSERTS > >> + | FORMAT_MESSAGE_MAX_WIDTH_MASK, > >> nullptr, > >> i, > >> LANG_USER_DEFAULT, > >> -- > >> 2.52.0 > >> > > I found that the existing `test03` function in > `libstdc++-v3/src/c++11/system_error.cc`, used for testing > `std::system_error_category.message(int)`, doesn't work correctly in > non-English language environments. This is likely because neither > `std::locale` nor `std::setlocale` affects the language of the error > message obtained by `FormatMessage()`. Furthermore, in non-English > environments, such as Chinese, system error messages end with "."\r\n" > instead of ".\r\n", which prevents `__builtin_memcmp(buf + len - 3, > ".\r\n", 3) {in libstdc++-v3\src\c++11\system_error.cc:178}` from > correctly removing the trailing "\r\n". > > This is my first time, and I'm not sure if I need to resubmit a patch.ಥ_ಥ
I'll deal with it in January.
