diff options
| author | 2020-08-03 15:06:44 +0000 | |
|---|---|---|
| committer | 2020-08-03 15:06:44 +0000 | |
| commit | b64793999546ed8adebaeebd9d8345d18db8927d (patch) | |
| tree | 4357c27b561d73b0e089727c6ed659f2ceff5f47 /gnu/llvm/tools/clang/lib/AST/DeclTemplate.cpp | |
| parent | Add support for UTF-8 DISPLAY-HINTs with octet length. For now only (diff) | |
| download | wireguard-openbsd-b64793999546ed8adebaeebd9d8345d18db8927d.tar.xz wireguard-openbsd-b64793999546ed8adebaeebd9d8345d18db8927d.zip | |
Remove LLVM 8.0.1 files.
Diffstat (limited to 'gnu/llvm/tools/clang/lib/AST/DeclTemplate.cpp')
| -rw-r--r-- | gnu/llvm/tools/clang/lib/AST/DeclTemplate.cpp | 1242 |
1 files changed, 0 insertions, 1242 deletions
diff --git a/gnu/llvm/tools/clang/lib/AST/DeclTemplate.cpp b/gnu/llvm/tools/clang/lib/AST/DeclTemplate.cpp deleted file mode 100644 index 76f29dac164..00000000000 --- a/gnu/llvm/tools/clang/lib/AST/DeclTemplate.cpp +++ /dev/null @@ -1,1242 +0,0 @@ -//===- DeclTemplate.cpp - Template Declaration AST Node Implementation ----===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file implements the C++ related Decl classes for templates. -// -//===----------------------------------------------------------------------===// - -#include "clang/AST/DeclTemplate.h" -#include "clang/AST/ASTContext.h" -#include "clang/AST/ASTMutationListener.h" -#include "clang/AST/DeclCXX.h" -#include "clang/AST/DeclarationName.h" -#include "clang/AST/Expr.h" -#include "clang/AST/ExternalASTSource.h" -#include "clang/AST/TemplateBase.h" -#include "clang/AST/TemplateName.h" -#include "clang/AST/Type.h" -#include "clang/AST/TypeLoc.h" -#include "clang/Basic/Builtins.h" -#include "clang/Basic/LLVM.h" -#include "clang/Basic/SourceLocation.h" -#include "llvm/ADT/ArrayRef.h" -#include "llvm/ADT/FoldingSet.h" -#include "llvm/ADT/None.h" -#include "llvm/ADT/PointerUnion.h" -#include "llvm/ADT/SmallVector.h" -#include "llvm/Support/Casting.h" -#include "llvm/Support/ErrorHandling.h" -#include <algorithm> -#include <cassert> -#include <cstdint> -#include <memory> -#include <utility> - -using namespace clang; - -//===----------------------------------------------------------------------===// -// TemplateParameterList Implementation -//===----------------------------------------------------------------------===// - -TemplateParameterList::TemplateParameterList(SourceLocation TemplateLoc, - SourceLocation LAngleLoc, - ArrayRef<NamedDecl *> Params, - SourceLocation RAngleLoc, - Expr *RequiresClause) - : TemplateLoc(TemplateLoc), LAngleLoc(LAngleLoc), RAngleLoc(RAngleLoc), - NumParams(Params.size()), ContainsUnexpandedParameterPack(false), - HasRequiresClause(static_cast<bool>(RequiresClause)) { - for (unsigned Idx = 0; Idx < NumParams; ++Idx) { - NamedDecl *P = Params[Idx]; - begin()[Idx] = P; - - if (!P->isTemplateParameterPack()) { - if (const auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(P)) - if (NTTP->getType()->containsUnexpandedParameterPack()) - ContainsUnexpandedParameterPack = true; - - if (const auto *TTP = dyn_cast<TemplateTemplateParmDecl>(P)) - if (TTP->getTemplateParameters()->containsUnexpandedParameterPack()) - ContainsUnexpandedParameterPack = true; - - // FIXME: If a default argument contains an unexpanded parameter pack, the - // template parameter list does too. - } - } - if (RequiresClause) { - *getTrailingObjects<Expr *>() = RequiresClause; - } -} - -TemplateParameterList * -TemplateParameterList::Create(const ASTContext &C, SourceLocation TemplateLoc, - SourceLocation LAngleLoc, - ArrayRef<NamedDecl *> Params, - SourceLocation RAngleLoc, Expr *RequiresClause) { - void *Mem = C.Allocate(totalSizeToAlloc<NamedDecl *, Expr *>( - Params.size(), RequiresClause ? 1u : 0u), - alignof(TemplateParameterList)); - return new (Mem) TemplateParameterList(TemplateLoc, LAngleLoc, Params, - RAngleLoc, RequiresClause); -} - -unsigned TemplateParameterList::getMinRequiredArguments() const { - unsigned NumRequiredArgs = 0; - for (const NamedDecl *P : asArray()) { - if (P->isTemplateParameterPack()) { - if (const auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(P)) - if (NTTP->isExpandedParameterPack()) { - NumRequiredArgs += NTTP->getNumExpansionTypes(); - continue; - } - - break; - } - - if (const auto *TTP = dyn_cast<TemplateTypeParmDecl>(P)) { - if (TTP->hasDefaultArgument()) - break; - } else if (const auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(P)) { - if (NTTP->hasDefaultArgument()) - break; - } else if (cast<TemplateTemplateParmDecl>(P)->hasDefaultArgument()) - break; - - ++NumRequiredArgs; - } - - return NumRequiredArgs; -} - -unsigned TemplateParameterList::getDepth() const { - if (size() == 0) - return 0; - - const NamedDecl *FirstParm = getParam(0); - if (const auto *TTP = dyn_cast<TemplateTypeParmDecl>(FirstParm)) - return TTP->getDepth(); - else if (const auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(FirstParm)) - return NTTP->getDepth(); - else - return cast<TemplateTemplateParmDecl>(FirstParm)->getDepth(); -} - -static void AdoptTemplateParameterList(TemplateParameterList *Params, - DeclContext *Owner) { - for (NamedDecl *P : *Params) { - P->setDeclContext(Owner); - - if (const auto *TTP = dyn_cast<TemplateTemplateParmDecl>(P)) - AdoptTemplateParameterList(TTP->getTemplateParameters(), Owner); - } -} - -namespace clang { - -void *allocateDefaultArgStorageChain(const ASTContext &C) { - return new (C) char[sizeof(void*) * 2]; -} - -} // namespace clang - -//===----------------------------------------------------------------------===// -// RedeclarableTemplateDecl Implementation -//===----------------------------------------------------------------------===// - -void RedeclarableTemplateDecl::anchor() {} - -RedeclarableTemplateDecl::CommonBase *RedeclarableTemplateDecl::getCommonPtr() const { - if (Common) - return Common; - - // Walk the previous-declaration chain until we either find a declaration - // with a common pointer or we run out of previous declarations. - SmallVector<const RedeclarableTemplateDecl *, 2> PrevDecls; - for (const RedeclarableTemplateDecl *Prev = getPreviousDecl(); Prev; - Prev = Prev->getPreviousDecl()) { - if (Prev->Common) { - Common = Prev->Common; - break; - } - - PrevDecls.push_back(Prev); - } - - // If we never found a common pointer, allocate one now. - if (!Common) { - // FIXME: If any of the declarations is from an AST file, we probably - // need an update record to add the common data. - - Common = newCommon(getASTContext()); - } - - // Update any previous declarations we saw with the common pointer. - for (const RedeclarableTemplateDecl *Prev : PrevDecls) - Prev->Common = Common; - - return Common; -} - -void RedeclarableTemplateDecl::loadLazySpecializationsImpl() const { - // Grab the most recent declaration to ensure we've loaded any lazy - // redeclarations of this template. - CommonBase *CommonBasePtr = getMostRecentDecl()->getCommonPtr(); - if (CommonBasePtr->LazySpecializations) { - ASTContext &Context = getASTContext(); - uint32_t *Specs = CommonBasePtr->LazySpecializations; - CommonBasePtr->LazySpecializations = nullptr; - for (uint32_t I = 0, N = *Specs++; I != N; ++I) - (void)Context.getExternalSource()->GetExternalDecl(Specs[I]); - } -} - -template<class EntryType> -typename RedeclarableTemplateDecl::SpecEntryTraits<EntryType>::DeclType * -RedeclarableTemplateDecl::findSpecializationImpl( - llvm::FoldingSetVector<EntryType> &Specs, ArrayRef<TemplateArgument> Args, - void *&InsertPos) { - using SETraits = SpecEntryTraits<EntryType>; - - llvm::FoldingSetNodeID ID; - EntryType::Profile(ID, Args, getASTContext()); - EntryType *Entry = Specs.FindNodeOrInsertPos(ID, InsertPos); - return Entry ? SETraits::getDecl(Entry)->getMostRecentDecl() : nullptr; -} - -template<class Derived, class EntryType> -void RedeclarableTemplateDecl::addSpecializationImpl( - llvm::FoldingSetVector<EntryType> &Specializations, EntryType *Entry, - void *InsertPos) { - using SETraits = SpecEntryTraits<EntryType>; - - 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)); -} - -//===----------------------------------------------------------------------===// -// FunctionTemplateDecl Implementation -//===----------------------------------------------------------------------===// - -FunctionTemplateDecl *FunctionTemplateDecl::Create(ASTContext &C, - DeclContext *DC, - SourceLocation L, - DeclarationName Name, - TemplateParameterList *Params, - NamedDecl *Decl) { - AdoptTemplateParameterList(Params, cast<DeclContext>(Decl)); - return new (C, DC) FunctionTemplateDecl(C, DC, L, Name, Params, Decl); -} - -FunctionTemplateDecl *FunctionTemplateDecl::CreateDeserialized(ASTContext &C, - unsigned ID) { - return new (C, ID) FunctionTemplateDecl(C, nullptr, SourceLocation(), - DeclarationName(), nullptr, nullptr); -} - -RedeclarableTemplateDecl::CommonBase * -FunctionTemplateDecl::newCommon(ASTContext &C) const { - auto *CommonPtr = new (C) Common; - C.addDestruction(CommonPtr); - return CommonPtr; -} - -void FunctionTemplateDecl::LoadLazySpecializations() const { - loadLazySpecializationsImpl(); -} - -llvm::FoldingSetVector<FunctionTemplateSpecializationInfo> & -FunctionTemplateDecl::getSpecializations() const { - LoadLazySpecializations(); - return getCommonPtr()->Specializations; -} - -FunctionDecl * -FunctionTemplateDecl::findSpecialization(ArrayRef<TemplateArgument> Args, - void *&InsertPos) { - return findSpecializationImpl(getSpecializations(), Args, InsertPos); -} - -void FunctionTemplateDecl::addSpecialization( - FunctionTemplateSpecializationInfo *Info, void *InsertPos) { - addSpecializationImpl<FunctionTemplateDecl>(getSpecializations(), Info, - InsertPos); -} - -ArrayRef<TemplateArgument> FunctionTemplateDecl::getInjectedTemplateArgs() { - TemplateParameterList *Params = getTemplateParameters(); - Common *CommonPtr = getCommonPtr(); - if (!CommonPtr->InjectedArgs) { - auto &Context = getASTContext(); - SmallVector<TemplateArgument, 16> TemplateArgs; - Context.getInjectedTemplateArgs(Params, TemplateArgs); - CommonPtr->InjectedArgs = - new (Context) TemplateArgument[TemplateArgs.size()]; - std::copy(TemplateArgs.begin(), TemplateArgs.end(), - CommonPtr->InjectedArgs); - } - - return llvm::makeArrayRef(CommonPtr->InjectedArgs, Params->size()); -} - -void FunctionTemplateDecl::mergePrevDecl(FunctionTemplateDecl *Prev) { - using Base = RedeclarableTemplateDecl; - - // If we haven't created a common pointer yet, then it can just be created - // with the usual method. - if (!Base::Common) - return; - - Common *ThisCommon = static_cast<Common *>(Base::Common); - Common *PrevCommon = nullptr; - SmallVector<FunctionTemplateDecl *, 8> PreviousDecls; - for (; Prev; Prev = Prev->getPreviousDecl()) { - if (Prev->Base::Common) { - PrevCommon = static_cast<Common *>(Prev->Base::Common); - break; - } - PreviousDecls.push_back(Prev); - } - - // If the previous redecl chain hasn't created a common pointer yet, then just - // use this common pointer. - if (!PrevCommon) { - for (auto *D : PreviousDecls) - D->Base::Common = ThisCommon; - return; - } - - // Ensure we don't leak any important state. - assert(ThisCommon->Specializations.size() == 0 && - "Can't merge incompatible declarations!"); - - Base::Common = PrevCommon; -} - -//===----------------------------------------------------------------------===// -// ClassTemplateDecl Implementation -//===----------------------------------------------------------------------===// - -ClassTemplateDecl *ClassTemplateDecl::Create(ASTContext &C, - DeclContext *DC, - SourceLocation L, - DeclarationName Name, - TemplateParameterList *Params, - NamedDecl *Decl, - Expr *AssociatedConstraints) { - AdoptTemplateParameterList(Params, cast<DeclContext>(Decl)); - - if (!AssociatedConstraints) { - return new (C, DC) ClassTemplateDecl(C, DC, L, Name, Params, Decl); - } - - auto *const CTDI = new (C) ConstrainedTemplateDeclInfo; - auto *const New = - new (C, DC) ClassTemplateDecl(CTDI, C, DC, L, Name, Params, Decl); - New->setAssociatedConstraints(AssociatedConstraints); - return New; -} - -ClassTemplateDecl *ClassTemplateDecl::CreateDeserialized(ASTContext &C, - unsigned ID) { - return new (C, ID) ClassTemplateDecl(C, nullptr, SourceLocation(), - DeclarationName(), nullptr, nullptr); -} - -void ClassTemplateDecl::LoadLazySpecializations() const { - loadLazySpecializationsImpl(); -} - -llvm::FoldingSetVector<ClassTemplateSpecializationDecl> & -ClassTemplateDecl::getSpecializations() const { - LoadLazySpecializations(); - return getCommonPtr()->Specializations; -} - -llvm::FoldingSetVector<ClassTemplatePartialSpecializationDecl> & -ClassTemplateDecl::getPartialSpecializations() { - LoadLazySpecializations(); - return getCommonPtr()->PartialSpecializations; -} - -RedeclarableTemplateDecl::CommonBase * -ClassTemplateDecl::newCommon(ASTContext &C) const { - auto *CommonPtr = new (C) Common; - C.addDestruction(CommonPtr); - return CommonPtr; -} - -ClassTemplateSpecializationDecl * -ClassTemplateDecl::findSpecialization(ArrayRef<TemplateArgument> Args, - void *&InsertPos) { - return findSpecializationImpl(getSpecializations(), Args, InsertPos); -} - -void ClassTemplateDecl::AddSpecialization(ClassTemplateSpecializationDecl *D, - void *InsertPos) { - addSpecializationImpl<ClassTemplateDecl>(getSpecializations(), D, InsertPos); -} - -ClassTemplatePartialSpecializationDecl * -ClassTemplateDecl::findPartialSpecialization(ArrayRef<TemplateArgument> Args, - void *&InsertPos) { - return findSpecializationImpl(getPartialSpecializations(), Args, InsertPos); -} - -void ClassTemplateDecl::AddPartialSpecialization( - ClassTemplatePartialSpecializationDecl *D, - void *InsertPos) { - if (InsertPos) - getPartialSpecializations().InsertNode(D, InsertPos); - else { - ClassTemplatePartialSpecializationDecl *Existing - = getPartialSpecializations().GetOrInsertNode(D); - (void)Existing; - assert(Existing->isCanonicalDecl() && "Non-canonical specialization?"); - } - - if (ASTMutationListener *L = getASTMutationListener()) - L->AddedCXXTemplateSpecialization(this, D); -} - -void ClassTemplateDecl::getPartialSpecializations( - SmallVectorImpl<ClassTemplatePartialSpecializationDecl *> &PS) { - llvm::FoldingSetVector<ClassTemplatePartialSpecializationDecl> &PartialSpecs - = getPartialSpecializations(); - PS.clear(); - PS.reserve(PartialSpecs.size()); - for (ClassTemplatePartialSpecializationDecl &P : PartialSpecs) - PS.push_back(P.getMostRecentDecl()); -} - -ClassTemplatePartialSpecializationDecl * -ClassTemplateDecl::findPartialSpecialization(QualType T) { - ASTContext &Context = getASTContext(); - for (ClassTemplatePartialSpecializationDecl &P : - getPartialSpecializations()) { - if (Context.hasSameType(P.getInjectedSpecializationType(), T)) - return P.getMostRecentDecl(); - } - - return nullptr; -} - -ClassTemplatePartialSpecializationDecl * -ClassTemplateDecl::findPartialSpecInstantiatedFromMember( - ClassTemplatePartialSpecializationDecl *D) { - Decl *DCanon = D->getCanonicalDecl(); - for (ClassTemplatePartialSpecializationDecl &P : getPartialSpecializations()) { - if (P.getInstantiatedFromMember()->getCanonicalDecl() == DCanon) - return P.getMostRecentDecl(); - } - - return nullptr; -} - -QualType -ClassTemplateDecl::getInjectedClassNameSpecialization() { - Common *CommonPtr = getCommonPtr(); - if (!CommonPtr->InjectedClassNameType.isNull()) - return CommonPtr->InjectedClassNameType; - - // C++0x [temp.dep.type]p2: - // The template argument list of a primary template is a template argument - // list in which the nth template argument has the value of the nth template - // parameter of the class template. If the nth template parameter is a - // template parameter pack (14.5.3), the nth template argument is a pack - // expansion (14.5.3) whose pattern is the name of the template parameter - // pack. - ASTContext &Context = getASTContext(); - TemplateParameterList *Params = getTemplateParameters(); - SmallVector<TemplateArgument, 16> TemplateArgs; - Context.getInjectedTemplateArgs(Params, TemplateArgs); - CommonPtr->InjectedClassNameType - = Context.getTemplateSpecializationType(TemplateName(this), - TemplateArgs); - return CommonPtr->InjectedClassNameType; -} - -//===----------------------------------------------------------------------===// -// TemplateTypeParm Allocation/Deallocation Method Implementations -//===----------------------------------------------------------------------===// - -TemplateTypeParmDecl * -TemplateTypeParmDecl::Create(const ASTContext &C, DeclContext *DC, - SourceLocation KeyLoc, SourceLocation NameLoc, - unsigned D, unsigned P, IdentifierInfo *Id, - bool Typename, bool ParameterPack) { - auto *TTPDecl = - new (C, DC) TemplateTypeParmDecl(DC, KeyLoc, NameLoc, Id, Typename); - QualType TTPType = C.getTemplateTypeParmType(D, P, ParameterPack, TTPDecl); - TTPDecl->setTypeForDecl(TTPType.getTypePtr()); - return TTPDecl; -} - -TemplateTypeParmDecl * -TemplateTypeParmDecl::CreateDeserialized(const ASTContext &C, unsigned ID) { - return new (C, ID) TemplateTypeParmDecl(nullptr, SourceLocation(), - SourceLocation(), nullptr, false); -} - -SourceLocation TemplateTypeParmDecl::getDefaultArgumentLoc() const { - return hasDefaultArgument() - ? getDefaultArgumentInfo()->getTypeLoc().getBeginLoc() - : SourceLocation(); -} - -SourceRange TemplateTypeParmDecl::getSourceRange() const { - if (hasDefaultArgument() && !defaultArgumentWasInherited()) - return SourceRange(getBeginLoc(), - getDefaultArgumentInfo()->getTypeLoc().getEndLoc()); - else - return TypeDecl::getSourceRange(); -} - -unsigned TemplateTypeParmDecl::getDepth() const { - return getTypeForDecl()->getAs<TemplateTypeParmType>()->getDepth(); -} - -unsigned TemplateTypeParmDecl::getIndex() const { - return getTypeForDecl()->getAs<TemplateTypeParmType>()->getIndex(); -} - -bool TemplateTypeParmDecl::isParameterPack() const { - return getTypeForDecl()->getAs<TemplateTypeParmType>()->isParameterPack(); -} - -//===----------------------------------------------------------------------===// -// NonTypeTemplateParmDecl Method Implementations -//===----------------------------------------------------------------------===// - -NonTypeTemplateParmDecl::NonTypeTemplateParmDecl( - DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, unsigned D, - unsigned P, IdentifierInfo *Id, QualType T, TypeSourceInfo *TInfo, - ArrayRef<QualType> ExpandedTypes, ArrayRef<TypeSourceInfo *> ExpandedTInfos) - : DeclaratorDecl(NonTypeTemplateParm, DC, IdLoc, Id, T, TInfo, StartLoc), - TemplateParmPosition(D, P), ParameterPack(true), - ExpandedParameterPack(true), NumExpandedTypes(ExpandedTypes.size()) { - if (!ExpandedTypes.empty() && !ExpandedTInfos.empty()) { - auto TypesAndInfos = - getTrailingObjects<std::pair<QualType, TypeSourceInfo *>>(); - for (unsigned I = 0; I != NumExpandedTypes; ++I) { - new (&TypesAndInfos[I].first) QualType(ExpandedTypes[I]); - TypesAndInfos[I].second = ExpandedTInfos[I]; - } - } -} - -NonTypeTemplateParmDecl * -NonTypeTemplateParmDecl::Create(const ASTContext &C, DeclContext *DC, - SourceLocation StartLoc, SourceLocation IdLoc, - unsigned D, unsigned P, IdentifierInfo *Id, - QualType T, bool ParameterPack, - TypeSourceInfo *TInfo) { - return new (C, DC) NonTypeTemplateParmDecl(DC, StartLoc, IdLoc, D, P, Id, - T, ParameterPack, TInfo); -} - -NonTypeTemplateParmDecl *NonTypeTemplateParmDecl::Create( - const ASTContext &C, DeclContext *DC, SourceLocation StartLoc, - SourceLocation IdLoc, unsigned D, unsigned P, IdentifierInfo *Id, - QualType T, TypeSourceInfo *TInfo, ArrayRef<QualType> ExpandedTypes, - ArrayRef<TypeSourceInfo *> ExpandedTInfos) { - return new (C, DC, - additionalSizeToAlloc<std::pair<QualType, TypeSourceInfo *>>( - ExpandedTypes.size())) - NonTypeTemplateParmDecl(DC, StartLoc, IdLoc, D, P, Id, T, TInfo, - ExpandedTypes, ExpandedTInfos); -} - -NonTypeTemplateParmDecl * -NonTypeTemplateParmDecl::CreateDeserialized(ASTContext &C, unsigned ID) { - return new (C, ID) NonTypeTemplateParmDecl(nullptr, SourceLocation(), - SourceLocation(), 0, 0, nullptr, - QualType(), false, nullptr); -} - -NonTypeTemplateParmDecl * -NonTypeTemplateParmDecl::CreateDeserialized(ASTContext &C, unsigned ID, - unsigned NumExpandedTypes) { - auto *NTTP = - new (C, ID, additionalSizeToAlloc<std::pair<QualType, TypeSourceInfo *>>( - NumExpandedTypes)) - NonTypeTemplateParmDecl(nullptr, SourceLocation(), SourceLocation(), - 0, 0, nullptr, QualType(), nullptr, None, - None); - NTTP->NumExpandedTypes = NumExpandedTypes; - return NTTP; -} - -SourceRange NonTypeTemplateParmDecl::getSourceRange() const { - if (hasDefaultArgument() && !defaultArgumentWasInherited()) - return SourceRange(getOuterLocStart(), - getDefaultArgument()->getSourceRange().getEnd()); - return DeclaratorDecl::getSourceRange(); -} - -SourceLocation NonTypeTemplateParmDecl::getDefaultArgumentLoc() const { - return hasDefaultArgument() - ? getDefaultArgument()->getSourceRange().getBegin() - : SourceLocation(); -} - -//===----------------------------------------------------------------------===// -// TemplateTemplateParmDecl Method Implementations -//===----------------------------------------------------------------------===// - -void TemplateTemplateParmDecl::anchor() {} - -TemplateTemplateParmDecl::TemplateTemplateParmDecl( - DeclContext *DC, SourceLocation L, unsigned D, unsigned P, - IdentifierInfo *Id, TemplateParameterList *Params, - ArrayRef<TemplateParameterList *> Expansions) - : TemplateDecl(TemplateTemplateParm, DC, L, Id, Params), - TemplateParmPosition(D, P), ParameterPack(true), - ExpandedParameterPack(true), NumExpandedParams(Expansions.size()) { - if (!Expansions.empty()) - std::uninitialized_copy(Expansions.begin(), Expansions.end(), - getTrailingObjects<TemplateParameterList *>()); -} - -TemplateTemplateParmDecl * -TemplateTemplateParmDecl::Create(const ASTContext &C, DeclContext *DC, - SourceLocation L, unsigned D, unsigned P, - bool ParameterPack, IdentifierInfo *Id, - TemplateParameterList *Params) { - return new (C, DC) TemplateTemplateParmDecl(DC, L, D, P, ParameterPack, Id, - Params); -} - -TemplateTemplateParmDecl * -TemplateTemplateParmDecl::Create(const ASTContext &C, DeclContext *DC, - SourceLocation L, unsigned D, unsigned P, - IdentifierInfo *Id, - TemplateParameterList *Params, - ArrayRef<TemplateParameterList *> Expansions) { - return new (C, DC, - additionalSizeToAlloc<TemplateParameterList *>(Expansions.size())) - TemplateTemplateParmDecl(DC, L, D, P, Id, Params, Expansions); -} - -TemplateTemplateParmDecl * -TemplateTemplateParmDecl::CreateDeserialized(ASTContext &C, unsigned ID) { - return new (C, ID) TemplateTemplateParmDecl(nullptr, SourceLocation(), 0, 0, - false, nullptr, nullptr); -} - -TemplateTemplateParmDecl * -TemplateTemplateParmDecl::CreateDeserialized(ASTContext &C, unsigned ID, - unsigned NumExpansions) { - auto *TTP = - new (C, ID, additionalSizeToAlloc<TemplateParameterList *>(NumExpansions)) - TemplateTemplateParmDecl(nullptr, SourceLocation(), 0, 0, nullptr, - nullptr, None); - TTP->NumExpandedParams = NumExpansions; - return TTP; -} - -SourceLocation TemplateTemplateParmDecl::getDefaultArgumentLoc() const { - return hasDefaultArgument() ? getDefaultArgument().getLocation() - : SourceLocation(); -} - -void TemplateTemplateParmDecl::setDefaultArgument( - const ASTContext &C, const TemplateArgumentLoc &DefArg) { - if (DefArg.getArgument().isNull()) - DefaultArgument.set(nullptr); - else - DefaultArgument.set(new (C) TemplateArgumentLoc(DefArg)); -} - -//===----------------------------------------------------------------------===// -// TemplateArgumentList Implementation -//===----------------------------------------------------------------------===// -TemplateArgumentList::TemplateArgumentList(ArrayRef<TemplateArgument> Args) - : Arguments(getTrailingObjects<TemplateArgument>()), - NumArguments(Args.size()) { - std::uninitialized_copy(Args.begin(), Args.end(), - getTrailingObjects<TemplateArgument>()); -} - -TemplateArgumentList * -TemplateArgumentList::CreateCopy(ASTContext &Context, - ArrayRef<TemplateArgument> Args) { - void *Mem = Context.Allocate(totalSizeToAlloc<TemplateArgument>(Args.size())); - return new (Mem) TemplateArgumentList(Args); -} - -FunctionTemplateSpecializationInfo * -FunctionTemplateSpecializationInfo::Create(ASTContext &C, FunctionDecl *FD, - FunctionTemplateDecl *Template, - TemplateSpecializationKind TSK, - const TemplateArgumentList *TemplateArgs, - const TemplateArgumentListInfo *TemplateArgsAsWritten, - SourceLocation POI) { - const ASTTemplateArgumentListInfo *ArgsAsWritten = nullptr; - if (TemplateArgsAsWritten) - ArgsAsWritten = ASTTemplateArgumentListInfo::Create(C, - *TemplateArgsAsWritten); - - return new (C) FunctionTemplateSpecializationInfo(FD, Template, TSK, - TemplateArgs, - ArgsAsWritten, - POI); -} - -//===----------------------------------------------------------------------===// -// TemplateDecl Implementation -//===----------------------------------------------------------------------===// - -void TemplateDecl::anchor() {} - -//===----------------------------------------------------------------------===// -// ClassTemplateSpecializationDecl Implementation -//===----------------------------------------------------------------------===// - -ClassTemplateSpecializationDecl:: -ClassTemplateSpecializationDecl(ASTContext &Context, Kind DK, TagKind TK, - DeclContext *DC, SourceLocation StartLoc, - SourceLocation IdLoc, - ClassTemplateDecl *SpecializedTemplate, - ArrayRef<TemplateArgument> Args, - ClassTemplateSpecializationDecl *PrevDecl) - : CXXRecordDecl(DK, TK, Context, DC, StartLoc, IdLoc, - SpecializedTemplate->getIdentifier(), PrevDecl), - SpecializedTemplate(SpecializedTemplate), - TemplateArgs(TemplateArgumentList::CreateCopy(Context, Args)), - SpecializationKind(TSK_Undeclared) { -} - -ClassTemplateSpecializationDecl::ClassTemplateSpecializationDecl(ASTContext &C, - Kind DK) - : CXXRecordDecl(DK, TTK_Struct, C, nullptr, SourceLocation(), - SourceLocation(), nullptr, nullptr), - SpecializationKind(TSK_Undeclared) {} - -ClassTemplateSpecializationDecl * -ClassTemplateSpecializationDecl::Create(ASTContext &Context, TagKind TK, - DeclContext *DC, - SourceLocation StartLoc, - SourceLocation IdLoc, - ClassTemplateDecl *SpecializedTemplate, - ArrayRef<TemplateArgument> Args, - ClassTemplateSpecializationDecl *PrevDecl) { - auto *Result = - new (Context, DC) ClassTemplateSpecializationDecl( - Context, ClassTemplateSpecialization, TK, DC, StartLoc, IdLoc, - SpecializedTemplate, Args, PrevDecl); - Result->setMayHaveOutOfDateDef(false); - - Context.getTypeDeclType(Result, PrevDecl); - return Result; -} - -ClassTemplateSpecializationDecl * -ClassTemplateSpecializationDecl::CreateDeserialized(ASTContext &C, - unsigned ID) { - auto *Result = - new (C, ID) ClassTemplateSpecializationDecl(C, ClassTemplateSpecialization); - Result->setMayHaveOutOfDateDef(false); - return Result; -} - -void ClassTemplateSpecializationDecl::getNameForDiagnostic( - raw_ostream &OS, const PrintingPolicy &Policy, bool Qualified) const { - NamedDecl::getNameForDiagnostic(OS, Policy, Qualified); - - const auto *PS = dyn_cast<ClassTemplatePartialSpecializationDecl>(this); - if (const ASTTemplateArgumentListInfo *ArgsAsWritten = - PS ? PS->getTemplateArgsAsWritten() : nullptr) { - printTemplateArgumentList(OS, ArgsAsWritten->arguments(), Policy); - } else { - const TemplateArgumentList &TemplateArgs = getTemplateArgs(); - printTemplateArgumentList(OS, TemplateArgs.asArray(), Policy); - } -} - -ClassTemplateDecl * -ClassTemplateSpecializationDecl::getSpecializedTemplate() const { - if (const auto *PartialSpec = - SpecializedTemplate.dyn_cast<SpecializedPartialSpecialization*>()) - return PartialSpec->PartialSpecialization->getSpecializedTemplate(); - return SpecializedTemplate.get<ClassTemplateDecl*>(); -} - -SourceRange -ClassTemplateSpecializationDecl::getSourceRange() const { - if (ExplicitInfo) { - SourceLocation Begin = getTemplateKeywordLoc(); - if (Begin.isValid()) { - // Here we have an explicit (partial) specialization or instantiation. - assert(getSpecializationKind() == TSK_ExplicitSpecialization || - getSpecializationKind() == TSK_ExplicitInstantiationDeclaration || - getSpecializationKind() == TSK_ExplicitInstantiationDefinition); - if (getExternLoc().isValid()) - Begin = getExternLoc(); - SourceLocation End = getBraceRange().getEnd(); - if (End.isInvalid()) - End = getTypeAsWritten()->getTypeLoc().getEndLoc(); - return SourceRange(Begin, End); - } - // An implicit instantiation of a class template partial specialization - // uses ExplicitInfo to record the TypeAsWritten, but the source - // locations should be retrieved from the instantiation pattern. - using CTPSDecl = ClassTemplatePartialSpecializationDecl; - auto *ctpsd = const_cast<CTPSDecl *>(cast<CTPSDecl>(this)); - CTPSDecl *inst_from = ctpsd->getInstantiatedFromMember(); - assert(inst_from != nullptr); - return inst_from->getSourceRange(); - } - else { - // No explicit info available. - llvm::PointerUnion<ClassTemplateDecl *, - ClassTemplatePartialSpecializationDecl *> - inst_from = getInstantiatedFrom(); - if (inst_from.isNull()) - return getSpecializedTemplate()->getSourceRange(); - if (const auto *ctd = inst_from.dyn_cast<ClassTemplateDecl *>()) - return ctd->getSourceRange(); - return inst_from.get<ClassTemplatePartialSpecializationDecl *>() - ->getSourceRange(); - } -} - -//===----------------------------------------------------------------------===// -// ClassTemplatePartialSpecializationDecl Implementation -//===----------------------------------------------------------------------===// -void ClassTemplatePartialSpecializationDecl::anchor() {} - -ClassTemplatePartialSpecializationDecl:: -ClassTemplatePartialSpecializationDecl(ASTContext &Context, TagKind TK, - DeclContext *DC, - SourceLocation StartLoc, - SourceLocation IdLoc, - TemplateParameterList *Params, - ClassTemplateDecl *SpecializedTemplate, - ArrayRef<TemplateArgument> Args, - const ASTTemplateArgumentListInfo *ArgInfos, - ClassTemplatePartialSpecializationDecl *PrevDecl) - : ClassTemplateSpecializationDecl(Context, - ClassTemplatePartialSpecialization, - TK, DC, StartLoc, IdLoc, - SpecializedTemplate, Args, PrevDecl), - TemplateParams(Params), ArgsAsWritten(ArgInfos), - InstantiatedFromMember(nullptr, false) { - AdoptTemplateParameterList(Params, this); -} - -ClassTemplatePartialSpecializationDecl * -ClassTemplatePartialSpecializationDecl:: -Create(ASTContext &Context, TagKind TK,DeclContext *DC, - SourceLocation StartLoc, SourceLocation IdLoc, - TemplateParameterList *Params, - ClassTemplateDecl *SpecializedTemplate, - ArrayRef<TemplateArgument> Args, - const TemplateArgumentListInfo &ArgInfos, - QualType CanonInjectedType, - ClassTemplatePartialSpecializationDecl *PrevDecl) { - const ASTTemplateArgumentListInfo *ASTArgInfos = - ASTTemplateArgumentListInfo::Create(Context, ArgInfos); - - auto *Result = new (Context, DC) - ClassTemplatePartialSpecializationDecl(Context, TK, DC, StartLoc, IdLoc, - Params, SpecializedTemplate, Args, - ASTArgInfos, PrevDecl); - Result->setSpecializationKind(TSK_ExplicitSpecialization); - Result->setMayHaveOutOfDateDef(false); - - Context.getInjectedClassNameType(Result, CanonInjectedType); - return Result; -} - -ClassTemplatePartialSpecializationDecl * -ClassTemplatePartialSpecializationDecl::CreateDeserialized(ASTContext &C, - unsigned ID) { - auto *Result = new (C, ID) ClassTemplatePartialSpecializationDecl(C); - Result->setMayHaveOutOfDateDef(false); - return Result; -} - -//===----------------------------------------------------------------------===// -// FriendTemplateDecl Implementation -//===----------------------------------------------------------------------===// - -void FriendTemplateDecl::anchor() {} - -FriendTemplateDecl * -FriendTemplateDecl::Create(ASTContext &Context, DeclContext *DC, - SourceLocation L, - MutableArrayRef<TemplateParameterList *> Params, - FriendUnion Friend, SourceLocation FLoc) { - return new (Context, DC) FriendTemplateDecl(DC, L, Params, Friend, FLoc); -} - -FriendTemplateDecl *FriendTemplateDecl::CreateDeserialized(ASTContext &C, - unsigned ID) { - return new (C, ID) FriendTemplateDecl(EmptyShell()); -} - -//===----------------------------------------------------------------------===// -// TypeAliasTemplateDecl Implementation -//===----------------------------------------------------------------------===// - -TypeAliasTemplateDecl *TypeAliasTemplateDecl::Create(ASTContext &C, - DeclContext *DC, - SourceLocation L, - DeclarationName Name, - TemplateParameterList *Params, - NamedDecl *Decl) { - AdoptTemplateParameterList(Params, DC); - return new (C, DC) TypeAliasTemplateDecl(C, DC, L, Name, Params, Decl); -} - -TypeAliasTemplateDecl *TypeAliasTemplateDecl::CreateDeserialized(ASTContext &C, - unsigned ID) { - return new (C, ID) TypeAliasTemplateDecl(C, nullptr, SourceLocation(), - DeclarationName(), nullptr, nullptr); -} - -RedeclarableTemplateDecl::CommonBase * -TypeAliasTemplateDecl::newCommon(ASTContext &C) const { - auto *CommonPtr = new (C) Common; - C.addDestruction(CommonPtr); - return CommonPtr; -} - -//===----------------------------------------------------------------------===// -// ClassScopeFunctionSpecializationDecl Implementation -//===----------------------------------------------------------------------===// - -void ClassScopeFunctionSpecializationDecl::anchor() {} - -ClassScopeFunctionSpecializationDecl * -ClassScopeFunctionSpecializationDecl::CreateDeserialized(ASTContext &C, - unsigned ID) { - return new (C, ID) ClassScopeFunctionSpecializationDecl( - nullptr, SourceLocation(), nullptr, false, TemplateArgumentListInfo()); -} - -//===----------------------------------------------------------------------===// -// VarTemplateDecl Implementation -//===----------------------------------------------------------------------===// - -VarTemplateDecl *VarTemplateDecl::getDefinition() { - VarTemplateDecl *CurD = this; - while (CurD) { - if (CurD->isThisDeclarationADefinition()) - return CurD; - CurD = CurD->getPreviousDecl(); - } - return nullptr; -} - -VarTemplateDecl *VarTemplateDecl::Create(ASTContext &C, DeclContext *DC, - SourceLocation L, DeclarationName Name, - TemplateParameterList *Params, - VarDecl *Decl) { - return new (C, DC) VarTemplateDecl(C, DC, L, Name, Params, Decl); -} - -VarTemplateDecl *VarTemplateDecl::CreateDeserialized(ASTContext &C, - unsigned ID) { - return new (C, ID) VarTemplateDecl(C, nullptr, SourceLocation(), - DeclarationName(), nullptr, nullptr); -} - -void VarTemplateDecl::LoadLazySpecializations() const { - loadLazySpecializationsImpl(); -} - -llvm::FoldingSetVector<VarTemplateSpecializationDecl> & -VarTemplateDecl::getSpecializations() const { - LoadLazySpecializations(); - return getCommonPtr()->Specializations; -} - -llvm::FoldingSetVector<VarTemplatePartialSpecializationDecl> & -VarTemplateDecl::getPartialSpecializations() { - LoadLazySpecializations(); - return getCommonPtr()->PartialSpecializations; -} - -RedeclarableTemplateDecl::CommonBase * -VarTemplateDecl::newCommon(ASTContext &C) const { - auto *CommonPtr = new (C) Common; - C.addDestruction(CommonPtr); - return CommonPtr; -} - -VarTemplateSpecializationDecl * -VarTemplateDecl::findSpecialization(ArrayRef<TemplateArgument> Args, - void *&InsertPos) { - return findSpecializationImpl(getSpecializations(), Args, InsertPos); -} - -void VarTemplateDecl::AddSpecialization(VarTemplateSpecializationDecl *D, - void *InsertPos) { - addSpecializationImpl<VarTemplateDecl>(getSpecializations(), D, InsertPos); -} - -VarTemplatePartialSpecializationDecl * -VarTemplateDecl::findPartialSpecialization(ArrayRef<TemplateArgument> Args, - void *&InsertPos) { - return findSpecializationImpl(getPartialSpecializations(), Args, InsertPos); -} - -void VarTemplateDecl::AddPartialSpecialization( - VarTemplatePartialSpecializationDecl *D, void *InsertPos) { - if (InsertPos) - getPartialSpecializations().InsertNode(D, InsertPos); - else { - VarTemplatePartialSpecializationDecl *Existing = - getPartialSpecializations().GetOrInsertNode(D); - (void)Existing; - assert(Existing->isCanonicalDecl() && "Non-canonical specialization?"); - } - - if (ASTMutationListener *L = getASTMutationListener()) - L->AddedCXXTemplateSpecialization(this, D); -} - -void VarTemplateDecl::getPartialSpecializations( - SmallVectorImpl<VarTemplatePartialSpecializationDecl *> &PS) { - llvm::FoldingSetVector<VarTemplatePartialSpecializationDecl> &PartialSpecs = - getPartialSpecializations(); - PS.clear(); - PS.reserve(PartialSpecs.size()); - for (VarTemplatePartialSpecializationDecl &P : PartialSpecs) - PS.push_back(P.getMostRecentDecl()); -} - -VarTemplatePartialSpecializationDecl * -VarTemplateDecl::findPartialSpecInstantiatedFromMember( - VarTemplatePartialSpecializationDecl *D) { - Decl *DCanon = D->getCanonicalDecl(); - for (VarTemplatePartialSpecializationDecl &P : getPartialSpecializations()) { - if (P.getInstantiatedFromMember()->getCanonicalDecl() == DCanon) - return P.getMostRecentDecl(); - } - - return nullptr; -} - -//===----------------------------------------------------------------------===// -// VarTemplateSpecializationDecl Implementation -//===----------------------------------------------------------------------===// - -VarTemplateSpecializationDecl::VarTemplateSpecializationDecl( - Kind DK, ASTContext &Context, DeclContext *DC, SourceLocation StartLoc, - SourceLocation IdLoc, VarTemplateDecl *SpecializedTemplate, QualType T, - TypeSourceInfo *TInfo, StorageClass S, ArrayRef<TemplateArgument> Args) - : VarDecl(DK, Context, DC, StartLoc, IdLoc, - SpecializedTemplate->getIdentifier(), T, TInfo, S), - SpecializedTemplate(SpecializedTemplate), - TemplateArgs(TemplateArgumentList::CreateCopy(Context, Args)), - SpecializationKind(TSK_Undeclared), IsCompleteDefinition(false) {} - -VarTemplateSpecializationDecl::VarTemplateSpecializationDecl(Kind DK, - ASTContext &C) - : VarDecl(DK, C, nullptr, SourceLocation(), SourceLocation(), nullptr, - QualType(), nullptr, SC_None), - SpecializationKind(TSK_Undeclared), IsCompleteDefinition(false) {} - -VarTemplateSpecializationDecl *VarTemplateSpecializationDecl::Create( - ASTContext &Context, DeclContext *DC, SourceLocation StartLoc, - SourceLocation IdLoc, VarTemplateDecl *SpecializedTemplate, QualType T, - TypeSourceInfo *TInfo, StorageClass S, ArrayRef<TemplateArgument> Args) { - return new (Context, DC) VarTemplateSpecializationDecl( - VarTemplateSpecialization, Context, DC, StartLoc, IdLoc, - SpecializedTemplate, T, TInfo, S, Args); -} - -VarTemplateSpecializationDecl * -VarTemplateSpecializationDecl::CreateDeserialized(ASTContext &C, unsigned ID) { - return new (C, ID) - VarTemplateSpecializationDecl(VarTemplateSpecialization, C); -} - -void VarTemplateSpecializationDecl::getNameForDiagnostic( - raw_ostream &OS, const PrintingPolicy &Policy, bool Qualified) const { - NamedDecl::getNameForDiagnostic(OS, Policy, Qualified); - - const auto *PS = dyn_cast<VarTemplatePartialSpecializationDecl>(this); - if (const ASTTemplateArgumentListInfo *ArgsAsWritten = - PS ? PS->getTemplateArgsAsWritten() : nullptr) { - printTemplateArgumentList(OS, ArgsAsWritten->arguments(), Policy); - } else { - const TemplateArgumentList &TemplateArgs = getTemplateArgs(); - printTemplateArgumentList(OS, TemplateArgs.asArray(), Policy); - } -} - -VarTemplateDecl *VarTemplateSpecializationDecl::getSpecializedTemplate() const { - if (const auto *PartialSpec = - SpecializedTemplate.dyn_cast<SpecializedPartialSpecialization *>()) - return PartialSpec->PartialSpecialization->getSpecializedTemplate(); - return SpecializedTemplate.get<VarTemplateDecl *>(); -} - -void VarTemplateSpecializationDecl::setTemplateArgsInfo( - const TemplateArgumentListInfo &ArgsInfo) { - TemplateArgsInfo.setLAngleLoc(ArgsInfo.getLAngleLoc()); - TemplateArgsInfo.setRAngleLoc(ArgsInfo.getRAngleLoc()); - for (const TemplateArgumentLoc &Loc : ArgsInfo.arguments()) - TemplateArgsInfo.addArgument(Loc); -} - -//===----------------------------------------------------------------------===// -// VarTemplatePartialSpecializationDecl Implementation -//===----------------------------------------------------------------------===// - -void VarTemplatePartialSpecializationDecl::anchor() {} - -VarTemplatePartialSpecializationDecl::VarTemplatePartialSpecializationDecl( - ASTContext &Context, DeclContext *DC, SourceLocation StartLoc, - SourceLocation IdLoc, TemplateParameterList *Params, - VarTemplateDecl *SpecializedTemplate, QualType T, TypeSourceInfo *TInfo, - StorageClass S, ArrayRef<TemplateArgument> Args, - const ASTTemplateArgumentListInfo *ArgInfos) - : VarTemplateSpecializationDecl(VarTemplatePartialSpecialization, Context, - DC, StartLoc, IdLoc, SpecializedTemplate, T, - TInfo, S, Args), - TemplateParams(Params), ArgsAsWritten(ArgInfos), - InstantiatedFromMember(nullptr, false) { - // TODO: The template parameters should be in DC by now. Verify. - // AdoptTemplateParameterList(Params, DC); -} - -VarTemplatePartialSpecializationDecl * -VarTemplatePartialSpecializationDecl::Create( - ASTContext &Context, DeclContext *DC, SourceLocation StartLoc, - SourceLocation IdLoc, TemplateParameterList *Params, - VarTemplateDecl *SpecializedTemplate, QualType T, TypeSourceInfo *TInfo, - StorageClass S, ArrayRef<TemplateArgument> Args, - const TemplateArgumentListInfo &ArgInfos) { - const ASTTemplateArgumentListInfo *ASTArgInfos - = ASTTemplateArgumentListInfo::Create(Context, ArgInfos); - - auto *Result = - new (Context, DC) VarTemplatePartialSpecializationDecl( - Context, DC, StartLoc, IdLoc, Params, SpecializedTemplate, T, TInfo, - S, Args, ASTArgInfos); - Result->setSpecializationKind(TSK_ExplicitSpecialization); - return Result; -} - -VarTemplatePartialSpecializationDecl * -VarTemplatePartialSpecializationDecl::CreateDeserialized(ASTContext &C, - unsigned ID) { - return new (C, ID) VarTemplatePartialSpecializationDecl(C); -} - -static TemplateParameterList * -createMakeIntegerSeqParameterList(const ASTContext &C, DeclContext *DC) { - // typename T - auto *T = TemplateTypeParmDecl::Create( - C, DC, SourceLocation(), SourceLocation(), /*Depth=*/1, /*Position=*/0, - /*Id=*/nullptr, /*Typename=*/true, /*ParameterPack=*/false); - T->setImplicit(true); - - // T ...Ints - TypeSourceInfo *TI = - C.getTrivialTypeSourceInfo(QualType(T->getTypeForDecl(), 0)); - auto *N = NonTypeTemplateParmDecl::Create( - C, DC, SourceLocation(), SourceLocation(), /*Depth=*/0, /*Position=*/1, - /*Id=*/nullptr, TI->getType(), /*ParameterPack=*/true, TI); - N->setImplicit(true); - - // <typename T, T ...Ints> - NamedDecl *P[2] = {T, N}; - auto *TPL = TemplateParameterList::Create( - C, SourceLocation(), SourceLocation(), P, SourceLocation(), nullptr); - - // template <typename T, ...Ints> class IntSeq - auto *TemplateTemplateParm = TemplateTemplateParmDecl::Create( - C, DC, SourceLocation(), /*Depth=*/0, /*Position=*/0, - /*ParameterPack=*/false, /*Id=*/nullptr, TPL); - TemplateTemplateParm->setImplicit(true); - - // typename T - auto *TemplateTypeParm = TemplateTypeParmDecl::Create( - C, DC, SourceLocation(), SourceLocation(), /*Depth=*/0, /*Position=*/1, - /*Id=*/nullptr, /*Typename=*/true, /*ParameterPack=*/false); - TemplateTypeParm->setImplicit(true); - - // T N - TypeSourceInfo *TInfo = C.getTrivialTypeSourceInfo( - QualType(TemplateTypeParm->getTypeForDecl(), 0)); - auto *NonTypeTemplateParm = NonTypeTemplateParmDecl::Create( - C, DC, SourceLocation(), SourceLocation(), /*Depth=*/0, /*Position=*/2, - /*Id=*/nullptr, TInfo->getType(), /*ParameterPack=*/false, TInfo); - NamedDecl *Params[] = {TemplateTemplateParm, TemplateTypeParm, - NonTypeTemplateParm}; - - // template <template <typename T, T ...Ints> class IntSeq, typename T, T N> - return TemplateParameterList::Create(C, SourceLocation(), SourceLocation(), - Params, SourceLocation(), nullptr); -} - -static TemplateParameterList * -createTypePackElementParameterList(const ASTContext &C, DeclContext *DC) { - // std::size_t Index - TypeSourceInfo *TInfo = C.getTrivialTypeSourceInfo(C.getSizeType()); - auto *Index = NonTypeTemplateParmDecl::Create( - C, DC, SourceLocation(), SourceLocation(), /*Depth=*/0, /*Position=*/0, - /*Id=*/nullptr, TInfo->getType(), /*ParameterPack=*/false, TInfo); - - // typename ...T - auto *Ts = TemplateTypeParmDecl::Create( - C, DC, SourceLocation(), SourceLocation(), /*Depth=*/0, /*Position=*/1, - /*Id=*/nullptr, /*Typename=*/true, /*ParameterPack=*/true); - Ts->setImplicit(true); - - // template <std::size_t Index, typename ...T> - NamedDecl *Params[] = {Index, Ts}; - return TemplateParameterList::Create(C, SourceLocation(), SourceLocation(), - llvm::makeArrayRef(Params), - SourceLocation(), nullptr); -} - -static TemplateParameterList *createBuiltinTemplateParameterList( - const ASTContext &C, DeclContext *DC, BuiltinTemplateKind BTK) { - switch (BTK) { - case BTK__make_integer_seq: - return createMakeIntegerSeqParameterList(C, DC); - case BTK__type_pack_element: - return createTypePackElementParameterList(C, DC); - } - - llvm_unreachable("unhandled BuiltinTemplateKind!"); -} - -void BuiltinTemplateDecl::anchor() {} - -BuiltinTemplateDecl::BuiltinTemplateDecl(const ASTContext &C, DeclContext *DC, - DeclarationName Name, - BuiltinTemplateKind BTK) - : TemplateDecl(BuiltinTemplate, DC, SourceLocation(), Name, - createBuiltinTemplateParameterList(C, DC, BTK)), - BTK(BTK) {} |
