[libc-commits] [PATCH] D94642: [libc] Use #undef isascii in specific header

Roland McGrath via Phabricator via libc-commits libc-commits at lists.llvm.org
Wed Jan 13 17:24:32 PST 2021


mcgrathr created this revision.
mcgrathr added reviewers: michaelrj, sivachandra.
Herald added subscribers: libc-commits, ecnelises, tschuett.
Herald added a project: libc-project.
mcgrathr requested review of this revision.

Standard C allows all standard headers to declare macros for all
their functions.  So after possibly including any standard header
like <ctype.h>, it's perfectly normal for any and all of the
functions it declares to be defined as macros.  Standard C requires
explicit `#undef` before using that identifier in a way that is not
compatible with function-like macro definitions.

The C standard's rules for this are extended to POSIX as well for
the interfaces it defines, and it's the expected norm for
nonstandard extensions declared by standard C library headers too.

So far the only place this has come up for llvm-libc's code is with
the isascii function in Fuchsia's libc.  But other cases can arise
for any standard (or common extension) function names that source
code in llvm-libc is using in nonstandard ways, i.e. as C++
identifiers.

The only correct and robust way to handle the possible inclusion of
standard C library headers when building llvm-libc source code is to
use `#undef` explicitly for each identifier before using it.  The
easy and obvious place to do that is in the per-function header.
This requires that all code, such as test code, that might include
any standard C library headers, e.g. via utils/UnitTest/Test.h, make
sure to include those *first* before the per-function header.

This change does that for isascii and its test.  But it should be
done uniformly for all the code and documented as a consistent
convention so new implementation files are sure to get this right.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D94642

Files:
  libc/src/ctype/isascii.h
  libc/test/src/ctype/isascii_test.cpp
  libc/utils/UnitTest/FuchsiaTest.h


Index: libc/utils/UnitTest/FuchsiaTest.h
===================================================================
--- libc/utils/UnitTest/FuchsiaTest.h
+++ libc/utils/UnitTest/FuchsiaTest.h
@@ -10,11 +10,5 @@
 #define LLVM_LIBC_UTILS_UNITTEST_FUCHSIATEST_H
 
 #include <zxtest/zxtest.h>
-// isascii is being undef'd because Fuchsia's headers define a macro for
-// isascii. that macro causes errors when isascii_test.cpp references
-// __llvm_libc::isascii since the macro is applied first.
-#ifdef isascii
-#undef isascii
-#endif
 
 #endif // LLVM_LIBC_UTILS_UNITTEST_FUCHSIATEST_H
Index: libc/test/src/ctype/isascii_test.cpp
===================================================================
--- libc/test/src/ctype/isascii_test.cpp
+++ libc/test/src/ctype/isascii_test.cpp
@@ -6,10 +6,10 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "src/ctype/isascii.h"
-
 #include "utils/UnitTest/Test.h"
 
+#include "src/ctype/isascii.h"
+
 TEST(IsAscii, DefaultLocale) {
   // Loops through all characters, verifying that ascii characters
   //    (which are all 7 bit unsigned integers)
Index: libc/src/ctype/isascii.h
===================================================================
--- libc/src/ctype/isascii.h
+++ libc/src/ctype/isascii.h
@@ -9,6 +9,8 @@
 #ifndef LLVM_LIBC_SRC_CTYPE_ISASCII_H
 #define LLVM_LIBC_SRC_CTYPE_ISASCII_H
 
+#undef isascii
+
 namespace __llvm_libc {
 
 int isascii(int c);


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D94642.316539.patch
Type: text/x-patch
Size: 1451 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/libc-commits/attachments/20210114/2f25c22e/attachment.bin>


More information about the libc-commits mailing list