https://github.com/ian-twilightcoder updated https://github.com/llvm/llvm-project/pull/69651
>From 7b88bf3102240d1734feab8919a049f8a92ca0e0 Mon Sep 17 00:00:00 2001 From: Ian Anderson <i...@apple.com> Date: Thu, 19 Oct 2023 15:22:11 -0700 Subject: [PATCH] [Modules] textual headers in submodules never resolve their `use`s 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. --- clang/lib/Lex/ModuleMap.cpp | 13 +++++---- clang/test/Modules/no-undeclared-includes.c | 31 +++++++++++++++++++++ 2 files changed, 38 insertions(+), 6 deletions(-) create mode 100644 clang/test/Modules/no-undeclared-includes.c diff --git a/clang/lib/Lex/ModuleMap.cpp b/clang/lib/Lex/ModuleMap.cpp index f65a5f145c04395..259c97796ae19f2 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) { diff --git a/clang/test/Modules/no-undeclared-includes.c b/clang/test/Modules/no-undeclared-includes.c new file mode 100644 index 000000000000000..83a654f6ed77539 --- /dev/null +++ b/clang/test/Modules/no-undeclared-includes.c @@ -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 * +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits