aboutsummaryrefslogtreecommitdiff
path: root/lib/Frontend/CompilerInstance.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Frontend/CompilerInstance.cpp')
-rw-r--r--lib/Frontend/CompilerInstance.cpp8
1 files changed, 8 insertions, 0 deletions
diff --git a/lib/Frontend/CompilerInstance.cpp b/lib/Frontend/CompilerInstance.cpp
index dfc98e8bfb..66b381e522 100644
--- a/lib/Frontend/CompilerInstance.cpp
+++ b/lib/Frontend/CompilerInstance.cpp
@@ -1070,6 +1070,12 @@ static void compileModule(CompilerInstance &ImportingInstance,
ModuleKey CompilerInstance::loadModule(SourceLocation ImportLoc,
ModuleIdPath Path) {
+ // If we've already handled this import, just return the cached result.
+ // This one-element cache is important to eliminate redundant diagnostics
+ // when both the preprocessor and parser see the same import declaration.
+ if (!ImportLoc.isInvalid() && LastModuleImportLoc == ImportLoc)
+ return LastModuleImportResult.getOpaqueValue();
+
// Determine what file we're searching from.
SourceManager &SourceMgr = getSourceManager();
SourceLocation ExpandedImportLoc = SourceMgr.getExpansionLoc(ImportLoc);
@@ -1241,6 +1247,8 @@ ModuleKey CompilerInstance::loadModule(SourceLocation ImportLoc,
// FIXME: The module file's FileEntry makes a poor key indeed! Once we
// eliminate the need for FileEntry here, the module itself will become the
// key (which does make sense).
+ LastModuleImportLoc = ImportLoc;
+ LastModuleImportResult = Known;
return Known.getOpaqueValue();
}