summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2012-01-06 17:19:32 +0000
committerDouglas Gregor <dgregor@apple.com>2012-01-06 17:19:32 +0000
commit224d8a74ae4087519f07479bb23de4a3ae53e24f (patch)
treef52f7d1f1c63d7f756f2920948ee6fc8090cb688
parentdc90f07b902fe9c71f4c72e8efe951d32f5c0d6d (diff)
downloadbcm5719-llvm-224d8a74ae4087519f07479bb23de4a3ae53e24f.tar.gz
bcm5719-llvm-224d8a74ae4087519f07479bb23de4a3ae53e24f.zip
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
-rw-r--r--clang/lib/Lex/ModuleMap.cpp21
-rw-r--r--clang/test/Modules/Inputs/def-include.h13
-rw-r--r--clang/test/Modules/Inputs/def.h5
3 files changed, 30 insertions, 9 deletions
diff --git a/clang/lib/Lex/ModuleMap.cpp b/clang/lib/Lex/ModuleMap.cpp
index 6c13938c209..55fa50809a1 100644
--- a/clang/lib/Lex/ModuleMap.cpp
+++ b/clang/lib/Lex/ModuleMap.cpp
@@ -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;
}
//----------------------------------------------------------------------------//
diff --git a/clang/test/Modules/Inputs/def-include.h b/clang/test/Modules/Inputs/def-include.h
new file mode 100644
index 00000000000..9e0e575e206
--- /dev/null
+++ b/clang/test/Modules/Inputs/def-include.h
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+struct B {
+ int b1;
+};
diff --git a/clang/test/Modules/Inputs/def.h b/clang/test/Modules/Inputs/def.h
index 7c1a99ef7e6..6d06b081251 100644
--- a/clang/test/Modules/Inputs/def.h
+++ b/clang/test/Modules/Inputs/def.h
@@ -1,4 +1,4 @@
-
+#include "def-include.h"
@@ -8,7 +8,4 @@
}
@end
-struct B {
- int b1;
-};
OpenPOWER on IntegriCloud