Merge "Disable uchar.start_state test for musl." into main am: 23f67fbb08

Original change: https://android-review.googlesource.com/c/platform/bionic/+/2667483

Change-Id: I5a7138af2d6ab06ab72d46df47c9037ead236f91
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Treehugger Robot 2023-07-21 01:33:26 +00:00 committed by Automerger Merge Worker
commit d00cd20112

View file

@ -71,19 +71,42 @@ TEST(uchar, sizeof_uchar_t) {
}
TEST(uchar, start_state) {
// C23 does not appear to specify the behavior of the conversion functions if
// a state is reused before the character is completed. In the wchar.h section
// (7.31.6.3) it says:
//
// If an mbstate_t object has been altered by any of the functions
// described in this subclause, and is then used with a different
// multibyte character sequence, or in the other conversion direction, or
// with a different LC_CTYPE category setting than on earlier function
// calls, the behavior is undefined.
//
// But "described in this subclause" refers to the wchar.h functions, not the
// uchar.h ones.
//
// Since C has no opinion, we need to make a choice. While no caller should
// ever do this (what does it mean to begin decoding a UTF-32 character while
// still in the middle of a UTF-8 sequence?), considering that a decoding
// error seems the least surprising. Bionic and glibc both have that behavior.
// musl ignores the state (it also doesn't make much sense to read the state
// when the entire conversion completes in a single call) and decodes the
// UTF-32 character.
#if !defined(ANDROID_HOST_MUSL)
ASSERT_STREQ("C.UTF-8", setlocale(LC_CTYPE, "C.UTF-8"));
uselocale(LC_GLOBAL_LOCALE);
char out[MB_LEN_MAX];
mbstate_t ps;
// Any non-initial state is invalid when calling c32rtomb.
memset(&ps, 0, sizeof(ps));
EXPECT_EQ(static_cast<size_t>(-2), mbrtoc32(nullptr, "\xc2", 1, &ps));
errno = 0;
EXPECT_EQ(static_cast<size_t>(-1), c32rtomb(out, 0x00a2, &ps));
EXPECT_EQ(EILSEQ, errno);
// Similarly (but not in compliance with the standard afaict), musl seems to
// ignore the state entirely for the UTF-32 functions rather than reset it.
// If the first argument to c32rtomb is nullptr or the second is L'\0' the shift
// state should be reset.
memset(&ps, 0, sizeof(ps));
@ -95,6 +118,7 @@ TEST(uchar, start_state) {
EXPECT_EQ(static_cast<size_t>(-2), mbrtoc32(nullptr, "\xf0\xa4", 1, &ps));
EXPECT_EQ(1U, c32rtomb(out, L'\0', &ps));
EXPECT_TRUE(mbsinit(&ps));
#endif
}
TEST(uchar, c16rtomb_null_out) {