[libcxx-commits] [libcxx] 5d87f60 - [libc++] Only include_next C library headers when they exist

Louis Dionne via libcxx-commits libcxx-commits at lists.llvm.org
Thu Nov 17 07:30:39 PST 2022


Author: Louis Dionne
Date: 2022-11-17T10:30:20-05:00
New Revision: 5d87f60f894764bd435086e311605884638d2384

URL: https://github.com/llvm/llvm-project/commit/5d87f60f894764bd435086e311605884638d2384
DIFF: https://github.com/llvm/llvm-project/commit/5d87f60f894764bd435086e311605884638d2384.diff

LOG: [libc++] Only include_next C library headers when they exist

Some platforms don't provide all C library headers. In practice, libc++
only requires a few C library headers to exist, and only a few functions
on those headers. Missing functions that libc++ doesn't need for its own
implementation are handled properly by the using_if_exists attribute,
however a missing header is currently a hard error when we try to
do #include_next.

This patch should make libc++ more flexible on platforms that do not
provide C headers that libc++ doesn't actually require for its own
implementation. The only downside is that it may move some errors from
the #include_next point to later in the compilation if we actually try
to use something that isn't provided, which could be somewhat confusing.
However, these errors should be caught by folks trying to port libc++
over to a new platform (when running the libc++ test suite), not by end
users.

NOTE: This is a reapplicaton of 226409, which was reverted in 674729813
      because it broke the build. The issue has now been fixed with
      https://reviews.llvm.org/D138062.

Differential Revision: https://reviews.llvm.org/D136683

Added: 
    

Modified: 
    libcxx/include/complex.h
    libcxx/include/ctype.h
    libcxx/include/errno.h
    libcxx/include/fenv.h
    libcxx/include/float.h
    libcxx/include/inttypes.h
    libcxx/include/limits.h
    libcxx/include/locale.h
    libcxx/include/math.h
    libcxx/include/setjmp.h
    libcxx/include/stdbool.h
    libcxx/include/stddef.h
    libcxx/include/stdint.h
    libcxx/include/stdio.h
    libcxx/include/stdlib.h
    libcxx/include/string.h
    libcxx/include/tgmath.h
    libcxx/include/wchar.h

Removed: 
    


################################################################################
diff  --git a/libcxx/include/complex.h b/libcxx/include/complex.h
index a2814669c7d40..a3da21c843f36 100644
--- a/libcxx/include/complex.h
+++ b/libcxx/include/complex.h
@@ -24,13 +24,9 @@
 #endif
 
 #ifdef __cplusplus
-
-#include <ccomplex>
-
-#else  // __cplusplus
-
-#include_next <complex.h>
-
-#endif // __cplusplus
+#  include <ccomplex>
+#elif __has_include_next(<complex.h>)
+#  include_next <complex.h>
+#endif
 
 #endif // _LIBCPP_COMPLEX_H

diff  --git a/libcxx/include/ctype.h b/libcxx/include/ctype.h
index ba0925069c644..728173ed670fa 100644
--- a/libcxx/include/ctype.h
+++ b/libcxx/include/ctype.h
@@ -35,7 +35,9 @@ int toupper(int c);
 #  pragma GCC system_header
 #endif
 
-#include_next <ctype.h>
+#if __has_include_next(<ctype.h>)
+#  include_next <ctype.h>
+#endif
 
 #ifdef __cplusplus
 

diff  --git a/libcxx/include/errno.h b/libcxx/include/errno.h
index ea0559f0f5d12..7b02d2b47953b 100644
--- a/libcxx/include/errno.h
+++ b/libcxx/include/errno.h
@@ -28,7 +28,9 @@
 #  pragma GCC system_header
 #endif
 
-#include_next <errno.h>
+#if __has_include_next(<errno.h>)
+#  include_next <errno.h>
+#endif
 
 #ifdef __cplusplus
 

diff  --git a/libcxx/include/fenv.h b/libcxx/include/fenv.h
index a9ba6800245b9..15e41568cbf7d 100644
--- a/libcxx/include/fenv.h
+++ b/libcxx/include/fenv.h
@@ -56,7 +56,9 @@ int feupdateenv(const fenv_t* envp);
 #  pragma GCC system_header
 #endif
 
-#include_next <fenv.h>
+#if __has_include_next(<fenv.h>)
+#  include_next <fenv.h>
+#endif
 
 #ifdef __cplusplus
 

diff  --git a/libcxx/include/float.h b/libcxx/include/float.h
index 606081251dfbb..9e5f711fab831 100644
--- a/libcxx/include/float.h
+++ b/libcxx/include/float.h
@@ -76,7 +76,9 @@
 #  pragma GCC system_header
 #endif
 
-#include_next <float.h>
+#if __has_include_next(<float.h>)
+#  include_next <float.h>
+#endif
 
 #ifdef __cplusplus
 

diff  --git a/libcxx/include/inttypes.h b/libcxx/include/inttypes.h
index e0fd71f9b65de..b755526b84922 100644
--- a/libcxx/include/inttypes.h
+++ b/libcxx/include/inttypes.h
@@ -248,7 +248,9 @@ uintmax_t wcstoumax(const wchar_t* restrict nptr, wchar_t** restrict endptr, int
 #   define __STDC_FORMAT_MACROS
 #endif
 
-#include_next <inttypes.h>
+#if __has_include_next(<inttypes.h>)
+#  include_next <inttypes.h>
+#endif
 
 #ifdef __cplusplus
 

diff  --git a/libcxx/include/limits.h b/libcxx/include/limits.h
index 3e1e85a8a0b4c..032a90967d0c9 100644
--- a/libcxx/include/limits.h
+++ b/libcxx/include/limits.h
@@ -44,7 +44,11 @@
 #endif
 
 #ifndef __GNUC__
-#include_next <limits.h>
+
+#  if __has_include_next(<limits.h>)
+#    include_next <limits.h>
+#  endif
+
 #else
 // GCC header limits.h recursively includes itself through another header called
 // syslimits.h for some reason. This setup breaks down if we directly

diff  --git a/libcxx/include/locale.h b/libcxx/include/locale.h
index 17c0a705a0099..3fb812035a52a 100644
--- a/libcxx/include/locale.h
+++ b/libcxx/include/locale.h
@@ -43,6 +43,8 @@
 #  pragma GCC system_header
 #endif
 
-#include_next <locale.h>
+#if __has_include_next(<locale.h>)
+#  include_next <locale.h>
+#endif
 
 #endif // _LIBCPP_LOCALE_H

diff  --git a/libcxx/include/math.h b/libcxx/include/math.h
index d5a7095a596ae..d60943086036f 100644
--- a/libcxx/include/math.h
+++ b/libcxx/include/math.h
@@ -297,7 +297,9 @@ long double    truncl(long double x);
 #  pragma GCC system_header
 #endif
 
-#include_next <math.h>
+#  if __has_include_next(<math.h>)
+#    include_next <math.h>
+#  endif
 
 #ifdef __cplusplus
 

diff  --git a/libcxx/include/setjmp.h b/libcxx/include/setjmp.h
index de4f9edf48860..f4a2bbcb0bd39 100644
--- a/libcxx/include/setjmp.h
+++ b/libcxx/include/setjmp.h
@@ -31,7 +31,9 @@ void longjmp(jmp_buf env, int val);
 #  pragma GCC system_header
 #endif
 
-#include_next <setjmp.h>
+#if __has_include_next(<setjmp.h>)
+#  include_next <setjmp.h>
+#endif
 
 #ifdef __cplusplus
 

diff  --git a/libcxx/include/stdbool.h b/libcxx/include/stdbool.h
index 0bc1aa8304adc..5bba00568dffc 100644
--- a/libcxx/include/stdbool.h
+++ b/libcxx/include/stdbool.h
@@ -24,7 +24,9 @@
 #  pragma GCC system_header
 #endif
 
-#include_next <stdbool.h>
+#if __has_include_next(<stdbool.h>)
+#  include_next <stdbool.h>
+#endif
 
 #ifdef __cplusplus
 #undef bool

diff  --git a/libcxx/include/stddef.h b/libcxx/include/stddef.h
index 19e344f2a0007..f1725db062125 100644
--- a/libcxx/include/stddef.h
+++ b/libcxx/include/stddef.h
@@ -42,7 +42,9 @@
 #  pragma GCC system_header
 #endif
 
-#include_next <stddef.h>
+#  if __has_include_next(<stddef.h>)
+#    include_next <stddef.h>
+#  endif
 
 #ifdef __cplusplus
     typedef decltype(nullptr) nullptr_t;

diff  --git a/libcxx/include/stdint.h b/libcxx/include/stdint.h
index ee71f62ab0956..fa7b011c71ae2 100644
--- a/libcxx/include/stdint.h
+++ b/libcxx/include/stdint.h
@@ -120,6 +120,8 @@
 #   define __STDC_CONSTANT_MACROS
 #endif
 
-#include_next <stdint.h>
+#if __has_include_next(<stdint.h>)
+#  include_next <stdint.h>
+#endif
 
 #endif // _LIBCPP_STDINT_H

diff  --git a/libcxx/include/stdio.h b/libcxx/include/stdio.h
index ad1b4c05f1fa4..cea43aa7680bc 100644
--- a/libcxx/include/stdio.h
+++ b/libcxx/include/stdio.h
@@ -104,7 +104,9 @@ void perror(const char* s);
 #  pragma GCC system_header
 #endif
 
-#include_next <stdio.h>
+#  if __has_include_next(<stdio.h>)
+#    include_next <stdio.h>
+#  endif
 
 #ifdef __cplusplus
 

diff  --git a/libcxx/include/stdlib.h b/libcxx/include/stdlib.h
index e4dce9c545463..64581b67f245f 100644
--- a/libcxx/include/stdlib.h
+++ b/libcxx/include/stdlib.h
@@ -90,7 +90,9 @@ void *aligned_alloc(size_t alignment, size_t size);                       // C11
 #  pragma GCC system_header
 #endif
 
-#include_next <stdlib.h>
+#  if __has_include_next(<stdlib.h>)
+#    include_next <stdlib.h>
+#  endif
 
 #ifdef __cplusplus
 extern "C++" {

diff  --git a/libcxx/include/string.h b/libcxx/include/string.h
index 082c632a29bc7..627cbae781c13 100644
--- a/libcxx/include/string.h
+++ b/libcxx/include/string.h
@@ -57,7 +57,9 @@ size_t strlen(const char* s);
 #  pragma GCC system_header
 #endif
 
-#include_next <string.h>
+#if __has_include_next(<string.h>)
+#  include_next <string.h>
+#endif
 
 // MSVCRT, GNU libc and its derivates may already have the correct prototype in
 // <string.h>. This macro can be defined by users if their C library provides

diff  --git a/libcxx/include/tgmath.h b/libcxx/include/tgmath.h
index c65091708a9a0..e6f0a4ab2611f 100644
--- a/libcxx/include/tgmath.h
+++ b/libcxx/include/tgmath.h
@@ -24,13 +24,11 @@
 #endif
 
 #ifdef __cplusplus
-
-#include <ctgmath>
-
-#else  // __cplusplus
-
-#include_next <tgmath.h>
-
-#endif // __cplusplus
+#  include <ctgmath>
+#else
+#  if __has_include_next(<tgmath.h>)
+#    include_next <tgmath.h>
+#  endif
+#endif
 
 #endif // _LIBCPP_TGMATH_H

diff  --git a/libcxx/include/wchar.h b/libcxx/include/wchar.h
index 0fba53b268ae6..c684508dc2ccd 100644
--- a/libcxx/include/wchar.h
+++ b/libcxx/include/wchar.h
@@ -120,7 +120,9 @@ size_t wcsrtombs(char* restrict dst, const wchar_t** restrict src, size_t len,
 #define __CORRECT_ISO_CPP_WCHAR_H_PROTO
 #endif
 
-#include_next <wchar.h>
+#  if __has_include_next(<wchar.h>)
+#    include_next <wchar.h>
+#  endif
 
 // Determine whether we have const-correct overloads for wcschr and friends.
 #if defined(_WCHAR_H_CPLUSPLUS_98_CONFORMANCE_)


        


More information about the libcxx-commits mailing list