Index: include/clang/Frontend/PrecompiledPreamble.h =================================================================== --- include/clang/Frontend/PrecompiledPreamble.h +++ include/clang/Frontend/PrecompiledPreamble.h @@ -289,7 +289,6 @@ PreambleIsEmpty = 1, CouldntCreateTempFile, CouldntCreateTargetInfo, - CouldntCreateVFSOverlay, BeginSourceFileFailed, CouldntEmitPCH }; Index: lib/Frontend/ASTUnit.cpp =================================================================== --- lib/Frontend/ASTUnit.cpp +++ lib/Frontend/ASTUnit.cpp @@ -1307,7 +1307,6 @@ case BuildPreambleError::CouldntCreateTargetInfo: case BuildPreambleError::BeginSourceFileFailed: case BuildPreambleError::CouldntEmitPCH: - case BuildPreambleError::CouldntCreateVFSOverlay: // These erros are more likely to repeat, retry after some period. PreambleRebuildCounter = DefaultPreambleRebuildInterval; return nullptr; @@ -1409,8 +1408,6 @@ ConfigureDiags(Diags, *AST, CaptureDiagnostics); IntrusiveRefCntPtr VFS = createVFSFromCompilerInvocation(*CI, *Diags); - if (!VFS) - return nullptr; AST->Diagnostics = Diags; AST->FileSystemOpts = CI->getFileSystemOpts(); AST->Invocation = std::move(CI); @@ -1689,14 +1686,14 @@ // Create the AST unit. std::unique_ptr AST; AST.reset(new ASTUnit(false)); + AST->NumStoredDiagnosticsFromDriver = StoredDiagnostics.size(); + AST->StoredDiagnostics.swap(StoredDiagnostics); ConfigureDiags(Diags, *AST, CaptureDiagnostics); AST->Diagnostics = Diags; AST->FileSystemOpts = CI->getFileSystemOpts(); if (!VFS) VFS = vfs::getRealFileSystem(); VFS = createVFSFromCompilerInvocation(*CI, *Diags, VFS); - if (!VFS) - return nullptr; AST->FileMgr = new FileManager(AST->FileSystemOpts, VFS); AST->PCMCache = new MemoryBufferCache; AST->OnlyLocalDecls = OnlyLocalDecls; @@ -1706,8 +1703,6 @@ AST->IncludeBriefCommentsInCodeCompletion = IncludeBriefCommentsInCodeCompletion; AST->UserFilesAreVolatile = UserFilesAreVolatile; - AST->NumStoredDiagnosticsFromDriver = StoredDiagnostics.size(); - AST->StoredDiagnostics.swap(StoredDiagnostics); AST->Invocation = CI; if (ForSerialization) AST->WriterData.reset(new ASTWriterData(*AST->PCMCache)); Index: lib/Frontend/CompilerInstance.cpp =================================================================== --- lib/Frontend/CompilerInstance.cpp +++ lib/Frontend/CompilerInstance.cpp @@ -302,11 +302,9 @@ FileManager *CompilerInstance::createFileManager() { if (!hasVirtualFileSystem()) { - if (IntrusiveRefCntPtr VFS = - createVFSFromCompilerInvocation(getInvocation(), getDiagnostics())) - setVirtualFileSystem(VFS); - else - return nullptr; + IntrusiveRefCntPtr VFS = + createVFSFromCompilerInvocation(getInvocation(), getDiagnostics()); + setVirtualFileSystem(VFS); } FileMgr = new FileManager(getFileSystemOpts(), VirtualFileSystem); return FileMgr.get(); Index: lib/Frontend/CompilerInvocation.cpp =================================================================== --- lib/Frontend/CompilerInvocation.cpp +++ lib/Frontend/CompilerInvocation.cpp @@ -3072,16 +3072,16 @@ BaseFS->getBufferForFile(File); if (!Buffer) { Diags.Report(diag::err_missing_vfs_overlay_file) << File; - return IntrusiveRefCntPtr(); + continue; } IntrusiveRefCntPtr FS = vfs::getVFSFromYAML( std::move(Buffer.get()), /*DiagHandler*/ nullptr, File); - if (!FS.get()) { + if (FS) { + Overlay->pushOverlay(FS); + } else { Diags.Report(diag::err_invalid_vfs_overlay) << File; - return IntrusiveRefCntPtr(); } - Overlay->pushOverlay(FS); } return Overlay; } Index: lib/Frontend/PrecompiledPreamble.cpp =================================================================== --- lib/Frontend/PrecompiledPreamble.cpp +++ lib/Frontend/PrecompiledPreamble.cpp @@ -303,8 +303,6 @@ VFS = createVFSFromCompilerInvocation(Clang->getInvocation(), Diagnostics, VFS); - if (!VFS) - return BuildPreambleError::CouldntCreateVFSOverlay; // Create a file manager object to provide access to and cache the filesystem. Clang->setFileManager(new FileManager(Clang->getFileSystemOpts(), VFS)); @@ -756,8 +754,6 @@ return "Could not create temporary file for PCH"; case BuildPreambleError::CouldntCreateTargetInfo: return "CreateTargetInfo() return null"; - case BuildPreambleError::CouldntCreateVFSOverlay: - return "Could not create VFS Overlay"; case BuildPreambleError::BeginSourceFileFailed: return "BeginSourceFile() return an error"; case BuildPreambleError::CouldntEmitPCH: Index: test/Index/missing_vfs.c =================================================================== --- /dev/null +++ test/Index/missing_vfs.c @@ -0,0 +1,6 @@ +// RUN: c-index-test -test-load-source local %s -ivfsoverlay %t/does-not-exist.yaml &> %t.out +// RUN: FileCheck -check-prefix=STDERR %s < %t.out +// STDERR: fatal error: virtual filesystem overlay file '{{.*}}' not found +// RUN: FileCheck %s < %t.out +// CHECK: missing_vfs.c:[[@LINE+1]]:6: FunctionDecl=foo:[[@LINE+1]]:6 +void foo(void); Index: test/VFS/Inputs/MissingVFS/a.h =================================================================== --- /dev/null +++ test/VFS/Inputs/MissingVFS/a.h @@ -0,0 +1 @@ +// void funcA(void); Index: test/VFS/Inputs/MissingVFS/module.modulemap =================================================================== --- /dev/null +++ test/VFS/Inputs/MissingVFS/module.modulemap @@ -0,0 +1,3 @@ +module A { + header "a.h" +} Index: test/VFS/Inputs/MissingVFS/vfsoverlay.yaml =================================================================== --- /dev/null +++ test/VFS/Inputs/MissingVFS/vfsoverlay.yaml @@ -0,0 +1,13 @@ +{ + 'version': 0, + 'ignore-non-existent-contents': false, + 'roots': [ + { 'name': 'INPUT_DIR', 'type': 'directory', + 'contents': [ + { 'name': 'a.h', 'type': 'file', + 'external-contents': 'OUT_DIR/a.h' + } + ] + } + ] +} Index: test/VFS/module_missing_vfs.m =================================================================== --- /dev/null +++ test/VFS/module_missing_vfs.m @@ -0,0 +1,16 @@ +// REQUIRES: shell +// RUN: rm -rf %t && mkdir -p %t +// RUN: echo "void funcA(void);" >> %t/a.h + +// RUN: not %clang_cc1 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t/mcp -I %S/Inputs/MissingVFS %s -fsyntax-only -ivfsoverlay %t/vfs.yaml 2>&1 | FileCheck %s -check-prefix=ERROR +// ERROR: virtual filesystem overlay file '{{.*}}' not found +// RUN: find %t/mcp -name "A-*.pcm" | count 1 + +// RUN: sed -e "s:INPUT_DIR:%S/Inputs:g" -e "s:OUT_DIR:%t:g" %S/Inputs/MissingVFS/vfsoverlay.yaml > %t/vfs.yaml +// RUN: %clang_cc1 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t/mcp -I %S/Inputs/MissingVFS %s -fsyntax-only -ivfsoverlay %t/vfs.yaml +// RUN: find %t/mcp -name "A-*.pcm" | count 1 + +@import A; +void test(void) { + funcA(); +}