在 2025-6-8 00:21, Kirill Makurin 写道:
I guess sticking to range [0,255] is our best choice.I attached patches.
Mostly these look good to me. However I get errors from libc++ testsuite: https://github.com/lhmouse/mingw-w64/actions/runs/15650737822/job/44095645474#step:7:13365which failed at this, which can by producedby installing mingw-w64 CRT with the first patch and compiling the testcase with `clang++ -static`:
std::locale l;
typedef std::ctype_byname<wchar_t> F;
std::locale ll(l, new F("C"));
const F& f = std::use_facet<F>(ll);
assert(f.widen(char(-5)) == L'\u00fb');
And here's backtrace:
#0 0x00007ff657205139 in btowc (c=-5) at misc/btowc.c:16
#1 0x00007ff6571fcd61 in std::__1::__locale::__btowc(int,
std::__1::__locale::__locale_t) ()
#2 0x00007ff6571dda9a in std::__1::ctype_byname<wchar_t>::do_widen(char)
const ()
#3 0x00007ff6571b19ac in std::__1::ctype<wchar_t>::widen[abi:ne200100](char) const (this=0x5b9c40,
__c=-5 '\373') at C:/MSYS64/clang64/include/c++/v1/__locale:490
#4 0x00007ff6571b1884 in main () at test.cc:37
Here we can see the parameter `c` of type `int` is a sign-extension of the
argument, so I think this
if (cp == 0)
return (unsigned) c <= 0xFF ? c : WEOF;
is being skeptical. What if we blindly truncate `c`, just like the code beneath
it:
if (cp == 0)
return (unsigned char) c;
--
Best regards,
LIU Hao
OpenPGP_signature.asc
Description: OpenPGP digital signature
_______________________________________________ Mingw-w64-public mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/mingw-w64-public
