diff --git a/clang/include/clang/Lex/ModuleMap.h b/clang/include/clang/Lex/ModuleMap.h --- a/clang/include/clang/Lex/ModuleMap.h +++ b/clang/include/clang/Lex/ModuleMap.h @@ -101,9 +101,9 @@ /// The top-level modules that are known. llvm::StringMap Modules; - /// Module loading cache that includes submodules, indexed by IdentifierInfo. + /// Module loading cache that includes submodules, indexed by module names. /// nullptr is stored for modules that are known to fail to load. - llvm::DenseMap CachedModuleLoads; + llvm::StringMap CachedModuleLoads; /// Shadow modules created while building this module map. llvm::SmallVector ShadowModules; @@ -703,13 +703,13 @@ } /// Cache a module load. M might be nullptr. - void cacheModuleLoad(const IdentifierInfo &II, Module *M) { - CachedModuleLoads[&II] = M; + void cacheModuleLoad(StringRef ModuleName, Module *M) { + CachedModuleLoads[ModuleName] = M; } /// Return a cached module load. - llvm::Optional getCachedModuleLoad(const IdentifierInfo &II) { - auto I = CachedModuleLoads.find(&II); + llvm::Optional getCachedModuleLoad(StringRef ModuleName) { + auto I = CachedModuleLoads.find(ModuleName); if (I == CachedModuleLoads.end()) return None; return I->second; diff --git a/clang/lib/Frontend/CompilerInstance.cpp b/clang/lib/Frontend/CompilerInstance.cpp --- a/clang/lib/Frontend/CompilerInstance.cpp +++ b/clang/lib/Frontend/CompilerInstance.cpp @@ -1617,28 +1617,27 @@ // the files we were handed. struct ReadModuleNames : ASTReaderListener { CompilerInstance &CI; - llvm::SmallVector LoadedModules; + llvm::SmallVector LoadedModules; ReadModuleNames(CompilerInstance &CI) : CI(CI) {} void ReadModuleName(StringRef ModuleName) override { - LoadedModules.push_back( - CI.getPreprocessor().getIdentifierInfo(ModuleName)); + LoadedModules.push_back(ModuleName); } void registerAll() { ModuleMap &MM = CI.getPreprocessor().getHeaderSearchInfo().getModuleMap(); - for (auto *II : LoadedModules) - MM.cacheModuleLoad(*II, MM.findModule(II->getName())); + for (StringRef LoadedModule : LoadedModules) + MM.cacheModuleLoad(LoadedModule, MM.findModule(LoadedModule)); LoadedModules.clear(); } void markAllUnavailable() { - for (auto *II : LoadedModules) { + for (StringRef LoadedModule : LoadedModules) { if (Module *M = CI.getPreprocessor() .getHeaderSearchInfo() .getModuleMap() - .findModule(II->getName())) { + .findModule(LoadedModule)) { M->HasIncompatibleModuleFile = true; // Mark module as available if the only reason it was unavailable @@ -1924,7 +1923,7 @@ // If we don't already have information on this module, load the module now. Module *Module = nullptr; ModuleMap &MM = getPreprocessor().getHeaderSearchInfo().getModuleMap(); - if (auto MaybeModule = MM.getCachedModuleLoad(*Path[0].first)) { + if (auto MaybeModule = MM.getCachedModuleLoad(ModuleName)) { // Use the cached result, which may be nullptr. Module = *MaybeModule; } else if (ModuleName == getLangOpts().CurrentModule) { @@ -1940,7 +1939,7 @@ // DisableGeneratingGlobalModuleIndex = true; // return ModuleLoadResult(); //} - MM.cacheModuleLoad(*Path[0].first, Module); + MM.cacheModuleLoad(ModuleName, Module); } else { ModuleLoadResult Result = findOrCompileModuleAndReadAST( ModuleName, ImportLoc, ModuleNameLoc, IsInclusionDirective); @@ -1949,7 +1948,7 @@ if (!Result) DisableGeneratingGlobalModuleIndex = true; Module = Result; - MM.cacheModuleLoad(*Path[0].first, Module); + MM.cacheModuleLoad(ModuleName, Module); } // If we never found the module, fail. Otherwise, verify the module and link diff --git a/clang/test/Modules/Inputs/interface-visibility-2/Interface.h b/clang/test/Modules/Inputs/interface-visibility-2/Interface.h new file mode 100644 --- /dev/null +++ b/clang/test/Modules/Inputs/interface-visibility-2/Interface.h @@ -0,0 +1,2 @@ +@interface Interface +@end diff --git a/clang/test/Modules/Inputs/interface-visibility-2/InterfaceBridge.h b/clang/test/Modules/Inputs/interface-visibility-2/InterfaceBridge.h new file mode 100644 --- /dev/null +++ b/clang/test/Modules/Inputs/interface-visibility-2/InterfaceBridge.h @@ -0,0 +1 @@ +typedef struct __attribute__((objc_bridge(Interface))) Foo *Bar; diff --git a/clang/test/Modules/Inputs/interface-visibility-2/module.modulemap b/clang/test/Modules/Inputs/interface-visibility-2/module.modulemap new file mode 100644 --- /dev/null +++ b/clang/test/Modules/Inputs/interface-visibility-2/module.modulemap @@ -0,0 +1,7 @@ +module InterfaceBridge { + header "InterfaceBridge.h" +} + +module Interface { + header "Interface.h" +} diff --git a/clang/test/Modules/interface-visibility-2.m b/clang/test/Modules/interface-visibility-2.m new file mode 100644 --- /dev/null +++ b/clang/test/Modules/interface-visibility-2.m @@ -0,0 +1,25 @@ +// RUN: rm -rf %t && mkdir %t + +// RUN: %clang_cc1 -fmodules -x objective-c -emit-module -fmodule-name=InterfaceBridge \ +// RUN: %S/Inputs/interface-visibility-2/module.modulemap -o %t/InterfaceBridge.pcm + +// RUN: %clang_cc1 -fmodules -x objective-c -emit-module -fmodule-name=Interface \ +// RUN: %S/Inputs/interface-visibility-2/module.modulemap -o %t/Interface.pcm + +// Check that the `-fmodule-file==` form succeeds: +// RUN: %clang_cc1 -fmodules -fsyntax-only %s -I %S/Inputs/Interface-visibility-2 \ +// RUN: -fmodule-file=InterfaceBridge=%t/InterfaceBridge.pcm -fmodule-file=Interface=%t/Interface.pcm \ +// RUN: -fmodule-map-file=%S/Inputs/interface-visibility-2/module.modulemap -verify + +// Check that the `-fmodule-file=` form succeeds: +// RUN: %clang_cc1 -fmodules -fsyntax-only %s -I %S/Inputs/Interface-visibility-2 \ +// RUN: -fmodule-file=%t/InterfaceBridge.pcm -fmodule-file=%t/Interface.pcm \ +// RUN: -fmodule-map-file=%S/Inputs/interface-visibility-2/module.modulemap -verify + +#import "InterfaceBridge.h" +#import "Interface.h" + +@interface Interface (User) +@end + +// expected-no-diagnostics