diff options
author | Douglas Gregor <dgregor@apple.com> | 2011-12-01 22:20:10 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2011-12-01 22:20:10 +0000 |
commit | ecc2c090e7146c029dd9ee9a5a2fd66b275c01c0 (patch) | |
tree | a836f1b947d7804a2b4a593ccbed8d25e02a5c31 /lib/Serialization/ASTReader.cpp | |
parent | 403bc3f85f3b3461b73abdd9c632980bf95f34bd (diff) |
Implement name hiding for declarations deserialized from a non-visible
module. When that module becomes visible, so do those declarations.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@145640 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Serialization/ASTReader.cpp')
-rw-r--r-- | lib/Serialization/ASTReader.cpp | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/lib/Serialization/ASTReader.cpp b/lib/Serialization/ASTReader.cpp index 258baebc05..a083e24e9e 100644 --- a/lib/Serialization/ASTReader.cpp +++ b/lib/Serialization/ASTReader.cpp @@ -2439,6 +2439,11 @@ ASTReader::ASTReadResult ASTReader::validateFileEntries(ModuleFile &M) { return Success; } +void ASTReader::makeNamesVisible(const HiddenNames &Names) { + for (unsigned I = 0, N = Names.size(); I != N; ++I) + Names[I]->ModulePrivate = false; +} + void ASTReader::makeModuleVisible(Module *Mod, Module::NameVisibilityKind NameVisibility) { llvm::SmallPtrSet<Module *, 4> Visited; @@ -2457,8 +2462,13 @@ void ASTReader::makeModuleVisible(Module *Mod, // Update the module's name visibility. Mod->NameVisibility = NameVisibility; - // FIXME: If we've already deserialized any names from this module, + // If we've already deserialized any names from this module, // mark them as visible. + HiddenNamesMapType::iterator Hidden = HiddenNamesMap.find(Mod); + if (Hidden != HiddenNamesMap.end()) { + makeNamesVisible(Hidden->second); + HiddenNamesMap.erase(Hidden); + } // Push any non-explicit submodules onto the stack to be marked as // visible. @@ -2776,6 +2786,15 @@ void ASTReader::InitializeContext() { } } +void ASTReader::finalizeForWriting() { + for (HiddenNamesMapType::iterator Hidden = HiddenNamesMap.begin(), + HiddenEnd = HiddenNamesMap.end(); + Hidden != HiddenEnd; ++Hidden) { + makeNamesVisible(Hidden->second); + } + HiddenNamesMap.clear(); +} + /// \brief Retrieve the name of the original source file name /// directly from the AST file, without actually loading the AST /// file. |