};
std::function<void(Visiting)> VisitModule = [&](Visiting V) {
- // Modules that aren't available cannot be made visible.
- if (!V.M->isAvailable())
- return;
-
// Nothing to do for a module that's already visible.
unsigned ID = V.M->getVisibilityID();
if (ImportLocs.size() <= ID)
// Make any exported modules visible.
SmallVector<Module *, 16> Exports;
V.M->getExportedModules(Exports);
- for (Module *E : Exports)
- VisitModule({E, &V});
+ for (Module *E : Exports) {
+ // Don't recurse to unavailable submodules.
+ if (E->isAvailable())
+ VisitModule({E, &V});
+ }
for (auto &C : V.M->Conflicts) {
if (isVisible(C.Other)) {
--- /dev/null
+// RUN: %clang_cc1 -fmodules -I%S/Inputs/unavailable-local-visibility -fmodule-name=X -emit-module -x c++-module-map %S/Inputs/unavailable-local-visibility/module.modulemap -o %t/x.pcm
+// RUN: %clang_cc1 -fmodules -I%S/Inputs/unavailable-local-visibility -fmodule-name=M -fmodule-map-file=%S/Inputs/unavailable-local-visibility/module.modulemap -fmodules-local-submodule-visibility -fmodule-file=%t/x.pcm -fsyntax-only -x c++-header %S/Inputs/unavailable-local-visibility/b.h