[libcxx-commits] [PATCH] D142588: [libc++] Remove use of internal glibc macros to determine if c8rtomb() and mbrtoc8() are present
Tom Honermann via Phabricator via libcxx-commits
libcxx-commits at lists.llvm.org
Tue Jan 31 20:50:49 PST 2023
tahonermann updated this revision to Diff 493814.
tahonermann added a comment.
Rebase and test update to ignore any declarations present in the global namespace when char8_t support is not enabled.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D142588/new/
https://reviews.llvm.org/D142588
Files:
libcxx/include/__config
libcxx/test/std/strings/c.strings/no_c8rtomb_mbrtoc8.verify.cpp
Index: libcxx/test/std/strings/c.strings/no_c8rtomb_mbrtoc8.verify.cpp
===================================================================
--- libcxx/test/std/strings/c.strings/no_c8rtomb_mbrtoc8.verify.cpp
+++ libcxx/test/std/strings/c.strings/no_c8rtomb_mbrtoc8.verify.cpp
@@ -17,11 +17,21 @@
#include <uchar.h>
+#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 defined(_LIBCPP_HAS_NO_C8RTOMB_MBRTOC8)
+# if defined(_LIBCPP_HAS_NO_C8RTOMB_MBRTOC8)
// expected-error at -3 {{no member named 'c8rtomb' in the global namespace}}
// expected-error at -3 {{no member named 'mbrtoc8' in the global namespace}}
+# else
+// expected-no-diagnostics
+# endif
#else
// expected-no-diagnostics
#endif
Index: libcxx/include/__config
===================================================================
--- libcxx/include/__config
+++ libcxx/include/__config
@@ -1227,12 +1227,12 @@
// functions are declared by the C library.
# define _LIBCPP_HAS_NO_C8RTOMB_MBRTOC8
// GNU libc 2.36 and newer declare c8rtomb() and mbrtoc8() in C++ modes if
-// __cpp_char8_t is defined or if C2X extensions are enabled. Unfortunately,
-// determining the latter depends on internal GNU libc details. If the
-// __cpp_char8_t feature test macro is not defined, then a char8_t typedef
-// will be declared as well.
-# if defined(_LIBCPP_GLIBC_PREREQ) && defined(__GLIBC_USE)
-# if _LIBCPP_GLIBC_PREREQ(2, 36) && (defined(__cpp_char8_t) || __GLIBC_USE(ISOC2X))
+// __cpp_char8_t is defined or if C2X extensions are enabled. Determining
+// 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 _LIBCPP_GLIBC_PREREQ(2, 36) && defined(__cpp_char8_t)
# undef _LIBCPP_HAS_NO_C8RTOMB_MBRTOC8
# endif
# endif
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D142588.493814.patch
Type: text/x-patch
Size: 2256 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/libcxx-commits/attachments/20230201/bccb9112/attachment.bin>
More information about the libcxx-commits
mailing list