diff options
Diffstat (limited to 'clang/lib/Lex/ModuleMap.cpp')
-rw-r--r-- | clang/lib/Lex/ModuleMap.cpp | 20 |
1 files changed, 13 insertions, 7 deletions
diff --git a/clang/lib/Lex/ModuleMap.cpp b/clang/lib/Lex/ModuleMap.cpp index 498061fc05a..198544dd517 100644 --- a/clang/lib/Lex/ModuleMap.cpp +++ b/clang/lib/Lex/ModuleMap.cpp @@ -103,8 +103,14 @@ Module *ModuleMap::findModuleForHeader(const FileEntry *File) { = UmbrellaDirs.find(Dir); if (KnownDir != UmbrellaDirs.end()) { Module *Result = KnownDir->second; - Module *TopModule = Result->getTopLevelModule(); - if (TopModule->InferSubmodules) { + + // Search up the module stack until we find a module with an umbrella + // header. + Module *UmbrellaModule = Result; + while (!UmbrellaModule->UmbrellaHeader && UmbrellaModule->Parent) + UmbrellaModule = UmbrellaModule->Parent; + + if (UmbrellaModule->InferSubmodules) { // Infer submodules for each of the directories we found between // the directory of the umbrella header and the directory where // the actual header is located. @@ -114,32 +120,32 @@ Module *ModuleMap::findModuleForHeader(const FileEntry *File) { // FIXME: Should we tack on an "explicit" for PrivateHeaders? That // might be what we want, but it feels like a hack. unsigned LastSkippedDir = SkippedDirs.size(); - if (LastSkippedDir && TopModule->IsFramework) + if (LastSkippedDir && UmbrellaModule->IsFramework) --LastSkippedDir; for (unsigned I = LastSkippedDir; I != 0; --I) { // Find or create the module that corresponds to this directory name. StringRef Name = llvm::sys::path::stem(SkippedDirs[I-1]->getName()); Result = findOrCreateModule(Name, Result, /*IsFramework=*/false, - TopModule->InferExplicitSubmodules).first; + UmbrellaModule->InferExplicitSubmodules).first; // Associate the module and the directory. UmbrellaDirs[SkippedDirs[I-1]] = Result; // If inferred submodules export everything they import, add a // wildcard to the set of exports. - if (TopModule->InferExportWildcard && Result->Exports.empty()) + if (UmbrellaModule->InferExportWildcard && Result->Exports.empty()) Result->Exports.push_back(Module::ExportDecl(0, true)); } // Infer a submodule with the same name as this header file. StringRef Name = llvm::sys::path::stem(File->getName()); Result = findOrCreateModule(Name, Result, /*IsFramework=*/false, - TopModule->InferExplicitSubmodules).first; + UmbrellaModule->InferExplicitSubmodules).first; // If inferred submodules export everything they import, add a // wildcard to the set of exports. - if (TopModule->InferExportWildcard && Result->Exports.empty()) + if (UmbrellaModule->InferExportWildcard && Result->Exports.empty()) Result->Exports.push_back(Module::ExportDecl(0, true)); } else { // Record each of the directories we stepped through as being part of |