HeaderFileInfo *HFI = &FileInfo[FE->getUID()];
// FIXME: Use a generation count to check whether this is really up to date.
if (ExternalSource && !HFI->Resolved) {
- HFI->Resolved = true;
auto ExternalHFI = ExternalSource->GetHeaderFileInfo(FE);
-
- HFI = &FileInfo[FE->getUID()];
- if (ExternalHFI.External)
- mergeHeaderFileInfo(*HFI, ExternalHFI);
+ if (ExternalHFI.IsValid) {
+ HFI->Resolved = true;
+ if (ExternalHFI.External)
+ mergeHeaderFileInfo(*HFI, ExternalHFI);
+ }
}
HFI->IsValid = true;
if (!WantExternal && (!HFI->IsValid || HFI->External))
return nullptr;
if (!HFI->Resolved) {
- HFI->Resolved = true;
auto ExternalHFI = ExternalSource->GetHeaderFileInfo(FE);
-
- HFI = &FileInfo[FE->getUID()];
- if (ExternalHFI.External)
- mergeHeaderFileInfo(*HFI, ExternalHFI);
+ if (ExternalHFI.IsValid) {
+ HFI->Resolved = true;
+ if (ExternalHFI.External)
+ mergeHeaderFileInfo(*HFI, ExternalHFI);
+ }
}
} else if (FE->getUID() >= FileInfo.size()) {
return nullptr;
--- /dev/null
+// RUN: rm -rf %t
+// RUN: %clang_cc1 -fmodules -fmodule-name=ImportOnce -fimplicit-module-maps -fmodules-cache-path=%t -F %S/Inputs/import-once %s
+
+// Test #import-ed headers are processed only once, even without header guards.
+// Dependency graph is
+//
+// Unrelated ImportOnce
+// ^ ^ ^
+// \ / |
+// IndirectImporter |
+// ^ |
+// \ |
+// import-once.m
+#import <IndirectImporter/IndirectImporter.h>
+#import <ImportOnce/ImportOnce.h>