aboutsummaryrefslogtreecommitdiff
path: root/lib/Serialization/ASTReader.cpp
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2011-12-01 22:20:10 +0000
committerDouglas Gregor <dgregor@apple.com>2011-12-01 22:20:10 +0000
commitecc2c090e7146c029dd9ee9a5a2fd66b275c01c0 (patch)
treea836f1b947d7804a2b4a593ccbed8d25e02a5c31 /lib/Serialization/ASTReader.cpp
parent403bc3f85f3b3461b73abdd9c632980bf95f34bd (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.cpp21
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.