aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/Frontend/CompilerInstance.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'clang/lib/Frontend/CompilerInstance.cpp')
-rw-r--r--clang/lib/Frontend/CompilerInstance.cpp22
1 files changed, 15 insertions, 7 deletions
diff --git a/clang/lib/Frontend/CompilerInstance.cpp b/clang/lib/Frontend/CompilerInstance.cpp
index c11c857..6098e2e3 100644
--- a/clang/lib/Frontend/CompilerInstance.cpp
+++ b/clang/lib/Frontend/CompilerInstance.cpp
@@ -1406,7 +1406,7 @@ static bool readASTAfterCompileModule(CompilerInstance &ImportingInstance,
SourceLocation ImportLoc,
SourceLocation ModuleNameLoc,
Module *Module, StringRef ModuleFileName,
- bool *OutOfDate) {
+ bool *OutOfDate, bool *Missing) {
DiagnosticsEngine &Diags = ImportingInstance.getDiagnostics();
unsigned ModuleLoadCapabilities = ASTReader::ARR_Missing;
@@ -1427,6 +1427,12 @@ static bool readASTAfterCompileModule(CompilerInstance &ImportingInstance,
return false;
}
+ // The caller wants to handle missing module files.
+ if (Missing && ReadResult == ASTReader::Missing) {
+ *Missing = true;
+ return false;
+ }
+
// The ASTReader didn't diagnose the error, so conservatively report it.
if (ReadResult == ASTReader::Missing || !Diags.hasErrorOccurred())
Diags.Report(ModuleNameLoc, diag::err_module_not_built)
@@ -1452,7 +1458,7 @@ static bool compileModuleAndReadASTImpl(CompilerInstance &ImportingInstance,
return readASTAfterCompileModule(ImportingInstance, ImportLoc, ModuleNameLoc,
Module, ModuleFileName,
- /*OutOfDate=*/nullptr);
+ /*OutOfDate=*/nullptr, /*Missing=*/nullptr);
}
/// Compile a module in a separate compiler instance and read the AST,
@@ -1517,15 +1523,17 @@ static bool compileModuleAndReadASTBehindLock(
// Read the module that was just written by someone else.
bool OutOfDate = false;
+ bool Missing = false;
if (readASTAfterCompileModule(ImportingInstance, ImportLoc, ModuleNameLoc,
- Module, ModuleFileName, &OutOfDate))
+ Module, ModuleFileName, &OutOfDate, &Missing))
return true;
- if (!OutOfDate)
+ if (!OutOfDate && !Missing)
return false;
- // The module may be out of date in the presence of file system races,
- // or if one of its imports depends on header search paths that are not
- // consistent with this ImportingInstance. Try again...
+ // The module may be missing or out of date in the presence of file system
+ // races. It may also be out of date if one of its imports depends on header
+ // search paths that are not consistent with this ImportingInstance.
+ // Try again...
}
}