forked from OSchip/llvm-project
Refactor *TemplateDecl::addSpecialization to reduce duplication and add some
more asserts. llvm-svn: 230296
This commit is contained in:
parent
4794190d81
commit
e977e51d71
|
@ -545,8 +545,11 @@ protected:
|
|||
template <typename EntryType> struct SpecEntryTraits {
|
||||
typedef EntryType DeclType;
|
||||
|
||||
static DeclType *getMostRecentDecl(EntryType *D) {
|
||||
return D->getMostRecentDecl();
|
||||
static DeclType *getDecl(EntryType *D) {
|
||||
return D;
|
||||
}
|
||||
static ArrayRef<TemplateArgument> getTemplateArgs(EntryType *D) {
|
||||
return D->getTemplateArgs().asArray();
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -565,7 +568,7 @@ protected:
|
|||
: SpecIterator::iterator_adaptor_base(std::move(SetIter)) {}
|
||||
|
||||
DeclType *operator*() const {
|
||||
return SETraits::getMostRecentDecl(&*this->I);
|
||||
return SETraits::getDecl(&*this->I)->getMostRecentDecl();
|
||||
}
|
||||
DeclType *operator->() const { return **this; }
|
||||
};
|
||||
|
@ -580,6 +583,10 @@ protected:
|
|||
findSpecializationImpl(llvm::FoldingSetVector<EntryType> &Specs,
|
||||
ArrayRef<TemplateArgument> Args, void *&InsertPos);
|
||||
|
||||
template <class Derived, class EntryType>
|
||||
void addSpecializationImpl(llvm::FoldingSetVector<EntryType> &Specs,
|
||||
EntryType *Entry, void *InsertPos);
|
||||
|
||||
struct CommonBase {
|
||||
CommonBase() : InstantiatedFromMember(nullptr, false) { }
|
||||
|
||||
|
@ -719,9 +726,12 @@ template <> struct RedeclarableTemplateDecl::
|
|||
SpecEntryTraits<FunctionTemplateSpecializationInfo> {
|
||||
typedef FunctionDecl DeclType;
|
||||
|
||||
static DeclType *
|
||||
getMostRecentDecl(FunctionTemplateSpecializationInfo *I) {
|
||||
return I->Function->getMostRecentDecl();
|
||||
static DeclType *getDecl(FunctionTemplateSpecializationInfo *I) {
|
||||
return I->Function;
|
||||
}
|
||||
static ArrayRef<TemplateArgument>
|
||||
getTemplateArgs(FunctionTemplateSpecializationInfo *I) {
|
||||
return I->TemplateArguments->asArray();
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
@ -160,17 +160,43 @@ RedeclarableTemplateDecl::CommonBase *RedeclarableTemplateDecl::getCommonPtr() c
|
|||
return Common;
|
||||
}
|
||||
|
||||
template <class EntryType>
|
||||
typename RedeclarableTemplateDecl::SpecEntryTraits<EntryType>::DeclType*
|
||||
template<class EntryType>
|
||||
typename RedeclarableTemplateDecl::SpecEntryTraits<EntryType>::DeclType *
|
||||
RedeclarableTemplateDecl::findSpecializationImpl(
|
||||
llvm::FoldingSetVector<EntryType> &Specs,
|
||||
ArrayRef<TemplateArgument> Args,
|
||||
void *&InsertPos) {
|
||||
llvm::FoldingSetVector<EntryType> &Specs, ArrayRef<TemplateArgument> Args,
|
||||
void *&InsertPos) {
|
||||
typedef SpecEntryTraits<EntryType> SETraits;
|
||||
llvm::FoldingSetNodeID ID;
|
||||
EntryType::Profile(ID,Args, getASTContext());
|
||||
EntryType *Entry = Specs.FindNodeOrInsertPos(ID, InsertPos);
|
||||
return Entry ? SETraits::getMostRecentDecl(Entry) : nullptr;
|
||||
return Entry ? SETraits::getDecl(Entry)->getMostRecentDecl() : nullptr;
|
||||
}
|
||||
|
||||
template<class Derived, class EntryType>
|
||||
void RedeclarableTemplateDecl::addSpecializationImpl(
|
||||
llvm::FoldingSetVector<EntryType> &Specializations, EntryType *Entry,
|
||||
void *InsertPos) {
|
||||
typedef SpecEntryTraits<EntryType> SETraits;
|
||||
if (InsertPos) {
|
||||
#ifndef NDEBUG
|
||||
void *CorrectInsertPos;
|
||||
assert(!findSpecializationImpl(Specializations,
|
||||
SETraits::getTemplateArgs(Entry),
|
||||
CorrectInsertPos) &&
|
||||
InsertPos == CorrectInsertPos &&
|
||||
"given incorrect InsertPos for specialization");
|
||||
#endif
|
||||
Specializations.InsertNode(Entry, InsertPos);
|
||||
} else {
|
||||
EntryType *Existing = Specializations.GetOrInsertNode(Entry);
|
||||
(void)Existing;
|
||||
assert(SETraits::getDecl(Existing)->isCanonicalDecl() &&
|
||||
"non-canonical specialization?");
|
||||
}
|
||||
|
||||
if (ASTMutationListener *L = getASTMutationListener())
|
||||
L->AddedCXXTemplateSpecialization(cast<Derived>(this),
|
||||
SETraits::getDecl(Entry));
|
||||
}
|
||||
|
||||
/// \brief Generate the injected template arguments for the given template
|
||||
|
@ -270,12 +296,8 @@ FunctionTemplateDecl::findSpecialization(ArrayRef<TemplateArgument> Args,
|
|||
|
||||
void FunctionTemplateDecl::addSpecialization(
|
||||
FunctionTemplateSpecializationInfo *Info, void *InsertPos) {
|
||||
if (InsertPos)
|
||||
getSpecializations().InsertNode(Info, InsertPos);
|
||||
else
|
||||
getSpecializations().GetOrInsertNode(Info);
|
||||
if (ASTMutationListener *L = getASTMutationListener())
|
||||
L->AddedCXXTemplateSpecialization(this, Info->Function);
|
||||
addSpecializationImpl<FunctionTemplateDecl>(getSpecializations(), Info,
|
||||
InsertPos);
|
||||
}
|
||||
|
||||
ArrayRef<TemplateArgument> FunctionTemplateDecl::getInjectedTemplateArgs() {
|
||||
|
@ -357,16 +379,7 @@ ClassTemplateDecl::findSpecialization(ArrayRef<TemplateArgument> Args,
|
|||
|
||||
void ClassTemplateDecl::AddSpecialization(ClassTemplateSpecializationDecl *D,
|
||||
void *InsertPos) {
|
||||
if (InsertPos)
|
||||
getSpecializations().InsertNode(D, InsertPos);
|
||||
else {
|
||||
ClassTemplateSpecializationDecl *Existing
|
||||
= getSpecializations().GetOrInsertNode(D);
|
||||
(void)Existing;
|
||||
assert(Existing->isCanonicalDecl() && "Non-canonical specialization?");
|
||||
}
|
||||
if (ASTMutationListener *L = getASTMutationListener())
|
||||
L->AddedCXXTemplateSpecialization(this, D);
|
||||
addSpecializationImpl<ClassTemplateDecl>(getSpecializations(), D, InsertPos);
|
||||
}
|
||||
|
||||
ClassTemplatePartialSpecializationDecl *
|
||||
|
@ -990,16 +1003,7 @@ VarTemplateDecl::findSpecialization(ArrayRef<TemplateArgument> Args,
|
|||
|
||||
void VarTemplateDecl::AddSpecialization(VarTemplateSpecializationDecl *D,
|
||||
void *InsertPos) {
|
||||
if (InsertPos)
|
||||
getSpecializations().InsertNode(D, InsertPos);
|
||||
else {
|
||||
VarTemplateSpecializationDecl *Existing =
|
||||
getSpecializations().GetOrInsertNode(D);
|
||||
(void)Existing;
|
||||
assert(Existing->isCanonicalDecl() && "Non-canonical specialization?");
|
||||
}
|
||||
if (ASTMutationListener *L = getASTMutationListener())
|
||||
L->AddedCXXTemplateSpecialization(this, D);
|
||||
addSpecializationImpl<VarTemplateDecl>(getSpecializations(), D, InsertPos);
|
||||
}
|
||||
|
||||
VarTemplatePartialSpecializationDecl *
|
||||
|
|
Loading…
Reference in New Issue