forked from OSchip/llvm-project
Clear the linkage cache recursively. Fixes PR8926.
llvm-svn: 125104
This commit is contained in:
parent
86e48b6940
commit
d396b97c5a
|
@ -274,7 +274,7 @@ public:
|
|||
|
||||
/// \brief Clear the linkage cache in response to a change
|
||||
/// to the declaration.
|
||||
void ClearLinkageCache() { HasCachedLinkage = 0; }
|
||||
void ClearLinkageCache();
|
||||
|
||||
/// \brief Looks through UsingDecls and ObjCCompatibleAliasDecls for
|
||||
/// the underlying named decl.
|
||||
|
|
|
@ -579,6 +579,37 @@ static LinkageInfo getLVForClassMember(const NamedDecl *D, LVFlags F) {
|
|||
return LV;
|
||||
}
|
||||
|
||||
static void clearLinkageForClass(const CXXRecordDecl *record) {
|
||||
for (CXXRecordDecl::decl_iterator
|
||||
i = record->decls_begin(), e = record->decls_end(); i != e; ++i) {
|
||||
Decl *child = *i;
|
||||
if (isa<NamedDecl>(child))
|
||||
cast<NamedDecl>(child)->ClearLinkageCache();
|
||||
}
|
||||
}
|
||||
|
||||
void NamedDecl::ClearLinkageCache() {
|
||||
// Note that we can't skip clearing the linkage of children just
|
||||
// because the parent doesn't have cached linkage: we don't cache
|
||||
// when computing linkage for parent contexts.
|
||||
|
||||
HasCachedLinkage = 0;
|
||||
|
||||
// If we're changing the linkage of a class, we need to reset the
|
||||
// linkage of child declarations, too.
|
||||
if (const CXXRecordDecl *record = dyn_cast<CXXRecordDecl>(this))
|
||||
clearLinkageForClass(record);
|
||||
|
||||
if (const ClassTemplateDecl *temp = dyn_cast<ClassTemplateDecl>(this)) {
|
||||
// Clear linkage for the template pattern.
|
||||
CXXRecordDecl *record = temp->getTemplatedDecl();
|
||||
record->HasCachedLinkage = 0;
|
||||
clearLinkageForClass(record);
|
||||
|
||||
// ...do we need to clear linkage for specializations, too?
|
||||
}
|
||||
}
|
||||
|
||||
Linkage NamedDecl::getLinkage() const {
|
||||
if (HasCachedLinkage) {
|
||||
assert(Linkage(CachedLinkage) ==
|
||||
|
|
Loading…
Reference in New Issue