For Linux/gnu compatibility, preinclude <stdc-predef.h> if the file is available
As reported in llvm bugzilla 32377.
Here’s a patch to add preinclude of stdc-predef.h.
The gcc documentation says “On GNU/Linux, <stdc-predef.h> is pre-included.” See https://gcc.gnu.org/gcc-4.8/porting_to.html;
The preinclude is inhibited with –ffreestanding.
Basically I fixed the failing test cases by adding –ffreestanding which inhibits this behavior.
I fixed all the failing tests, including some in extra/test, there's a separate patch for that which is linked here
Note: this is a recommit after a test failure took down the original (r318669)
Patch By: mibintc
Differential Revision: https://reviews.llvm.org/D34158
llvm-svn: 320391
diff --git a/clang/lib/Frontend/InitPreprocessor.cpp b/clang/lib/Frontend/InitPreprocessor.cpp
index d398904..45760ae 100644
--- a/clang/lib/Frontend/InitPreprocessor.cpp
+++ b/clang/lib/Frontend/InitPreprocessor.cpp
@@ -70,6 +70,15 @@
Builder.append(Twine("#include \"") + File + "\"");
}
+/// AddImplicitSystemIncludeIfExists - Add an implicit system \#include of the
+/// specified file to the predefines buffer: precheck with __has_include.
+static void AddImplicitSystemIncludeIfExists(MacroBuilder &Builder,
+ StringRef File) {
+ Builder.append(Twine("#if __has_include( <") + File + ">)");
+ Builder.append(Twine("#include <") + File + ">");
+ Builder.append(Twine("#endif"));
+}
+
static void AddImplicitIncludeMacros(MacroBuilder &Builder, StringRef File) {
Builder.append(Twine("#__include_macros \"") + File + "\"");
// Marker token to stop the __include_macros fetch loop.
@@ -1133,6 +1142,13 @@
if (!PP.getLangOpts().AsmPreprocessor)
Builder.append("# 1 \"<built-in>\" 2");
+ // Process -fsystem-include-if-exists directives.
+ for (unsigned i = 0,
+ e = InitOpts.FSystemIncludeIfExists.size(); i != e; ++i) {
+ const std::string &Path = InitOpts.FSystemIncludeIfExists[i];
+ AddImplicitSystemIncludeIfExists(Builder, Path);
+ }
+
// If -imacros are specified, include them now. These are processed before
// any -include directives.
for (unsigned i = 0, e = InitOpts.MacroIncludes.size(); i != e; ++i)