|
@@ -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.
|