From eba34ceb258b289a8b01919e127ed508189b28d4 Mon Sep 17 00:00:00 2001 From: Richard Smith Date: Wed, 12 Sep 2018 02:13:46 +0000 Subject: [PATCH] Fix tracking of merged definitions when the merge target is also merged into something else. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@342017 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/AST/ASTContext.h | 3 +- lib/AST/ASTContext.cpp | 4 +-- .../merge-template-pattern-visibility-2.cpp | 34 +++++++++++++++++++ 3 files changed, 38 insertions(+), 3 deletions(-) create mode 100644 test/Modules/merge-template-pattern-visibility-2.cpp diff --git a/include/clang/AST/ASTContext.h b/include/clang/AST/ASTContext.h index d7f32538d7..5b693eb97f 100644 --- a/include/clang/AST/ASTContext.h +++ b/include/clang/AST/ASTContext.h @@ -997,7 +997,8 @@ public: /// Get the additional modules in which the definition \p Def has /// been merged. ArrayRef getModulesWithMergedDefinition(const NamedDecl *Def) { - auto MergedIt = MergedDefModules.find(Def); + auto MergedIt = + MergedDefModules.find(cast(Def->getCanonicalDecl())); if (MergedIt == MergedDefModules.end()) return None; return MergedIt->second; diff --git a/lib/AST/ASTContext.cpp b/lib/AST/ASTContext.cpp index ab2a95e577..0ed52ffd35 100644 --- a/lib/AST/ASTContext.cpp +++ b/lib/AST/ASTContext.cpp @@ -933,13 +933,13 @@ void ASTContext::mergeDefinitionIntoModule(NamedDecl *ND, Module *M, Listener->RedefinedHiddenDefinition(ND, M); if (getLangOpts().ModulesLocalVisibility) - MergedDefModules[ND].push_back(M); + MergedDefModules[cast(ND->getCanonicalDecl())].push_back(M); else ND->setVisibleDespiteOwningModule(); } void ASTContext::deduplicateMergedDefinitonsFor(NamedDecl *ND) { - auto It = MergedDefModules.find(ND); + auto It = MergedDefModules.find(cast(ND->getCanonicalDecl())); if (It == MergedDefModules.end()) return; diff --git a/test/Modules/merge-template-pattern-visibility-2.cpp b/test/Modules/merge-template-pattern-visibility-2.cpp new file mode 100644 index 0000000000..14577f146e --- /dev/null +++ b/test/Modules/merge-template-pattern-visibility-2.cpp @@ -0,0 +1,34 @@ +// RUN: %clang_cc1 -fmodules -fmodules-local-submodule-visibility %s -verify -Werror=undefined-inline + +#pragma clang module build A1 +module A1 { export * } +#pragma clang module contents +#pragma clang module begin A1 +template class A {}; +template inline bool f(const A&) { return T::error; } +#pragma clang module end +#pragma clang module endbuild + +#pragma clang module build A2 +module A2 { export * } +#pragma clang module contents +#pragma clang module begin A2 +#pragma clang module load A1 +template class A {}; +template inline bool f(const A&) { return T::error; } +#pragma clang module end +#pragma clang module endbuild + +#pragma clang module build A3 +module A3 { export * } +#pragma clang module contents +#pragma clang module begin A3 +template class A {}; +template inline bool f(const A&) { return T::error; } +#pragma clang module end +#pragma clang module endbuild + +#pragma clang module load A3 +#pragma clang module import A2 +// expected-error@* {{cannot be used prior to}} +bool y(A o) { return f(o); } // expected-note {{instantiation of}} -- 2.50.1