Index: lib/Lex/ModuleMap.cpp =================================================================== --- lib/Lex/ModuleMap.cpp +++ lib/Lex/ModuleMap.cpp @@ -232,10 +232,8 @@ } #endif return IsPrivateRole && - // FIXME: Should we map RequestingModule to its top-level module here - // too? This check is redundant with the isSubModuleOf check in - // diagnoseHeaderInclusion. - RequestedModule->getTopLevelModule() != RequestingModule; + RequestedModule->getTopLevelModule() != + RequestingModule->getTopLevelModule(); } static Module *getTopLevelOrNull(Module *M) { Index: test/Modules/Inputs/private3/private.h =================================================================== --- /dev/null +++ test/Modules/Inputs/private3/private.h @@ -0,0 +1,7 @@ +#ifndef PRIVATE_H +#define PRIVATE_H + +void priv(); + +#endif + Index: test/Modules/Inputs/private3/public.h =================================================================== --- /dev/null +++ test/Modules/Inputs/private3/public.h @@ -0,0 +1,11 @@ +#ifndef PUBLIC_H +#define PUBLIC_H + +#include "private.h" + +void pub() { + priv(); +} + +#endif + Index: test/Modules/private.modulemap =================================================================== --- /dev/null +++ test/Modules/private.modulemap @@ -0,0 +1,35 @@ +// RUN: rm -rf %t +// RUN: cd %S +// RUN: %clang_cc1 -fmodules -x c++ -std=c++11 -fmodules-cache-path=%t \ +// RUN: -I%S/Inputs/private3 -emit-module -fmodule-name=A -o %t/m.pcm %s +// RUN: %clang_cc1 -fmodules -x c++ -std=c++11 -fmodules-cache-path=%t \ +// RUN: -I%S/Inputs/private3 -emit-module -fmodule-name=B -o %t/m.pcm %s +// RUN: %clang_cc1 -fmodules -x c++ -std=c++11 -fmodules-cache-path=%t \ +// RUN: -I%S/Inputs/private3 -emit-module -fmodule-name=C -o %t/m.pcm %s +// RUN: %clang_cc1 -fmodules -x c++ -std=c++11 -fmodules-cache-path=%t \ +// RUN: -I%S/Inputs/private3 -emit-module -fmodule-name=D -o %t/m.pcm %s + +module A { + header "Inputs/private3/public.h" + private header "Inputs/private3/private.h" +} +module B { + header "Inputs/private3/public.h" + module "private.h" { + private header "Inputs/private3/private.h" + } +} +module C { + module "public.h" { + header "Inputs/private3/public.h" + } + private header "Inputs/private3/private.h" +} +module D { + module "public.h" { + header "Inputs/private3/public.h" + } + module "private.h" { + private header "Inputs/private3/private.h" + } +}