Refactor find*Specialization functions using SpecEntryTraits

This patch reimplements the find*Specialization family of member
functions of {Class,Function}TemplateDecl in terms of a common
implementation that uses SpecEntryTraits to obtain the most recent
declaration.

llvm-svn: 109869
This commit is contained in:
Peter Collingbourne 2010-07-30 17:09:04 +00:00
parent e3de2ebe75
commit b498ed6e0b
2 changed files with 22 additions and 16 deletions

View File

@ -512,6 +512,11 @@ protected:
}
};
template <class EntryType> typename SpecEntryTraits<EntryType>::DeclType*
findSpecializationImpl(llvm::FoldingSet<EntryType> &Specs,
const TemplateArgument *Args, unsigned NumArgs,
void *&InsertPos);
struct CommonBase {
CommonBase() : InstantiatedFromMember(0, false) { }

View File

@ -126,6 +126,19 @@ RedeclarableTemplateDecl *RedeclarableTemplateDecl::getNextRedeclaration() {
return Common ? Common->Latest : this;
}
template <class EntryType>
typename RedeclarableTemplateDecl::SpecEntryTraits<EntryType>::DeclType*
RedeclarableTemplateDecl::findSpecializationImpl(
llvm::FoldingSet<EntryType> &Specs,
const TemplateArgument *Args, unsigned NumArgs,
void *&InsertPos) {
typedef SpecEntryTraits<EntryType> SETraits;
llvm::FoldingSetNodeID ID;
EntryType::Profile(ID,Args,NumArgs, getASTContext());
EntryType *Entry = Specs.FindNodeOrInsertPos(ID, InsertPos);
return Entry ? SETraits::getMostRecentDeclaration(Entry) : 0;
}
//===----------------------------------------------------------------------===//
// FunctionTemplateDecl Implementation
//===----------------------------------------------------------------------===//
@ -152,11 +165,7 @@ RedeclarableTemplateDecl::CommonBase *FunctionTemplateDecl::newCommon() {
FunctionDecl *
FunctionTemplateDecl::findSpecialization(const TemplateArgument *Args,
unsigned NumArgs, void *&InsertPos) {
llvm::FoldingSetNodeID ID;
FunctionTemplateSpecializationInfo::Profile(ID,Args,NumArgs, getASTContext());
FunctionTemplateSpecializationInfo *Info
= getSpecializations().FindNodeOrInsertPos(ID, InsertPos);
return Info ? Info->Function->getMostRecentDeclaration() : 0;
return findSpecializationImpl(getSpecializations(), Args, NumArgs, InsertPos);
}
//===----------------------------------------------------------------------===//
@ -188,23 +197,15 @@ RedeclarableTemplateDecl::CommonBase *ClassTemplateDecl::newCommon() {
ClassTemplateSpecializationDecl *
ClassTemplateDecl::findSpecialization(const TemplateArgument *Args,
unsigned NumArgs, void *&InsertPos) {
llvm::FoldingSetNodeID ID;
ClassTemplateSpecializationDecl::Profile(ID, Args, NumArgs, getASTContext());
ClassTemplateSpecializationDecl *D
= getSpecializations().FindNodeOrInsertPos(ID, InsertPos);
return D ? D->getMostRecentDeclaration() : 0;
return findSpecializationImpl(getSpecializations(), Args, NumArgs, InsertPos);
}
ClassTemplatePartialSpecializationDecl *
ClassTemplateDecl::findPartialSpecialization(const TemplateArgument *Args,
unsigned NumArgs,
void *&InsertPos) {
llvm::FoldingSetNodeID ID;
ClassTemplatePartialSpecializationDecl::Profile(ID, Args, NumArgs,
getASTContext());
ClassTemplatePartialSpecializationDecl *D
= getPartialSpecializations().FindNodeOrInsertPos(ID, InsertPos);
return D ? D->getMostRecentDeclaration() : 0;
return findSpecializationImpl(getPartialSpecializations(), Args, NumArgs,
InsertPos);
}
void ClassTemplateDecl::getPartialSpecializations(