From 7bfffab5d31dcaf60a8e91e2aa6fbdb05aac79f1 Mon Sep 17 00:00:00 2001 From: Victor Campos Date: Fri, 19 Sep 2025 13:48:00 +0100 Subject: [PATCH 1/2] foo --- libcxx/include/__config | 4 ++- .../depr.c.headers/uchar_h.compile.pass.cpp | 5 ---- .../uchar_h_char8_t.compile.pass.cpp | 24 +++++++++++++++ .../strings/c.strings/cuchar.compile.pass.cpp | 5 ---- .../c.strings/cuchar_char8_t.compile.pass.cpp | 24 +++++++++++++++ .../c.strings/no_c8rtomb_mbrtoc8.verify.cpp | 30 ------------------- 6 files changed, 51 insertions(+), 41 deletions(-) create mode 100644 libcxx/test/std/depr/depr.c.headers/uchar_h_char8_t.compile.pass.cpp create mode 100644 libcxx/test/std/strings/c.strings/cuchar_char8_t.compile.pass.cpp delete mode 100644 libcxx/test/std/strings/c.strings/no_c8rtomb_mbrtoc8.verify.cpp diff --git a/libcxx/include/__config b/libcxx/include/__config index b4c081dcdff1b..5971a3c5407b9 100644 --- a/libcxx/include/__config +++ b/libcxx/include/__config @@ -1021,7 +1021,9 @@ typedef __char32_t char32_t; // the latter depends on internal GNU libc details that are not appropriate // to depend on here, so any declarations present when __cpp_char8_t is not // defined are ignored. -# if defined(_LIBCPP_GLIBC_PREREQ) +# if defined(__clang__) +# define _LIBCPP_HAS_C8RTOMB_MBRTOC8 1 +# elif defined(_LIBCPP_GLIBC_PREREQ) # if _LIBCPP_GLIBC_PREREQ(2, 36) && defined(__cpp_char8_t) # define _LIBCPP_HAS_C8RTOMB_MBRTOC8 1 # else diff --git a/libcxx/test/std/depr/depr.c.headers/uchar_h.compile.pass.cpp b/libcxx/test/std/depr/depr.c.headers/uchar_h.compile.pass.cpp index a1560c8ee5853..c448ba83f4b38 100644 --- a/libcxx/test/std/depr/depr.c.headers/uchar_h.compile.pass.cpp +++ b/libcxx/test/std/depr/depr.c.headers/uchar_h.compile.pass.cpp @@ -23,11 +23,6 @@ // __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(TEST_HAS_NO_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))); diff --git a/libcxx/test/std/depr/depr.c.headers/uchar_h_char8_t.compile.pass.cpp b/libcxx/test/std/depr/depr.c.headers/uchar_h_char8_t.compile.pass.cpp new file mode 100644 index 0000000000000..5e02b70780cd4 --- /dev/null +++ b/libcxx/test/std/depr/depr.c.headers/uchar_h_char8_t.compile.pass.cpp @@ -0,0 +1,24 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// UNSUPPORTED: c++03 + +// The following platforms do not provide mbrtoc8 and c8rtomb so the tests fail +// XFAIL: target={{.+}}-aix{{.*}} +// XFAIL: android +// XFAIL: darwin +// XFAIL: freebsd +// XFAIL: windows +// XFAIL: LIBCXX-PICOLIBC-FIXME + +// + +#include + +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))); diff --git a/libcxx/test/std/strings/c.strings/cuchar.compile.pass.cpp b/libcxx/test/std/strings/c.strings/cuchar.compile.pass.cpp index 2076384deb2b2..96b394a9934f8 100644 --- a/libcxx/test/std/strings/c.strings/cuchar.compile.pass.cpp +++ b/libcxx/test/std/strings/c.strings/cuchar.compile.pass.cpp @@ -23,11 +23,6 @@ // __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(TEST_HAS_NO_C8RTOMB_MBRTOC8) -ASSERT_SAME_TYPE(std::size_t, decltype(std::mbrtoc8((char8_t*)0, (const char*)0, (size_t)0, (mbstate_t*)0))); -ASSERT_SAME_TYPE(std::size_t, decltype(std::c8rtomb((char*)0, (char8_t)0, (mbstate_t*)0))); -#endif - ASSERT_SAME_TYPE(std::size_t, decltype(std::mbrtoc16((char16_t*)0, (const char*)0, (size_t)0, (mbstate_t*)0))); ASSERT_SAME_TYPE(std::size_t, decltype(std::c16rtomb((char*)0, (char16_t)0, (mbstate_t*)0))); diff --git a/libcxx/test/std/strings/c.strings/cuchar_char8_t.compile.pass.cpp b/libcxx/test/std/strings/c.strings/cuchar_char8_t.compile.pass.cpp new file mode 100644 index 0000000000000..4eb5146b78b99 --- /dev/null +++ b/libcxx/test/std/strings/c.strings/cuchar_char8_t.compile.pass.cpp @@ -0,0 +1,24 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// UNSUPPORTED: c++03 + +// The following platforms do not provide mbrtoc8 and c8rtomb so the tests fail +// XFAIL: target={{.+}}-aix{{.*}} +// XFAIL: android +// XFAIL: darwin +// XFAIL: freebsd +// XFAIL: windows +// XFAIL: LIBCXX-PICOLIBC-FIXME + +// + +#include + +ASSERT_SAME_TYPE(std::size_t, decltype(std::mbrtoc8((char8_t*)0, (const char*)0, (size_t)0, (mbstate_t*)0))); +ASSERT_SAME_TYPE(std::size_t, decltype(std::c8rtomb((char*)0, (char8_t)0, (mbstate_t*)0))); diff --git a/libcxx/test/std/strings/c.strings/no_c8rtomb_mbrtoc8.verify.cpp b/libcxx/test/std/strings/c.strings/no_c8rtomb_mbrtoc8.verify.cpp deleted file mode 100644 index 1d4a225668d80..0000000000000 --- a/libcxx/test/std/strings/c.strings/no_c8rtomb_mbrtoc8.verify.cpp +++ /dev/null @@ -1,30 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// UNSUPPORTED: c++03 - -#include - -#include "test_macros.h" - -// When C++ char8_t support is not enabled, definitions of these functions that -// match the C2X declarations may still be present in the global namespace with -// a char8_t typedef substituted for the C++ char8_t type. If so, these are not -// the declarations we are looking for, so don't test for them. -#if !defined(TEST_HAS_NO_CHAR8_T) -using U = decltype(::c8rtomb); -using V = decltype(::mbrtoc8); -# if !_LIBCPP_HAS_C8RTOMB_MBRTOC8 -// expected-error@-3 {{no member named 'c8rtomb' in the global namespace}} -// expected-error@-3 {{no member named 'mbrtoc8' in the global namespace}} -# else -// expected-no-diagnostics -# endif -#else -// expected-no-diagnostics -#endif From e60352c456b4e7f3b4aa4abe233c6b7cf603123e Mon Sep 17 00:00:00 2001 From: Victor Campos Date: Fri, 26 Sep 2025 12:10:22 +0100 Subject: [PATCH 2/2] bar --- libcxx/include/__config | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libcxx/include/__config b/libcxx/include/__config index 5971a3c5407b9..45f6852e379a7 100644 --- a/libcxx/include/__config +++ b/libcxx/include/__config @@ -1021,14 +1021,14 @@ typedef __char32_t char32_t; // the latter depends on internal GNU libc details that are not appropriate // to depend on here, so any declarations present when __cpp_char8_t is not // defined are ignored. -# if defined(__clang__) -# define _LIBCPP_HAS_C8RTOMB_MBRTOC8 1 -# elif defined(_LIBCPP_GLIBC_PREREQ) +# if defined(_LIBCPP_GLIBC_PREREQ) # if _LIBCPP_GLIBC_PREREQ(2, 36) && defined(__cpp_char8_t) # define _LIBCPP_HAS_C8RTOMB_MBRTOC8 1 # else # define _LIBCPP_HAS_C8RTOMB_MBRTOC8 0 # endif +# elif defined(__clang__) +# define _LIBCPP_HAS_C8RTOMB_MBRTOC8 1 # else # define _LIBCPP_HAS_C8RTOMB_MBRTOC8 0 # endif