Index: libcxx/include/__config =================================================================== --- libcxx/include/__config +++ libcxx/include/__config @@ -1219,6 +1219,12 @@ # define _LIBCPP_PACKED # endif +# if defined(_LIBCPP_GLIBC_PREREQ) +# if _LIBCPP_GLIBC_PREREQ(2, 36) +# define _LIBCPP_HAS_C8RTOMB_MBRTOC8 +# endif +# endif + #endif // __cplusplus #endif // _LIBCPP___CONFIG Index: libcxx/include/cuchar =================================================================== --- libcxx/include/cuchar +++ libcxx/include/cuchar @@ -25,6 +25,8 @@ mbstate_t size_t +size_t mbrtoc8(char8_t* pc8, const char* s, size_t n, mbstate_t* ps); // C++20 +size_t c8rtomb(char* s, char8_t c8, mbstate_t* ps); // C++20 size_t mbrtoc16(char16_t* pc16, const char* s, size_t n, mbstate_t* ps); size_t c16rtomb(char* s, char16_t c16, mbstate_t* ps); size_t mbrtoc32(char32_t* pc32, const char* s, size_t n, mbstate_t* ps); @@ -49,6 +51,8 @@ using ::mbstate_t _LIBCPP_USING_IF_EXISTS; using ::size_t _LIBCPP_USING_IF_EXISTS; +using ::mbrtoc8 _LIBCPP_USING_IF_EXISTS; +using ::c8rtomb _LIBCPP_USING_IF_EXISTS; using ::mbrtoc16 _LIBCPP_USING_IF_EXISTS; using ::c16rtomb _LIBCPP_USING_IF_EXISTS; using ::mbrtoc32 _LIBCPP_USING_IF_EXISTS; Index: libcxx/include/uchar.h =================================================================== --- libcxx/include/uchar.h +++ libcxx/include/uchar.h @@ -11,7 +11,7 @@ #define _LIBCPP_UCHAR_H /* - uchar.h synopsis // since C++11 + uchar.h synopsis // since C11 Macros: @@ -22,7 +22,12 @@ mbstate_t size_t + char8_t // C23, Builtin type in C++20 + char16_t // Builtin type in C++11 + char32_t // Builtin type in C++11 +size_t mbrtoc8(char8_t* pc8, const char* s, size_t n, mbstate_t* ps); // C23 +size_t c8rtomb(char* s, char8_t c8, mbstate_t* ps); // C23 size_t mbrtoc16(char16_t* pc16, const char* s, size_t n, mbstate_t* ps); size_t c16rtomb(char* s, char16_t c16, mbstate_t* ps); size_t mbrtoc32(char32_t* pc32, const char* s, size_t n, mbstate_t* ps); Index: libcxx/test/std/depr/depr.c.headers/uchar_h.compile.pass.cpp =================================================================== --- libcxx/test/std/depr/depr.c.headers/uchar_h.compile.pass.cpp +++ libcxx/test/std/depr/depr.c.headers/uchar_h.compile.pass.cpp @@ -23,6 +23,11 @@ // __STDC_UTF_16__ may or may not be defined by the C standard library // __STDC_UTF_32__ may or may not be defined by the C standard library +#if defined(_LIBCPP_HAS_C8RTOMB_MBRTOC8) +ASSERT_SAME_TYPE(size_t, decltype(mbrtoc8((char8_t*)0, (const char*)0, (size_t)0, (mbstate_t*)0))); +ASSERT_SAME_TYPE(size_t, decltype(c8rtomb((char*)0, (char8_t)0, (mbstate_t*)0))); +#endif + ASSERT_SAME_TYPE(size_t, decltype(mbrtoc16((char16_t*)0, (const char*)0, (size_t)0, (mbstate_t*)0))); ASSERT_SAME_TYPE(size_t, decltype(c16rtomb((char*)0, (char16_t)0, (mbstate_t*)0))); Index: libcxx/test/std/strings/c.strings/cuchar.compile.pass.cpp =================================================================== --- libcxx/test/std/strings/c.strings/cuchar.compile.pass.cpp +++ libcxx/test/std/strings/c.strings/cuchar.compile.pass.cpp @@ -20,11 +20,14 @@ #include "test_macros.h" -// TODO: Implement mbrtoc8 and c8rtomb, and add tests for those - // __STDC_UTF_16__ may or may not be defined by the C standard library // __STDC_UTF_32__ may or may not be defined by the C standard library +#if defined(_LIBCPP_HAS_C8RTOMB_MBRTOC8) +ASSERT_SAME_TYPE(size_t, decltype(std::mbrtoc8((char8_t*)0, (const char*)0, (size_t)0, (mbstate_t*)0))); +ASSERT_SAME_TYPE(size_t, decltype(std::c8rtomb((char*)0, (char8_t)0, (mbstate_t*)0))); +#endif + ASSERT_SAME_TYPE(size_t, decltype(std::mbrtoc16((char16_t*)0, (const char*)0, (size_t)0, (mbstate_t*)0))); ASSERT_SAME_TYPE(size_t, decltype(std::c16rtomb((char*)0, (char16_t)0, (mbstate_t*)0)));