diff options
Diffstat (limited to 'clang/lib/Frontend/CompilerInstance.cpp')
-rw-r--r-- | clang/lib/Frontend/CompilerInstance.cpp | 22 |
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... } } |