forked from OSchip/llvm-project
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:
parent
e3de2ebe75
commit
b498ed6e0b
|
@ -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) { }
|
||||
|
||||
|
|
|
@ -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(
|
||||
|
|
Loading…
Reference in New Issue