llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang Author: Qiongsi Wu (qiongsiwu) <details> <summary>Changes</summary> We would like to report, for a module, what modules it exports during dependency scanning. This PR implements this reporting by augmenting `ModuleDep`'s `ClangModuleDeps` variable. `ClangModuleDeps` now contains instances of `ExtendedModuleID`, which is made of a `ModuleID` and a `bool`, indicating if a particular dependence is exported. --- Patch is 47.07 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/137421.diff 37 Files Affected: - (modified) clang/include/clang/Tooling/DependencyScanning/ModuleDepCollector.h (+16-6) - (modified) clang/lib/Tooling/DependencyScanning/ModuleDepCollector.cpp (+36-27) - (modified) clang/test/ClangScanDeps/diagnostics.c (+1) - (added) clang/test/ClangScanDeps/export.c (+164) - (modified) clang/test/ClangScanDeps/header-search-pruning-transitive.c (+4) - (modified) clang/test/ClangScanDeps/header-search-pruning.cpp (+3) - (modified) clang/test/ClangScanDeps/link-libraries.c (+4) - (modified) clang/test/ClangScanDeps/modules-canononical-module-map-case.c (+1) - (modified) clang/test/ClangScanDeps/modules-context-hash.c (+2) - (modified) clang/test/ClangScanDeps/modules-dep-args.c (+2) - (modified) clang/test/ClangScanDeps/modules-excluded-header.m (+1) - (modified) clang/test/ClangScanDeps/modules-extern-submodule.c (+3) - (modified) clang/test/ClangScanDeps/modules-extern-unrelated.m (+4) - (modified) clang/test/ClangScanDeps/modules-file-path-isolation.c (+1) - (modified) clang/test/ClangScanDeps/modules-fmodule-name-no-module-built.m (+1) - (modified) clang/test/ClangScanDeps/modules-full-by-mod-name.c (+3) - (modified) clang/test/ClangScanDeps/modules-full.cpp (+3) - (modified) clang/test/ClangScanDeps/modules-implementation-private.m (+1) - (modified) clang/test/ClangScanDeps/modules-implicit-dot-private.m (+2) - (modified) clang/test/ClangScanDeps/modules-incomplete-umbrella.c (+5) - (modified) clang/test/ClangScanDeps/modules-inferred.m (+1) - (modified) clang/test/ClangScanDeps/modules-no-undeclared-includes.c (+1) - (modified) clang/test/ClangScanDeps/modules-pch-common-submodule.c (+2) - (modified) clang/test/ClangScanDeps/modules-pch-common-via-submodule.c (+2) - (modified) clang/test/ClangScanDeps/modules-pch.c (+5) - (modified) clang/test/ClangScanDeps/modules-priv-fw-from-pub.m (+3) - (modified) clang/test/ClangScanDeps/modules-redefinition.m (+1) - (modified) clang/test/ClangScanDeps/modules-symlink-dir-vfs.c (+1) - (modified) clang/test/ClangScanDeps/modules-transitive.c (+1) - (modified) clang/test/ClangScanDeps/optimize-canonicalize-macros.m (+2) - (modified) clang/test/ClangScanDeps/optimize-fmodulemap.m (+2) - (modified) clang/test/ClangScanDeps/optimize-system-warnings.m (+3) - (modified) clang/test/ClangScanDeps/optimize-vfs-leak.m (+3) - (modified) clang/test/ClangScanDeps/optimize-vfs.m (+3) - (modified) clang/test/ClangScanDeps/removed-args.c (+2) - (modified) clang/test/ClangScanDeps/working-dir.m (+4) - (modified) clang/tools/clang-scan-deps/ClangScanDeps.cpp (+30-7) ``````````diff diff --git a/clang/include/clang/Tooling/DependencyScanning/ModuleDepCollector.h b/clang/include/clang/Tooling/DependencyScanning/ModuleDepCollector.h index d2d0d56e5212c..24de3d843fc20 100644 --- a/clang/include/clang/Tooling/DependencyScanning/ModuleDepCollector.h +++ b/clang/include/clang/Tooling/DependencyScanning/ModuleDepCollector.h @@ -115,6 +115,15 @@ struct ModuleID { } }; +struct ExtendedModuleID { + ModuleID ID; + bool Exported; + + bool operator<(const ExtendedModuleID &Other) const { + return std::tie(ID, Exported) < std::tie(Other.ID, Other.Exported); + } +}; + /// P1689ModuleInfo - Represents the needed information of standard C++20 /// modules for P1689 format. struct P1689ModuleInfo { @@ -183,7 +192,7 @@ struct ModuleDeps { /// /// This may include modules with a different context hash when it can be /// determined that the differences are benign for this compilation. - std::vector<ModuleID> ClangModuleDeps; + std::vector<ExtendedModuleID> ClangModuleDeps; /// The set of libraries or frameworks to link against when /// an entity from this module is used. @@ -270,7 +279,8 @@ class ModuleDepCollectorPP final : public PPCallbacks { llvm::DenseSet<const Module *> &AddedModules); /// Add discovered module dependency for the given module. - void addOneModuleDep(const Module *M, const ModuleID ID, ModuleDeps &MD); + void addOneModuleDep(const Module *M, bool Exported, const ModuleID ID, + ModuleDeps &MD); }; /// Collects modular and non-modular dependencies of the main file by attaching @@ -352,16 +362,16 @@ class ModuleDepCollector final : public DependencyCollector { /// Collect module map files for given modules. llvm::DenseSet<const FileEntry *> - collectModuleMapFiles(ArrayRef<ModuleID> ClangModuleDeps) const; + collectModuleMapFiles(ArrayRef<ExtendedModuleID> ClangModuleDeps) const; /// Add module map files to the invocation, if needed. void addModuleMapFiles(CompilerInvocation &CI, - ArrayRef<ModuleID> ClangModuleDeps) const; + ArrayRef<ExtendedModuleID> ClangModuleDeps) const; /// Add module files (pcm) to the invocation, if needed. void addModuleFiles(CompilerInvocation &CI, - ArrayRef<ModuleID> ClangModuleDeps) const; + ArrayRef<ExtendedModuleID> ClangModuleDeps) const; void addModuleFiles(CowCompilerInvocation &CI, - ArrayRef<ModuleID> ClangModuleDeps) const; + ArrayRef<ExtendedModuleID> ClangModuleDeps) const; /// Add paths that require looking up outputs to the given dependencies. void addOutputPaths(CowCompilerInvocation &CI, ModuleDeps &Deps); diff --git a/clang/lib/Tooling/DependencyScanning/ModuleDepCollector.cpp b/clang/lib/Tooling/DependencyScanning/ModuleDepCollector.cpp index 07856dbdba4b4..721fed038a83e 100644 --- a/clang/lib/Tooling/DependencyScanning/ModuleDepCollector.cpp +++ b/clang/lib/Tooling/DependencyScanning/ModuleDepCollector.cpp @@ -389,10 +389,10 @@ ModuleDepCollector::getInvocationAdjustedForModuleBuildWithoutOutputs( } llvm::DenseSet<const FileEntry *> ModuleDepCollector::collectModuleMapFiles( - ArrayRef<ModuleID> ClangModuleDeps) const { + ArrayRef<ExtendedModuleID> ClangModuleDeps) const { llvm::DenseSet<const FileEntry *> ModuleMapFiles; - for (const ModuleID &MID : ClangModuleDeps) { - ModuleDeps *MD = ModuleDepsByID.lookup(MID); + for (const auto &MID : ClangModuleDeps) { + ModuleDeps *MD = ModuleDepsByID.lookup(MID.ID); assert(MD && "Inconsistent dependency info"); // TODO: Track ClangModuleMapFile as `FileEntryRef`. auto FE = ScanInstance.getFileManager().getOptionalFileRef( @@ -404,21 +404,21 @@ llvm::DenseSet<const FileEntry *> ModuleDepCollector::collectModuleMapFiles( } void ModuleDepCollector::addModuleMapFiles( - CompilerInvocation &CI, ArrayRef<ModuleID> ClangModuleDeps) const { + CompilerInvocation &CI, ArrayRef<ExtendedModuleID> ClangModuleDeps) const { if (Service.shouldEagerLoadModules()) return; // Only pcm is needed for eager load. - for (const ModuleID &MID : ClangModuleDeps) { - ModuleDeps *MD = ModuleDepsByID.lookup(MID); + for (const auto &MID : ClangModuleDeps) { + ModuleDeps *MD = ModuleDepsByID.lookup(MID.ID); assert(MD && "Inconsistent dependency info"); CI.getFrontendOpts().ModuleMapFiles.push_back(MD->ClangModuleMapFile); } } void ModuleDepCollector::addModuleFiles( - CompilerInvocation &CI, ArrayRef<ModuleID> ClangModuleDeps) const { - for (const ModuleID &MID : ClangModuleDeps) { - ModuleDeps *MD = ModuleDepsByID.lookup(MID); + CompilerInvocation &CI, ArrayRef<ExtendedModuleID> ClangModuleDeps) const { + for (const auto &MID : ClangModuleDeps) { + ModuleDeps *MD = ModuleDepsByID.lookup(MID.ID); std::string PCMPath = Controller.lookupModuleOutput(*MD, ModuleOutputKind::ModuleFile); @@ -426,14 +426,15 @@ void ModuleDepCollector::addModuleFiles( CI.getFrontendOpts().ModuleFiles.push_back(std::move(PCMPath)); else CI.getHeaderSearchOpts().PrebuiltModuleFiles.insert( - {MID.ModuleName, std::move(PCMPath)}); + {MID.ID.ModuleName, std::move(PCMPath)}); } } void ModuleDepCollector::addModuleFiles( - CowCompilerInvocation &CI, ArrayRef<ModuleID> ClangModuleDeps) const { - for (const ModuleID &MID : ClangModuleDeps) { - ModuleDeps *MD = ModuleDepsByID.lookup(MID); + CowCompilerInvocation &CI, + ArrayRef<ExtendedModuleID> ClangModuleDeps) const { + for (const auto &MID : ClangModuleDeps) { + ModuleDeps *MD = ModuleDepsByID.lookup(MID.ID); std::string PCMPath = Controller.lookupModuleOutput(*MD, ModuleOutputKind::ModuleFile); @@ -441,7 +442,7 @@ void ModuleDepCollector::addModuleFiles( CI.getMutFrontendOpts().ModuleFiles.push_back(std::move(PCMPath)); else CI.getMutHeaderSearchOpts().PrebuiltModuleFiles.insert( - {MID.ModuleName, std::move(PCMPath)}); + {MID.ID.ModuleName, std::move(PCMPath)}); } } @@ -471,10 +472,10 @@ void ModuleDepCollector::applyDiscoveredDependencies(CompilerInvocation &CI) { CI.getFrontendOpts().ModuleMapFiles.emplace_back( CurrentModuleMap->getNameAsRequested()); - SmallVector<ModuleID> DirectDeps; + SmallVector<ExtendedModuleID> DirectDeps; for (const auto &KV : ModularDeps) if (DirectModularDeps.contains(KV.first)) - DirectDeps.push_back(KV.second->ID); + DirectDeps.push_back({KV.second->ID, /* Exported = */ false}); // TODO: Report module maps the same way it's done for modular dependencies. addModuleMapFiles(CI, DirectDeps); @@ -598,9 +599,9 @@ static std::string getModuleContextHash(const ModuleDeps &MD, // example, case-insensitive paths to modulemap files. Usually such a case // would indicate a missed optimization to canonicalize, but it may be // difficult to canonicalize all cases when there is a VFS. - for (const auto &ID : MD.ClangModuleDeps) { - HashBuilder.add(ID.ModuleName); - HashBuilder.add(ID.ContextHash); + for (const auto &EMID : MD.ClangModuleDeps) { + HashBuilder.add(EMID.ID.ModuleName); + HashBuilder.add(EMID.ID.ContextHash); } HashBuilder.add(EagerLoadModules); @@ -924,9 +925,10 @@ void ModuleDepCollectorPP::addAllSubmoduleDeps( }); } -void ModuleDepCollectorPP::addOneModuleDep(const Module *M, const ModuleID ID, - ModuleDeps &MD) { - MD.ClangModuleDeps.push_back(ID); +void ModuleDepCollectorPP::addOneModuleDep(const Module *M, bool Exported, + const ModuleID ID, ModuleDeps &MD) { + MD.ClangModuleDeps.push_back({ID, Exported}); + if (MD.IsInStableDirectories) MD.IsInStableDirectories = MDC.ModularDeps[M]->IsInStableDirectories; } @@ -934,12 +936,19 @@ void ModuleDepCollectorPP::addOneModuleDep(const Module *M, const ModuleID ID, void ModuleDepCollectorPP::addModuleDep( const Module *M, ModuleDeps &MD, llvm::DenseSet<const Module *> &AddedModules) { + SmallVector<Module *> ExportedModulesVector; + M->getExportedModules(ExportedModulesVector); + llvm::DenseSet<const Module *> ExportedModulesSet( + ExportedModulesVector.begin(), ExportedModulesVector.end()); for (const Module *Import : M->Imports) { - if (Import->getTopLevelModule() != M->getTopLevelModule() && + const Module *ImportedTopLevelModule = Import->getTopLevelModule(); + if (ImportedTopLevelModule != M->getTopLevelModule() && !MDC.isPrebuiltModule(Import)) { - if (auto ImportID = handleTopLevelModule(Import->getTopLevelModule())) - if (AddedModules.insert(Import->getTopLevelModule()).second) - addOneModuleDep(Import->getTopLevelModule(), *ImportID, MD); + if (auto ImportID = handleTopLevelModule(ImportedTopLevelModule)) + if (AddedModules.insert(ImportedTopLevelModule).second) { + bool Exported = ExportedModulesSet.contains(ImportedTopLevelModule); + addOneModuleDep(ImportedTopLevelModule, Exported, *ImportID, MD); + } } } } @@ -963,7 +972,7 @@ void ModuleDepCollectorPP::addAffectingClangModule( !MDC.isPrebuiltModule(Affecting)) { if (auto ImportID = handleTopLevelModule(Affecting)) if (AddedModules.insert(Affecting).second) - addOneModuleDep(Affecting, *ImportID, MD); + addOneModuleDep(Affecting, /* Exported = */ false, *ImportID, MD); } } } diff --git a/clang/test/ClangScanDeps/diagnostics.c b/clang/test/ClangScanDeps/diagnostics.c index 8e3cf4c9f9fa6..9bd3ce7cfb0dd 100644 --- a/clang/test/ClangScanDeps/diagnostics.c +++ b/clang/test/ClangScanDeps/diagnostics.c @@ -38,6 +38,7 @@ module mod { header "mod.h" } // CHECK-NEXT: "[[PREFIX]]/mod.h" // CHECK-NEXT: ], // CHECK-NEXT: "link-libraries": [], +// CHECK-NEXT: "clang-modules-exported": [], // CHECK-NEXT: "name": "mod" // CHECK-NEXT: } // CHECK-NEXT: ], diff --git a/clang/test/ClangScanDeps/export.c b/clang/test/ClangScanDeps/export.c new file mode 100644 index 0000000000000..a926f61d659cb --- /dev/null +++ b/clang/test/ClangScanDeps/export.c @@ -0,0 +1,164 @@ +// Test correctly reporting what a module exports during dependency scanning. +// Module A depends on modules B, C and D, but only exports B and C. +// Module E depends on modules B, C and D, and exports all of them. + +// RUN: rm -rf %t +// RUN: split-file %s %t +// RUN: sed -e "s|DIR|%/t|g" %t/cdb.json.template > %t/cdb.json +// RUN: clang-scan-deps -compilation-database \ +// RUN: %t/cdb.json -format experimental-full > %t/deps.db +// RUN: cat %t/deps.db | sed 's:\\\\\?:/:g' | FileCheck %s + +//--- cdb.json.template +[ + { + "directory": "DIR", + "command": "clang -c DIR/test.c -I DIR/AH -I DIR/BH -I DIR/CH -I DIR/DH -I DIR/EH -fmodules -fmodules-cache-path=DIR/cache", + "file": "DIR/test.c" + }, +] + +//--- AH/A.h +#include "B.h" +#include "C.h" +#include "D.h" + +int funcA(); + +//--- AH/module.modulemap +module A { + header "A.h" + + export B + export C +} + +//--- BH/B.h +//--- BH/module.modulemap +module B { + header "B.h" +} + +//--- CH/C.h +//--- CH/module.modulemap +module C { + header "C.h" +} + +//--- DH/D.h +//--- DH/module.modulemap +module D { + header "D.h" +} + +//--- EH/E.h +#include "B.h" +#include "C.h" +#include "D.h" + +//--- EH/module.modulemap +module E { + header "E.h" + export * +} + +//--- test.c +#include "A.h" +#include "E.h" + +int test1() { + return funcA(); +} + +// CHECK: { +// CHECK-NEXT: "modules": [ +// CHECK-NEXT: { +// CHECK-NEXT: "clang-module-deps": [ +// CHECK-NEXT: { +// CHECK-NEXT: "context-hash": "[[HASH_MOD_B:.*]]", +// CHECK-NEXT: "module-name": "B" +// CHECK-NEXT: }, +// CHECK-NEXT: { +// CHECK-NEXT: "context-hash": "[[HASH_MOD_C:.*]]", +// CHECK-NEXT: "module-name": "C" +// CHECK-NEXT: }, +// CHECK-NEXT: { +// CHECK-NEXT: "context-hash": "[[HASH_MOD_D:.*]]", +// CHECK-NEXT: "module-name": "D" +// CHECK-NEXT: } +// CHECK-NEXT: ], +// CHECK-NEXT: "clang-modulemap-file":{{.*}}, +// CHECK-NEXT: "command-line": [ +// CHECK: ], +// CHECK-NEXT: "context-hash":{{.*}} +// CHECK-NEXT: "file-deps": [ +// CHECK: ], +// CHECK-NEXT: "link-libraries": [], +// CHECK-NEXT: "clang-modules-exported": [ +// CHECK-NEXT: { +// CHECK-NEXT: "context-hash": "[[HASH_MOD_B]]", +// CHECK-NEXT: "module-name": "B" +// CHECK-NEXT: }, +// CHECK-NEXT: { +// CHECK-NEXT: "context-hash": "[[HASH_MOD_C]]", +// CHECK-NEXT: "module-name": "C" +// CHECK-NEXT: } +// CHECK-NOT: { +// CHECK-NOT: "context-hash": "[[HASH_MOD_D]]", +// CHECK-NOT: "module-name": "D" +// CHECK-NOT: } +// CHECK-NEXT: ], +// CHECK-NEXT: "name": "A" +// CHECK-NEXT: } +// CHECK: { +// CHECK: "name": "B" +// CHECK: } +// CHECK: { +// CHECK: "name": "C" +// CHECK: } +// CHECK: { +// CHECK: "name": "D" +// CHECK: } +// CHECK: { +// CHECK-NEXT: "clang-module-deps": [ +// CHECK-NEXT: { +// CHECK-NEXT: "context-hash": "[[HASH_MOD_B]]", +// CHECK-NEXT: "module-name": "B" +// CHECK-NEXT: }, +// CHECK-NEXT: { +// CHECK-NEXT: "context-hash": "[[HASH_MOD_C]]", +// CHECK-NEXT: "module-name": "C" +// CHECK-NEXT: }, +// CHECK-NEXT: { +// CHECK-NEXT: "context-hash": "[[HASH_MOD_D]]", +// CHECK-NEXT: "module-name": "D" +// CHECK-NEXT: } +// CHECK-NEXT: ], +// CHECK-NEXT: "clang-modulemap-file":{{.*}}, +// CHECK-NEXT: "command-line": [ +// CHECK: ], +// CHECK-NEXT: "context-hash":{{.*}} +// CHECK-NEXT: "file-deps": [ +// CHECK: ], +// CHECK-NEXT: "link-libraries": [], +// CHECK-NEXT: "clang-modules-exported": [ +// CHECK-NEXT: { +// CHECK-NEXT: "context-hash": "[[HASH_MOD_B]]", +// CHECK-NEXT: "module-name": "B" +// CHECK-NEXT: }, +// CHECK-NEXT: { +// CHECK-NEXT: "context-hash": "[[HASH_MOD_C]]", +// CHECK-NEXT: "module-name": "C" +// CHECK-NEXT: } +// CHECK-NEXT: { +// CHECK-NEXT: "context-hash": "[[HASH_MOD_D]]", +// CHECK-NEXT: "module-name": "D" +// CHECK-NEXT: } +// CHECK-NEXT: ], +// CHECK-NEXT: "name": "E" +// CHECK-NEXT: } +// CHECK: ] +// CHECK: } + + + diff --git a/clang/test/ClangScanDeps/header-search-pruning-transitive.c b/clang/test/ClangScanDeps/header-search-pruning-transitive.c index 1e829bb02ddc4..ad56c55edc845 100644 --- a/clang/test/ClangScanDeps/header-search-pruning-transitive.c +++ b/clang/test/ClangScanDeps/header-search-pruning-transitive.c @@ -76,6 +76,7 @@ module X { header "X.h" } // CHECK-NEXT: "[[PREFIX]]/X.h" // CHECK-NEXT: ], // CHECK-NEXT: "link-libraries": [], +// CHECK-NEXT: "clang-modules-exported": [], // CHECK-NEXT: "name": "X" // CHECK-NEXT: }, // CHECK-NEXT: { @@ -92,6 +93,7 @@ module X { header "X.h" } // CHECK-NEXT: "[[PREFIX]]/end/end.h" // CHECK-NEXT: ], // CHECK-NEXT: "link-libraries": [], +// CHECK-NEXT: "clang-modules-exported": [], // CHECK-NEXT: "name": "Y" // CHECK-NEXT: } // CHECK-NEXT: ], @@ -132,6 +134,7 @@ module X { header "X.h" } // CHECK-NEXT: "[[PREFIX]]/X.h" // CHECK-NEXT: ], // CHECK-NEXT: "link-libraries": [], +// CHECK-NEXT: "clang-modules-exported": [], // CHECK-NEXT: "name": "X" // CHECK-NEXT: }, // CHECK-NEXT: { @@ -147,6 +150,7 @@ module X { header "X.h" } // CHECK-NEXT: "[[PREFIX]]/end/end.h" // CHECK-NEXT: ], // CHECK-NEXT: "link-libraries": [], +// CHECK-NEXT: "clang-modules-exported": [], // CHECK-NEXT: "name": "Y" // CHECK-NEXT: } // CHECK-NEXT: ], diff --git a/clang/test/ClangScanDeps/header-search-pruning.cpp b/clang/test/ClangScanDeps/header-search-pruning.cpp index 6291698002751..c0083d2bc8a1e 100644 --- a/clang/test/ClangScanDeps/header-search-pruning.cpp +++ b/clang/test/ClangScanDeps/header-search-pruning.cpp @@ -34,6 +34,7 @@ // CHECK_A-NEXT: "file-deps": [ // CHECK_A: ], // CHECK_A-NEXT: "link-libraries": [], +// CHECK_A-NEXT: "clang-modules-exported": [], // CHECK_A-NEXT: "name": "mod" // CHECK_A-NEXT: } // CHECK_A-NEXT: ] @@ -57,6 +58,7 @@ // CHECK_B-NEXT: "file-deps": [ // CHECK_B: ], // CHECK_B-NEXT: "link-libraries": [], +// CHECK_B-NEXT: "clang-modules-exported": [], // CHECK_B-NEXT: "name": "mod" // CHECK_B-NEXT: } // CHECK_B-NEXT: ] @@ -82,6 +84,7 @@ // CHECK_AB-NEXT: "file-deps": [ // CHECK_AB: ], // CHECK_AB-NEXT: "link-libraries": [], +// CHECK_AB-NEXT: "clang-modules-exported": [], // CHECK_AB-NEXT: "name": "mod" // CHECK_AB-NEXT: } // CHECK_AB-NEXT: ] diff --git a/clang/test/ClangScanDeps/link-libraries.c b/clang/test/ClangScanDeps/link-libraries.c index cc2e223102024..ab548058b788a 100644 --- a/clang/test/ClangScanDeps/link-libraries.c +++ b/clang/test/ClangScanDeps/link-libraries.c @@ -53,6 +53,7 @@ module transitive { // CHECK-NEXT: "link-name": "Framework" // CHECK-NEXT: } // CHECK-NEXT: ], +// CHECK-NEXT: "clang-modules-exported": [], // CHECK-NEXT: "name": "Framework" // CHECK-NEXT: }, // CHECK-NEXT: { @@ -71,6 +72,7 @@ module transitive { // CHECK-NEXT: "[[PREFIX]]/direct.h" // CHECK-NEXT: ], // CHECK-NEXT: "link-libraries": [], +// CHECK-NEXT: "clang-modules-exported": [], // CHECK-NEXT: "name": "direct" // CHECK-NEXT: }, // CHECK-NEXT: { @@ -95,6 +97,7 @@ module transitive { // CHECK-NEXT: "[[PREFIX]]/Inputs/frameworks/module.modulemap" // CHECK-NEXT: ], // CHECK-NEXT: "link-libraries": [], +// CHECK-NEXT: "clang-modules-exported": [], // CHECK-NEXT: "name": "root" // CHECK-NEXT: }, // CHECK-NEXT: { @@ -113,6 +116,7 @@ module transitive { // CHECK-NEXT: "link-name": "libTransitive" // CHECK-NEXT: } // CHECK-NEXT: ], +// CHECK-NEXT: "clang-modules-exported": [], // CHECK-NEXT: "name": "transitive" // CHECK-NEXT: } // CHECK-NEXT: ], diff --git a/clang/test/ClangScanDeps/modules-canononical-module-map-case.c b/clang/test/ClangScanDeps/modules-canononical-module-map-case.c index ccb0653dfc5ec..f84dd1335aed2 100644 --- a/clang/test/ClangScanDeps/modules-canononical-module-map-case.c +++ b/clang/test/ClangScanDeps/modules-canononical-module-map-case.c @@ -71,6 +71,7 @@ framework module FW { // CHECK-NEXT: "link-name": "FW" // CHECK-NEXT: } // CHECK-NEXT: ], +// CHECK-NEXT: "clang-modules-exported": [], // CHECK-NEXT: "name": "FW" // CHECK-NEXT: } // CHECK-NEXT: ] diff --git a/clang/test/ClangScanDeps/modules-context-hash.c b/clang/test/ClangScanDeps/modules-context-hash.c index 9489563576d3b..8ca1b8ce68c49 100644 --- a/clang/test/ClangScanDeps/modules-context-hash.c +++ b/clang/test/ClangScanDeps/modules-context-hash.c @@ -39,6 +39,7 @@ // CHECK-NEXT: "[[PREFIX]]/a/dep.h" // CHECK-NEXT: ], // CHECK-NEXT: "link-libraries": [], +// CHECK-NEXT: "clang-modules-exported": [], // CHECK-NEXT: "name": "mod" // CHECK-NEXT: } // CHECK-NEXT: ], @@ -77,6 +78,7 @@ // CHECK-NEXT: "[[PREFIX]]/b/dep.h" // CHECK-NEXT: ], // CHECK-NEXT: "link-libraries": [], +// C... [truncated] `````````` </details> https://github.com/llvm/llvm-project/pull/137421 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits