Skip to content

Commit 09ec000

Browse files
[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.
1 parent 34a3fb9 commit 09ec000

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
@@ -1398,16 +1398,17 @@ bool ModuleMap::resolveExports(Module *Mod, bool Complain) {
13981398
}
13991399

14001400
bool ModuleMap::resolveUses(Module *Mod, bool Complain) {
1401-
auto Unresolved = std::move(Mod->UnresolvedDirectUses);
1402-
Mod->UnresolvedDirectUses.clear();
1401+
auto *Top = Mod->getTopLevelModule();
1402+
auto Unresolved = std::move(Top->UnresolvedDirectUses);
1403+
Top->UnresolvedDirectUses.clear();
14031404
for (auto &UDU : Unresolved) {
1404-
Module *DirectUse = resolveModuleId(UDU, Mod, Complain);
1405+
Module *DirectUse = resolveModuleId(UDU, Top, Complain);
14051406
if (DirectUse)
1406-
Mod->DirectUses.push_back(DirectUse);
1407+
Top->DirectUses.push_back(DirectUse);
14071408
else
1408-
Mod->UnresolvedDirectUses.push_back(UDU);
1409+
Top->UnresolvedDirectUses.push_back(UDU);
14091410
}
1410-
return !Mod->UnresolvedDirectUses.empty();
1411+
return !Top->UnresolvedDirectUses.empty();
14111412
}
14121413

14131414
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)