diff options
Diffstat (limited to 'clang')
-rw-r--r-- | clang/include/clang/Basic/Module.h | 3 | ||||
-rw-r--r-- | clang/include/clang/Serialization/ModuleManager.h | 2 | ||||
-rw-r--r-- | clang/lib/Serialization/ASTReader.cpp | 5 | ||||
-rw-r--r-- | clang/lib/Serialization/ModuleManager.cpp | 15 | ||||
-rw-r--r-- | clang/test/Modules/dependent-module-different-location.m | 44 |
5 files changed, 50 insertions, 19 deletions
diff --git a/clang/include/clang/Basic/Module.h b/clang/include/clang/Basic/Module.h index a2309f5..1a1feb9 100644 --- a/clang/include/clang/Basic/Module.h +++ b/clang/include/clang/Basic/Module.h @@ -608,8 +608,7 @@ public: /// Set the serialized AST file for the top-level module of this module. void setASTFile(Optional<FileEntryRef> File) { - assert((!File || !getASTFile() || getASTFile() == File) && - "file path changed"); + assert((!getASTFile() || getASTFile() == File) && "file path changed"); getTopLevelModule()->ASTFile = File; } diff --git a/clang/include/clang/Serialization/ModuleManager.h b/clang/include/clang/Serialization/ModuleManager.h index 4305bae..1623dd4 100644 --- a/clang/include/clang/Serialization/ModuleManager.h +++ b/clang/include/clang/Serialization/ModuleManager.h @@ -250,7 +250,7 @@ public: std::string &ErrorStr); /// Remove the modules starting from First (to the end). - void removeModules(ModuleIterator First, ModuleMap *modMap); + void removeModules(ModuleIterator First); /// Add an in-memory buffer the list of known buffers void addInMemoryBuffer(StringRef FileName, diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp index 2716a59..ad6db3c 100644 --- a/clang/lib/Serialization/ASTReader.cpp +++ b/clang/lib/Serialization/ASTReader.cpp @@ -4227,10 +4227,7 @@ ASTReader::ASTReadResult ASTReader::ReadAST(StringRef FileName, ReadASTCore(FileName, Type, ImportLoc, /*ImportedBy=*/nullptr, Loaded, 0, 0, ASTFileSignature(), ClientLoadCapabilities)) { - ModuleMgr.removeModules(ModuleMgr.begin() + NumModules, - PP.getLangOpts().Modules - ? &PP.getHeaderSearchInfo().getModuleMap() - : nullptr); + ModuleMgr.removeModules(ModuleMgr.begin() + NumModules); // If we find that any modules are unusable, the global index is going // to be out-of-date. Just remove it. diff --git a/clang/lib/Serialization/ModuleManager.cpp b/clang/lib/Serialization/ModuleManager.cpp index 4fd217c..544dac1 100644 --- a/clang/lib/Serialization/ModuleManager.cpp +++ b/clang/lib/Serialization/ModuleManager.cpp @@ -249,7 +249,7 @@ ModuleManager::addModule(StringRef FileName, ModuleKind Type, return NewlyLoaded; } -void ModuleManager::removeModules(ModuleIterator First, ModuleMap *modMap) { +void ModuleManager::removeModules(ModuleIterator First) { auto Last = end(); if (First == Last) return; @@ -280,19 +280,10 @@ void ModuleManager::removeModules(ModuleIterator First, ModuleMap *modMap) { } } - // Delete the modules and erase them from the various structures. - for (ModuleIterator victim = First; victim != Last; ++victim) { + // Delete the modules. + for (ModuleIterator victim = First; victim != Last; ++victim) Modules.erase(victim->File); - if (modMap) { - StringRef ModuleName = victim->ModuleName; - if (Module *mod = modMap->findModule(ModuleName)) { - mod->setASTFile(None); - } - } - } - - // Delete the modules. Chain.erase(Chain.begin() + (First - begin()), Chain.end()); } diff --git a/clang/test/Modules/dependent-module-different-location.m b/clang/test/Modules/dependent-module-different-location.m new file mode 100644 index 0000000..f969aa9 --- /dev/null +++ b/clang/test/Modules/dependent-module-different-location.m @@ -0,0 +1,44 @@ +// RUN: rm -rf %t +// RUN: split-file %s %t +// +// At first build Stable.pcm that references Movable.framework from StableFrameworks. +// RUN: %clang_cc1 -fsyntax-only -F %t/JustBuilt -F %t/StableFrameworks %t/prepopulate-module-cache.m \ +// RUN: -fmodules -fimplicit-module-maps -fmodules-cache-path=%t/modules.cache +// +// Now add Movable.framework to JustBuilt. +// RUN: mkdir %t/JustBuilt +// RUN: cp -r %t/StableFrameworks/Movable.framework %t/JustBuilt/Movable.framework +// +// Load Movable.pcm at first for JustBuilt location and then in the same TU try to load transitively for StableFrameworks location. +// RUN: %clang_cc1 -fsyntax-only -F %t/JustBuilt -F %t/StableFrameworks %t/trigger-error.m \ +// RUN: -fmodules -fimplicit-module-maps -fmodules-cache-path=%t/modules.cache + +// Test the case when a dependent module is found in a different location, so +// module cache has outdated information. <rdar://97216258> + +//--- StableFrameworks/Movable.framework/Headers/Movable.h +// empty + +//--- StableFrameworks/Movable.framework/Modules/module.modulemap +framework module Movable { + header "Movable.h" + export * +} + + +//--- StableFrameworks/Stable.framework/Headers/Stable.h +#import <Movable/Movable.h> + +//--- StableFrameworks/Stable.framework/Modules/module.modulemap +framework module Stable { + header "Stable.h" + export * +} + + +//--- prepopulate-module-cache.m +#import <Stable/Stable.h> + +//--- trigger-error.m +#import <Movable/Movable.h> +#import <Stable/Stable.h> |