aboutsummaryrefslogtreecommitdiff
path: root/lib/AST/DeclTemplate.cpp
diff options
context:
space:
mode:
authorPeter Collingbourne <peter@pcc.me.uk>2010-07-30 17:09:04 +0000
committerPeter Collingbourne <peter@pcc.me.uk>2010-07-30 17:09:04 +0000
commit4048590d5774fd4b08661b5cf59b6f90b62f283a (patch)
treef40270339cbc49921ffe78a645fca7f40af11b8b /lib/AST/DeclTemplate.cpp
parent44dd0b440efdb37ff4c6e49f243faa3b0580b120 (diff)
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. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@109869 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/AST/DeclTemplate.cpp')
-rw-r--r--lib/AST/DeclTemplate.cpp33
1 files changed, 17 insertions, 16 deletions
diff --git a/lib/AST/DeclTemplate.cpp b/lib/AST/DeclTemplate.cpp
index 25df086e73..e69338a773 100644
--- a/lib/AST/DeclTemplate.cpp
+++ b/lib/AST/DeclTemplate.cpp
@@ -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(