[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