From 6fe2a45182c24cfc5c64dabdca8cbc972efdba45 Mon Sep 17 00:00:00 2001 From: Richard Smith Date: Wed, 26 Oct 2016 01:08:55 +0000 Subject: [PATCH] Treat module headers wrapped by our builtin headers as implicitly being textual headers. We previously got this check backwards and treated the wrapper header as being textual. This is important because our wrapper headers sometimes inject macros into the system headers that they #include_next, and sometimes replace them entirely. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@285152 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Lex/ModuleMap.cpp | 14 +++++++++----- test/Modules/Inputs/System/usr/include/stdbool.h | 2 +- .../libc-libcxx/sysroot/usr/include/stddef.h | 1 - test/Modules/cstd.m | 2 +- 4 files changed, 11 insertions(+), 8 deletions(-) diff --git a/lib/Lex/ModuleMap.cpp b/lib/Lex/ModuleMap.cpp index 6a261a1154..2b6b78acee 100644 --- a/lib/Lex/ModuleMap.cpp +++ b/lib/Lex/ModuleMap.cpp @@ -1881,16 +1881,20 @@ void ModuleMapParser::parseHeaderDecl(MMToken::TokenKind LeadingToken, Module::Header H = {RelativePathName.str(), File}; Map.excludeHeader(ActiveModule, H); } else { - // If there is a builtin counterpart to this file, add it now as a textual - // header, so it can be #include_next'd by the wrapper header, and can - // receive macros from the wrapper header. + // If there is a builtin counterpart to this file, add it now so it can + // wrap the system header. if (BuiltinFile) { // FIXME: Taking the name from the FileEntry is unstable and can give // different results depending on how we've previously named that file // in this build. Module::Header H = { BuiltinFile->getName(), BuiltinFile }; - Map.addHeader(ActiveModule, H, ModuleMap::ModuleHeaderRole( - Role | ModuleMap::TextualHeader)); + Map.addHeader(ActiveModule, H, Role); + + // If we have both a builtin and system version of the file, the + // builtin version may want to inject macros into the system header, so + // force the system header to be treated as a textual header in this + // case. + Role = ModuleMap::ModuleHeaderRole(Role | ModuleMap::TextualHeader); } // Record this header. diff --git a/test/Modules/Inputs/System/usr/include/stdbool.h b/test/Modules/Inputs/System/usr/include/stdbool.h index 50be7543c4..760d7dc48e 100644 --- a/test/Modules/Inputs/System/usr/include/stdbool.h +++ b/test/Modules/Inputs/System/usr/include/stdbool.h @@ -1 +1 @@ -#include_next +// Testing hack: does not define bool/true/false. diff --git a/test/Modules/Inputs/libc-libcxx/sysroot/usr/include/stddef.h b/test/Modules/Inputs/libc-libcxx/sysroot/usr/include/stddef.h index c211f99261..eca72412a6 100644 --- a/test/Modules/Inputs/libc-libcxx/sysroot/usr/include/stddef.h +++ b/test/Modules/Inputs/libc-libcxx/sysroot/usr/include/stddef.h @@ -1,2 +1 @@ // stddef.h -#include_next "stddef.h" diff --git a/test/Modules/cstd.m b/test/Modules/cstd.m index 7df727d2ef..2182140d5d 100644 --- a/test/Modules/cstd.m +++ b/test/Modules/cstd.m @@ -1,5 +1,5 @@ // RUN: rm -rf %t -// RUN: %clang_cc1 -fsyntax-only -isystem %S/Inputs/System/usr/include -ffreestanding -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -D__need_wint_t -Werror=implicit-function-declaration %s +// RUN: %clang_cc1 -fsyntax-only -internal-isystem %S/Inputs/System/usr/include -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -D__need_wint_t -Werror=implicit-function-declaration %s @import uses_other_constants; const double other_value = DBL_MAX; -- 2.40.0