[Modules] textual headers in submodules never resolve their uses (#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.
This commit is contained in:
Ian Anderson 2023-10-20 13:23:34 -07:00 committed by GitHub
parent 34a3fb9f62
commit 09ec0004ee
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 38 additions and 6 deletions

View File

@ -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) {

View File

@ -0,0 +1,31 @@
// RUN: rm -rf %t
// RUN: split-file %s %t
// RUN: %clang_cc1 -fmodules-cache-path=%t -fmodules -fimplicit-module-maps -I %t %t/no-undeclared-includes.c -verify
//--- no-undeclared-includes.c
// expected-no-diagnostics
#include <assert.h>
//--- assert.h
#include <base.h>
//--- base.h
#ifndef base_h
#define base_h
#endif /* base_h */
//--- module.modulemap
module cstd [system] [no_undeclared_includes] {
use base
module assert {
textual header "assert.h"
}
}
module base [system] {
header "base.h"
export *
}