diff --git a/clang/lib/Tooling/DependencyScanning/DependencyScanningTool.cpp b/clang/lib/Tooling/DependencyScanning/DependencyScanningTool.cpp --- a/clang/lib/Tooling/DependencyScanning/DependencyScanningTool.cpp +++ b/clang/lib/Tooling/DependencyScanning/DependencyScanningTool.cpp @@ -31,7 +31,10 @@ getAdditionalArgsWithoutModulePaths(); Args.insert(Args.end(), AdditionalArgs.begin(), AdditionalArgs.end()); - // TODO: Filter out implicit modules leftovers (e.g. "-fmodules-cache-path="). + // This argument is unused in explicit compiles. + llvm::erase_if(Args, [](const std::string &Arg) { + return Arg.find("-fmodules-cache-path=") == 0; + }); return Args; } diff --git a/clang/lib/Tooling/DependencyScanning/ModuleDepCollector.cpp b/clang/lib/Tooling/DependencyScanning/ModuleDepCollector.cpp --- a/clang/lib/Tooling/DependencyScanning/ModuleDepCollector.cpp +++ b/clang/lib/Tooling/DependencyScanning/ModuleDepCollector.cpp @@ -51,6 +51,7 @@ CI.getLangOpts()->ImplicitModules = false; CI.getHeaderSearchOpts().ImplicitModuleMaps = false; + CI.getHeaderSearchOpts().ModuleCachePath.clear(); // Report the prebuilt modules this module uses. for (const auto &PrebuiltModule : Deps.PrebuiltModuleDeps) diff --git a/clang/test/ClangScanDeps/modules-inferred-explicit-build.m b/clang/test/ClangScanDeps/modules-inferred-explicit-build.m --- a/clang/test/ClangScanDeps/modules-inferred-explicit-build.m +++ b/clang/test/ClangScanDeps/modules-inferred-explicit-build.m @@ -12,7 +12,7 @@ // RUN: %python %S/../../utils/module-deps-to-rsp.py %t.db --tu-index=0 > %t.tu.rsp // RUN: %clang @%t.inferred.cc1.rsp -pedantic -Werror // RUN: %clang @%t.system.cc1.rsp -pedantic -Werror -// RUN: %clang @%t.tu.rsp -pedantic -Werror -Wno-unused-command-line-argument +// RUN: %clang @%t.tu.rsp -pedantic -Werror #include #include diff --git a/clang/tools/clang-scan-deps/ClangScanDeps.cpp b/clang/tools/clang-scan-deps/ClangScanDeps.cpp --- a/clang/tools/clang-scan-deps/ClangScanDeps.cpp +++ b/clang/tools/clang-scan-deps/ClangScanDeps.cpp @@ -374,11 +374,11 @@ const ModuleDeps &MD = MDIt->second; StringRef Filename = llvm::sys::path::filename(MD.ImplicitModulePCMPath); + StringRef ModuleCachePath = llvm::sys::path::parent_path( + llvm::sys::path::parent_path(MD.ImplicitModulePCMPath)); - SmallString<256> ExplicitPCMPath( - !ModuleFilesDir.empty() - ? ModuleFilesDir - : MD.BuildInvocation.getHeaderSearchOpts().ModuleCachePath); + SmallString<256> ExplicitPCMPath(!ModuleFilesDir.empty() ? ModuleFilesDir + : ModuleCachePath); llvm::sys::path::append(ExplicitPCMPath, MD.ID.ContextHash, Filename); return std::string(ExplicitPCMPath); }