[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:
parent
34a3fb9f62
commit
09ec0004ee
@ -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) {
|
||||
|
||||
31
clang/test/Modules/no-undeclared-includes.c
Normal file
31
clang/test/Modules/no-undeclared-includes.c
Normal 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 *
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user