diff options
author | Ian Anderson <iana@apple.com> | 2023-10-20 13:23:34 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-10-20 13:23:34 -0700 |
commit | 09ec0004eee2d9929d25cf519956cc470ffb33dd (patch) | |
tree | 0a6a49c26a7c793d37841d722bcc439bfe326f6e /clang/lib/Lex/ModuleMap.cpp | |
parent | 34a3fb9f62f9334dd654eeee44c395439dae2fba (diff) | |
download | llvm-09ec0004eee2d9929d25cf519956cc470ffb33dd.zip llvm-09ec0004eee2d9929d25cf519956cc470ffb33dd.tar.gz llvm-09ec0004eee2d9929d25cf519956cc470ffb33dd.tar.bz2 |
[Modules] textual headers in submodules never resolve their `use`s (#69651)
When an include from a textual header is resolved, the textual header's
submodule is used as the requesting module. The submodule's uses are
resolved, but that doesn't work because only top level modules have
uses, and only the top level module uses are used for checking uses in
Module::directlyUses. ModuleMap::resolveUses to resolve the top level
module instead of the submodule.
Diffstat (limited to 'clang/lib/Lex/ModuleMap.cpp')
-rw-r--r-- | clang/lib/Lex/ModuleMap.cpp | 13 |
1 files changed, 7 insertions, 6 deletions
diff --git a/clang/lib/Lex/ModuleMap.cpp b/clang/lib/Lex/ModuleMap.cpp index 7fd92bf..eb7cab5 100644 --- a/clang/lib/Lex/ModuleMap.cpp +++ b/clang/lib/Lex/ModuleMap.cpp @@ -1398,16 +1398,17 @@ bool ModuleMap::resolveExports(Module *Mod, bool Complain) { } bool ModuleMap::resolveUses(Module *Mod, bool Complain) { - auto Unresolved = std::move(Mod->UnresolvedDirectUses); - Mod->UnresolvedDirectUses.clear(); + auto *Top = Mod->getTopLevelModule(); + auto Unresolved = std::move(Top->UnresolvedDirectUses); + Top->UnresolvedDirectUses.clear(); for (auto &UDU : Unresolved) { - Module *DirectUse = resolveModuleId(UDU, Mod, Complain); + Module *DirectUse = resolveModuleId(UDU, Top, Complain); if (DirectUse) - Mod->DirectUses.push_back(DirectUse); + Top->DirectUses.push_back(DirectUse); else - Mod->UnresolvedDirectUses.push_back(UDU); + Top->UnresolvedDirectUses.push_back(UDU); } - return !Mod->UnresolvedDirectUses.empty(); + return !Top->UnresolvedDirectUses.empty(); } bool ModuleMap::resolveConflicts(Module *Mod, bool Complain) { |