Skip to content

Commit 7cc4fe9

Browse files
[Modules] textual headers in submodules never resolve their uses (llvm#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.
1 parent 7fbe3cf commit 7cc4fe9

File tree

2 files changed

+38
-6
lines changed

2 files changed

+38
-6
lines changed

clang/lib/Lex/ModuleMap.cpp

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1415,16 +1415,17 @@ bool ModuleMap::resolveExports(Module *Mod, bool Complain) {
14151415
}
14161416

14171417
bool ModuleMap::resolveUses(Module *Mod, bool Complain) {
1418-
auto Unresolved = std::move(Mod->UnresolvedDirectUses);
1419-
Mod->UnresolvedDirectUses.clear();
1418+
auto *Top = Mod->getTopLevelModule();
1419+
auto Unresolved = std::move(Top->UnresolvedDirectUses);
1420+
Top->UnresolvedDirectUses.clear();
14201421
for (auto &UDU : Unresolved) {
1421-
Module *DirectUse = resolveModuleId(UDU, Mod, Complain);
1422+
Module *DirectUse = resolveModuleId(UDU, Top, Complain);
14221423
if (DirectUse)
1423-
Mod->DirectUses.push_back(DirectUse);
1424+
Top->DirectUses.push_back(DirectUse);
14241425
else
1425-
Mod->UnresolvedDirectUses.push_back(UDU);
1426+
Top->UnresolvedDirectUses.push_back(UDU);
14261427
}
1427-
return !Mod->UnresolvedDirectUses.empty();
1428+
return !Top->UnresolvedDirectUses.empty();
14281429
}
14291430

14301431
bool ModuleMap::resolveConflicts(Module *Mod, bool Complain) {
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
// RUN: rm -rf %t
2+
// RUN: split-file %s %t
3+
// RUN: %clang_cc1 -fmodules-cache-path=%t -fmodules -fimplicit-module-maps -I %t %t/no-undeclared-includes.c -verify
4+
5+
//--- no-undeclared-includes.c
6+
// expected-no-diagnostics
7+
#include <assert.h>
8+
9+
//--- assert.h
10+
#include <base.h>
11+
12+
//--- base.h
13+
#ifndef base_h
14+
#define base_h
15+
16+
17+
18+
#endif /* base_h */
19+
20+
//--- module.modulemap
21+
module cstd [system] [no_undeclared_includes] {
22+
use base
23+
module assert {
24+
textual header "assert.h"
25+
}
26+
}
27+
28+
module base [system] {
29+
header "base.h"
30+
export *
31+
}

0 commit comments

Comments
 (0)