diff options
author | Richard Smith <richard-llvm@metafoo.co.uk> | 2018-09-12 02:28:14 +0000 |
---|---|---|
committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2018-09-12 02:28:14 +0000 |
commit | 4034461abd207614cafec65e863ef20caff48669 (patch) | |
tree | 294731666a45d2531fbf35de0720e1585d01ccde /clang/lib/Serialization | |
parent | e731d9acff40e6240b8677583b3ff2aaa23e5211 (diff) | |
download | bcm5719-llvm-4034461abd207614cafec65e863ef20caff48669.tar.gz bcm5719-llvm-4034461abd207614cafec65e863ef20caff48669.zip |
Revert r342019, "Track definition merging on the canonical declaration
even when [...]"
Further testing has revealed that this causes build breaks during
explicit module compilations.
llvm-svn: 342020
Diffstat (limited to 'clang/lib/Serialization')
-rw-r--r-- | clang/lib/Serialization/ASTReader.cpp | 9 | ||||
-rw-r--r-- | clang/lib/Serialization/ASTReaderDecl.cpp | 17 |
2 files changed, 23 insertions, 3 deletions
diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp index ac3b7374018..b60e5f14a67 100644 --- a/clang/lib/Serialization/ASTReader.cpp +++ b/clang/lib/Serialization/ASTReader.cpp @@ -3780,15 +3780,22 @@ void ASTReader::makeModuleVisible(Module *Mod, /// visible. void ASTReader::mergeDefinitionVisibility(NamedDecl *Def, NamedDecl *MergedDef) { + // FIXME: This doesn't correctly handle the case where MergedDef is visible + // in modules other than its owning module. We should instead give the + // ASTContext a list of merged definitions for Def. if (Def->isHidden()) { // If MergedDef is visible or becomes visible, make the definition visible. if (!MergedDef->isHidden()) Def->setVisibleDespiteOwningModule(); - else { + else if (getContext().getLangOpts().ModulesLocalVisibility) { getContext().mergeDefinitionIntoModule( Def, MergedDef->getImportedOwningModule(), /*NotifyListeners*/ false); PendingMergedDefinitionsToDeduplicate.insert(Def); + } else { + auto SubmoduleID = MergedDef->getOwningModuleID(); + assert(SubmoduleID && "hidden definition in no module"); + HiddenNamesMap[getSubmodule(SubmoduleID)].push_back(Def); } } } diff --git a/clang/lib/Serialization/ASTReaderDecl.cpp b/clang/lib/Serialization/ASTReaderDecl.cpp index 82951074764..00fad25eeac 100644 --- a/clang/lib/Serialization/ASTReaderDecl.cpp +++ b/clang/lib/Serialization/ASTReaderDecl.cpp @@ -4419,9 +4419,22 @@ void ASTDeclReader::UpdateDecl(Decl *D, case UPD_DECL_EXPORTED: { unsigned SubmoduleID = readSubmoduleID(); auto *Exported = cast<NamedDecl>(D); + if (auto *TD = dyn_cast<TagDecl>(Exported)) + Exported = TD->getDefinition(); Module *Owner = SubmoduleID ? Reader.getSubmodule(SubmoduleID) : nullptr; - Reader.getContext().mergeDefinitionIntoModule(Exported, Owner); - Reader.PendingMergedDefinitionsToDeduplicate.insert(Exported); + if (Reader.getContext().getLangOpts().ModulesLocalVisibility) { + Reader.getContext().mergeDefinitionIntoModule(cast<NamedDecl>(Exported), + Owner); + Reader.PendingMergedDefinitionsToDeduplicate.insert( + cast<NamedDecl>(Exported)); + } else if (Owner && Owner->NameVisibility != Module::AllVisible) { + // If Owner is made visible at some later point, make this declaration + // visible too. + Reader.HiddenNamesMap[Owner].push_back(Exported); + } else { + // The declaration is now visible. + Exported->setVisibleDespiteOwningModule(); + } break; } |