-
-
Save yamaguchi1024/27caba1897eb813b297a8c4785adc11d to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/clang/include/clang/Lex/HeaderSearch.h b/clang/include/clang/Lex/HeaderSearch.h | |
index 3d13162da7d..a6ebec0838f 100644 | |
--- a/clang/include/clang/Lex/HeaderSearch.h | |
+++ b/clang/include/clang/Lex/HeaderSearch.h | |
@@ -528,7 +528,7 @@ public: | |
/// will only return an already-known module. | |
/// | |
/// \returns The module with the given name. | |
- Module *lookupModule(StringRef ModuleName, bool AllowSearch = true); | |
+ Module *lookupModule(StringRef ModuleName, bool AllowSearch = true, bool IsInclusionDirective = false); | |
/// Try to find a module map file in the given directory, returning | |
/// \c nullptr if none is found. | |
@@ -594,7 +594,7 @@ private: | |
/// may be made to find the module under a related-but-different search-name. | |
/// | |
/// \returns The module named ModuleName. | |
- Module *lookupModule(StringRef ModuleName, StringRef SearchName); | |
+ Module *lookupModule(StringRef ModuleName, StringRef SearchName, bool IsInclusionDirective = false); | |
/// Retrieve a module with the given name, which may be part of the | |
/// given framework. | |
diff --git a/clang/lib/Frontend/CompilerInstance.cpp b/clang/lib/Frontend/CompilerInstance.cpp | |
index d9900867d88..d350e47c352 100644 | |
--- a/clang/lib/Frontend/CompilerInstance.cpp | |
+++ b/clang/lib/Frontend/CompilerInstance.cpp | |
@@ -1683,7 +1683,7 @@ CompilerInstance::loadModule(SourceLocation ImportLoc, | |
Module = Known->second; | |
} else if (ModuleName == getLangOpts().CurrentModule) { | |
// This is the module we're building. | |
- Module = PP->getHeaderSearchInfo().lookupModule(ModuleName); | |
+ Module = PP->getHeaderSearchInfo().lookupModule(ModuleName, true, IsInclusionDirective); | |
/// FIXME: perhaps we should (a) look for a module using the module name | |
// to file map (PrebuiltModuleFiles) and (b) diagnose if still not found? | |
//if (Module == nullptr) { | |
@@ -1695,7 +1695,7 @@ CompilerInstance::loadModule(SourceLocation ImportLoc, | |
Known = KnownModules.insert(std::make_pair(Path[0].first, Module)).first; | |
} else { | |
// Search for a module with the given name. | |
- Module = PP->getHeaderSearchInfo().lookupModule(ModuleName); | |
+ Module = PP->getHeaderSearchInfo().lookupModule(ModuleName, true, IsInclusionDirective); | |
HeaderSearchOptions &HSOpts = | |
PP->getHeaderSearchInfo().getHeaderSearchOpts(); | |
@@ -1772,7 +1772,7 @@ CompilerInstance::loadModule(SourceLocation ImportLoc, | |
ImportLoc, ARRFlags)) { | |
case ASTReader::Success: { | |
if (Source != ModuleCache && !Module) { | |
- Module = PP->getHeaderSearchInfo().lookupModule(ModuleName); | |
+ Module = PP->getHeaderSearchInfo().lookupModule(ModuleName, true, IsInclusionDirective); | |
if (!Module || !Module->getASTFile() || | |
FileMgr->getFile(ModuleFileName) != Module->getASTFile()) { | |
// Error out if Module does not refer to the file in the prebuilt | |
@@ -1903,7 +1903,7 @@ CompilerInstance::loadModule(SourceLocation ImportLoc, | |
PrivateModule, PP->getIdentifierInfo(Module->Name)->getTokenID()); | |
PrivPath.push_back(std::make_pair(&II, Path[0].second)); | |
- if (PP->getHeaderSearchInfo().lookupModule(PrivateModule)) | |
+ if (PP->getHeaderSearchInfo().lookupModule(PrivateModule, true, IsInclusionDirective)) | |
Sub = | |
loadModule(ImportLoc, PrivPath, Visibility, IsInclusionDirective); | |
if (Sub) { | |
diff --git a/clang/lib/Lex/HeaderSearch.cpp b/clang/lib/Lex/HeaderSearch.cpp | |
index ff39e4c9da1..882af612d91 100644 | |
--- a/clang/lib/Lex/HeaderSearch.cpp | |
+++ b/clang/lib/Lex/HeaderSearch.cpp | |
@@ -198,14 +198,14 @@ std::string HeaderSearch::getCachedModuleFileName(StringRef ModuleName, | |
return Result.str().str(); | |
} | |
-Module *HeaderSearch::lookupModule(StringRef ModuleName, bool AllowSearch) { | |
+Module *HeaderSearch::lookupModule(StringRef ModuleName, bool AllowSearch, bool IsInclusionDirective) { | |
// Look in the module map to determine if there is a module by this name. | |
Module *Module = ModMap.findModule(ModuleName); | |
if (Module || !AllowSearch || !HSOpts->ImplicitModuleMaps) | |
return Module; | |
StringRef SearchName = ModuleName; | |
- Module = lookupModule(ModuleName, SearchName); | |
+ Module = lookupModule(ModuleName, SearchName, IsInclusionDirective); | |
// The facility for "private modules" -- adjacent, optional module maps named | |
// module.private.modulemap that are supposed to define private submodules -- | |
@@ -216,13 +216,13 @@ Module *HeaderSearch::lookupModule(StringRef ModuleName, bool AllowSearch) { | |
// could force building unwanted dependencies into the parent module and cause | |
// dependency cycles. | |
if (!Module && SearchName.consume_back("_Private")) | |
- Module = lookupModule(ModuleName, SearchName); | |
+ Module = lookupModule(ModuleName, SearchName, IsInclusionDirective); | |
if (!Module && SearchName.consume_back("Private")) | |
- Module = lookupModule(ModuleName, SearchName); | |
+ Module = lookupModule(ModuleName, SearchName, IsInclusionDirective); | |
return Module; | |
} | |
-Module *HeaderSearch::lookupModule(StringRef ModuleName, StringRef SearchName) { | |
+Module *HeaderSearch::lookupModule(StringRef ModuleName, StringRef SearchName, bool IsInclusionDirective) { | |
Module *Module = nullptr; | |
// Look through the various header search paths to load any available module | |
@@ -281,8 +281,8 @@ Module *HeaderSearch::lookupModule(StringRef ModuleName, StringRef SearchName) { | |
continue; | |
// Load all module maps in the immediate subdirectories of this search | |
- // directory. | |
- if (ModMap.getLangOpts().ObjC1 || ModMap.getLangOpts().ObjC2) | |
+ // directory if ModuleName was from @import. | |
+ if (!IsInclusionDirective) | |
loadSubdirectoryModuleMaps(SearchDirs[Idx]); | |
// Look again for the module. | |
diff --git a/clang/lib/Lex/PPDirectives.cpp b/clang/lib/Lex/PPDirectives.cpp | |
index 949dbf17563..66f82cab7eb 100644 | |
--- a/clang/lib/Lex/PPDirectives.cpp | |
+++ b/clang/lib/Lex/PPDirectives.cpp | |
@@ -679,7 +679,7 @@ Module *Preprocessor::getModuleForLocation(SourceLocation Loc) { | |
// to the current module, if there is one. | |
return getLangOpts().CurrentModule.empty() | |
? nullptr | |
- : HeaderInfo.lookupModule(getLangOpts().CurrentModule); | |
+ : HeaderInfo.lookupModule(getLangOpts().CurrentModule, true, true); | |
} | |
const FileEntry * |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment