mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-28 16:06:07 +00:00
Fix tracking of merged definitions when the merge target is also merged
into something else. llvm-svn: 342017
This commit is contained in:
parent
7e98d69847
commit
20fbdb347c
@ -997,7 +997,8 @@ public:
|
||||
/// Get the additional modules in which the definition \p Def has
|
||||
/// been merged.
|
||||
ArrayRef<Module*> getModulesWithMergedDefinition(const NamedDecl *Def) {
|
||||
auto MergedIt = MergedDefModules.find(Def);
|
||||
auto MergedIt =
|
||||
MergedDefModules.find(cast<NamedDecl>(Def->getCanonicalDecl()));
|
||||
if (MergedIt == MergedDefModules.end())
|
||||
return None;
|
||||
return MergedIt->second;
|
||||
|
@ -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<NamedDecl>(ND->getCanonicalDecl())].push_back(M);
|
||||
else
|
||||
ND->setVisibleDespiteOwningModule();
|
||||
}
|
||||
|
||||
void ASTContext::deduplicateMergedDefinitonsFor(NamedDecl *ND) {
|
||||
auto It = MergedDefModules.find(ND);
|
||||
auto It = MergedDefModules.find(cast<NamedDecl>(ND->getCanonicalDecl()));
|
||||
if (It == MergedDefModules.end())
|
||||
return;
|
||||
|
||||
|
34
clang/test/Modules/merge-template-pattern-visibility-2.cpp
Normal file
34
clang/test/Modules/merge-template-pattern-visibility-2.cpp
Normal file
@ -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<typename T> class A {};
|
||||
template<typename T> inline bool f(const A<T>&) { 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<typename T> class A {};
|
||||
template<typename T> inline bool f(const A<T>&) { 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<typename T> class A {};
|
||||
template<typename T> inline bool f(const A<T>&) { 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<int> o) { return f(o); } // expected-note {{instantiation of}}
|
Loading…
x
Reference in New Issue
Block a user