Index: lib/Lex/ModuleMap.cpp =================================================================== --- lib/Lex/ModuleMap.cpp +++ lib/Lex/ModuleMap.cpp @@ -208,9 +208,11 @@ // Returns true if RequestingModule directly uses RequestedModule. static bool directlyUses(const Module *RequestingModule, const Module *RequestedModule) { - return std::find(RequestingModule->DirectUses.begin(), - RequestingModule->DirectUses.end(), - RequestedModule) != RequestingModule->DirectUses.end(); + for (const Module* DirectUse : RequestingModule->DirectUses) { + if (RequestedModule->isSubModuleOf(DirectUse)) + return true; + } + return false; } static bool violatesPrivateInclude(Module *RequestingModule, Index: test/Modules/Inputs/declare-use/module.map =================================================================== --- test/Modules/Inputs/declare-use/module.map +++ test/Modules/Inputs/declare-use/module.map @@ -39,6 +39,7 @@ use XE use XJ use XK + use XN } module XH { @@ -66,5 +67,11 @@ textual header "m2.h" } +module XN { + module sub { + header "sub.h" + } +} + module XS { } Index: test/Modules/declare-use1.cpp =================================================================== --- test/Modules/declare-use1.cpp +++ test/Modules/declare-use1.cpp @@ -5,4 +5,5 @@ #include "e.h" #include "f.h" // expected-error {{module XG does not depend on a module exporting 'f.h'}} #include "i.h" -const int g2 = g1 + e + f + aux_i; +#include "sub.h" +const int g2 = g1 + e + f + aux_i + sub;