[Bug libstdc++/86419] codecvt<char16_t, ...>::in() and out() incorrectly return partial in some cases.
redi at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Fri Jul 6 12:43:00 GMT 2018
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86419
--- Comment #3 from Jonathan Wakely <redi at gcc dot gnu.org> ---
Thanks, this is still present in the latest version of the code too.
This just includes the failing cases:
#include <cassert>
#include <locale>
using namespace std;
// 2 code points, both are 4 byte in UTF-8.
// in UTF-16 both are 2 unit i.e. surrogate pairs
const char* u8in = u8"\U0010FFFF\U0010AAAA";
//tests .in() function of codecvt<char16_t, char, mbstate>
auto test_u16_in()
{
char16_t u16out[4];
auto& cvt =
use_facet<codecvt<char16_t, char, mbstate_t>>(locale::classic());
auto state = mbstate_t{};
auto in_ptr = u8in;
auto out_ptr = u16out;
state = {};
in_ptr = nullptr;
out_ptr = nullptr;
auto res =
cvt.in(state, u8in, u8in + 6, in_ptr, u16out, u16out + 2, out_ptr);
// actual output
assert(res == cvt.partial); // BUG
assert(out_ptr == u16out + 2);
assert(in_ptr == u8in + 4);
// expected output
// assert(res == cvt.partial);
// assert(out_ptr == u16str+2);
// assert(in_ptr == u8str+4);
state = {};
in_ptr = nullptr;
out_ptr = nullptr;
res =
cvt.in(state, u8in, u8in + 8, in_ptr, u16out, u16out + 2, out_ptr);
// actual output
assert(res == cvt.partial); // BUG
assert(out_ptr == u16out + 2);
assert(in_ptr == u8in + 4);
// expected output
// assert(res == cvt.partial);
// assert(out_ptr == u16str+2);
// assert(in_ptr == u8str+4);
}
//tests .out() function of codecvt<char16_t, char, mbstate>
auto test_u16_out()
{
const char16_t* u16in = u"\U0010FFFF\U0010AAAA";
char u8out[8];
auto& cvt =
use_facet<codecvt<char16_t, char, mbstate_t>>(locale::classic());
auto state = mbstate_t{};
auto in_ptr = u16in;
auto out_ptr = u8out;
state = {};
in_ptr = nullptr;
out_ptr = nullptr;
auto res =
cvt.out(state, u16in, u16in + 1, in_ptr, u8out, u8out + 3,
out_ptr);
assert(res == cvt.partial); // BUG
assert(in_ptr == u16in);
assert(out_ptr == u8out);
state = {};
in_ptr = nullptr;
out_ptr = nullptr;
res =
cvt.out(state, u16in, u16in + 1, in_ptr, u8out, u8out + 4,
out_ptr);
assert(res == cvt.partial); // BUG
assert(in_ptr == u16in);
assert(out_ptr == u8out);
state = {};
in_ptr = nullptr;
out_ptr = nullptr;
res =
cvt.out(state, u16in, u16in + 3, in_ptr, u8out, u8out + 4,
out_ptr);
assert(res == cvt.partial); // BUG
assert(in_ptr == u16in + 2);
assert(out_ptr == u8out + 4);
state = {};
in_ptr = nullptr;
out_ptr = nullptr;
res =
cvt.out(state, u16in, u16in + 3, in_ptr, u8out, u8out + 8,
out_ptr);
assert(res == cvt.partial); // BUG
assert(in_ptr == u16in + 2);
assert(out_ptr == u8out + 4);
}
int main()
{
test_u16_in();
test_u16_out();
}
More information about the Gcc-bugs
mailing list