diff --git a/clang/lib/Tooling/DependencyScanning/DependencyScanningWorker.cpp b/clang/lib/Tooling/DependencyScanning/DependencyScanningWorker.cpp --- a/clang/lib/Tooling/DependencyScanning/DependencyScanningWorker.cpp +++ b/clang/lib/Tooling/DependencyScanning/DependencyScanningWorker.cpp @@ -7,6 +7,7 @@ //===----------------------------------------------------------------------===// #include "clang/Tooling/DependencyScanning/DependencyScanningWorker.h" +#include "clang/Basic/FileManager.h" #include "clang/CodeGen/ObjectFilePCHContainerOperations.h" #include "clang/Frontend/CompilerInstance.h" #include "clang/Frontend/CompilerInvocation.h" @@ -197,10 +198,14 @@ for (const auto &F : ScanInstance.getHeaderSearchOpts().VFSOverlayFiles) DepFS->disableMinimization(F); - // Support for virtual file system overlays on top of the caching - // filesystem. - FileMgr->setVirtualFileSystem(createVFSFromCompilerInvocation( - ScanInstance.getInvocation(), ScanInstance.getDiagnostics(), DepFS)); + // DepFS already provides caching, so we don't need to reuse FileManager. + // The provided FileManger is abandoned for possibly invalid caches caused + // by the change of VFS. + auto VFS = createVFSFromCompilerInvocation( + ScanInstance.getInvocation(), ScanInstance.getDiagnostics(), DepFS); + FileMgr = new FileManager(FileMgr->getFileSystemOpts(), VFS); + ScanInstance.setFileManager(FileMgr); + ScanInstance.createSourceManager(*FileMgr); // Pass the skip mappings which should speed up excluded conditional block // skipping in the preprocessor.