When inferring a submodule ID during module creation, look up the

include stack to find the first file that is known to be part of the
module. This copes with situations where the module map doesn't
completely specify all of the headers that are involved in the module,
which can come up when there are very strange #include_next chains
(e.g., with weird compiler/stdlib headers like stdarg.h or float.h).

llvm-svn: 147662
This commit is contained in:
Douglas Gregor 2012-01-06 17:19:32 +00:00
parent dc90f07b90
commit 224d8a74ae
3 changed files with 30 additions and 9 deletions

View File

@ -426,12 +426,23 @@ Module *ModuleMap::inferModuleFromLocation(FullSourceLoc Loc) {
const SourceManager &SrcMgr = Loc.getManager();
FileID ExpansionFileID = ExpansionLoc.getFileID();
const FileEntry *ExpansionFile = SrcMgr.getFileEntryForID(ExpansionFileID);
if (!ExpansionFile)
return 0;
// Find the module that owns this header.
return findModuleForHeader(ExpansionFile);
while (const FileEntry *ExpansionFile
= SrcMgr.getFileEntryForID(ExpansionFileID)) {
// Find the module that owns this header (if any).
if (Module *Mod = findModuleForHeader(ExpansionFile))
return Mod;
// No module owns this header, so look up the inclusion chain to see if
// any included header has an associated module.
SourceLocation IncludeLoc = SrcMgr.getIncludeLoc(ExpansionFileID);
if (IncludeLoc.isInvalid())
return 0;
ExpansionFileID = SrcMgr.getFileID(IncludeLoc);
}
return 0;
}
//----------------------------------------------------------------------------//

View File

@ -0,0 +1,13 @@
struct B {
int b1;
};

View File

@ -1,4 +1,4 @@
#include "def-include.h"
@ -8,7 +8,4 @@
}
@end
struct B {
int b1;
};