1 //===- DeclTemplate.cpp - Template Declaration AST Node Implementation ----===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file implements the C++ related Decl classes for templates.
12 //===----------------------------------------------------------------------===//
14 #include "clang/AST/DeclTemplate.h"
15 #include "clang/AST/ASTContext.h"
16 #include "clang/AST/ASTMutationListener.h"
17 #include "clang/AST/DeclCXX.h"
18 #include "clang/AST/DeclarationName.h"
19 #include "clang/AST/Expr.h"
20 #include "clang/AST/TemplateBase.h"
21 #include "clang/AST/TemplateName.h"
22 #include "clang/AST/Type.h"
23 #include "clang/AST/TypeLoc.h"
24 #include "clang/Basic/Builtins.h"
25 #include "clang/Basic/LLVM.h"
26 #include "clang/Basic/SourceLocation.h"
27 #include "llvm/ADT/ArrayRef.h"
28 #include "llvm/ADT/FoldingSet.h"
29 #include "llvm/ADT/None.h"
30 #include "llvm/ADT/PointerUnion.h"
31 #include "llvm/ADT/SmallVector.h"
32 #include "llvm/Support/Casting.h"
33 #include "llvm/Support/ErrorHandling.h"
40 using namespace clang;
42 //===----------------------------------------------------------------------===//
43 // TemplateParameterList Implementation
44 //===----------------------------------------------------------------------===//
46 TemplateParameterList::TemplateParameterList(SourceLocation TemplateLoc,
47 SourceLocation LAngleLoc,
48 ArrayRef<NamedDecl *> Params,
49 SourceLocation RAngleLoc,
51 : TemplateLoc(TemplateLoc), LAngleLoc(LAngleLoc), RAngleLoc(RAngleLoc),
52 NumParams(Params.size()), ContainsUnexpandedParameterPack(false),
53 HasRequiresClause(static_cast<bool>(RequiresClause)) {
54 for (unsigned Idx = 0; Idx < NumParams; ++Idx) {
55 NamedDecl *P = Params[Idx];
58 if (!P->isTemplateParameterPack()) {
59 if (NonTypeTemplateParmDecl *NTTP = dyn_cast<NonTypeTemplateParmDecl>(P))
60 if (NTTP->getType()->containsUnexpandedParameterPack())
61 ContainsUnexpandedParameterPack = true;
63 if (TemplateTemplateParmDecl *TTP = dyn_cast<TemplateTemplateParmDecl>(P))
64 if (TTP->getTemplateParameters()->containsUnexpandedParameterPack())
65 ContainsUnexpandedParameterPack = true;
67 // FIXME: If a default argument contains an unexpanded parameter pack, the
68 // template parameter list does too.
72 *getTrailingObjects<Expr *>() = RequiresClause;
76 TemplateParameterList *
77 TemplateParameterList::Create(const ASTContext &C, SourceLocation TemplateLoc,
78 SourceLocation LAngleLoc,
79 ArrayRef<NamedDecl *> Params,
80 SourceLocation RAngleLoc, Expr *RequiresClause) {
81 void *Mem = C.Allocate(totalSizeToAlloc<NamedDecl *, Expr *>(
82 Params.size(), RequiresClause ? 1u : 0u),
83 alignof(TemplateParameterList));
84 return new (Mem) TemplateParameterList(TemplateLoc, LAngleLoc, Params,
85 RAngleLoc, RequiresClause);
88 unsigned TemplateParameterList::getMinRequiredArguments() const {
89 unsigned NumRequiredArgs = 0;
90 for (const NamedDecl *P : asArray()) {
91 if (P->isTemplateParameterPack()) {
92 if (const auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(P))
93 if (NTTP->isExpandedParameterPack()) {
94 NumRequiredArgs += NTTP->getNumExpansionTypes();
101 if (const auto *TTP = dyn_cast<TemplateTypeParmDecl>(P)) {
102 if (TTP->hasDefaultArgument())
104 } else if (const auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(P)) {
105 if (NTTP->hasDefaultArgument())
107 } else if (cast<TemplateTemplateParmDecl>(P)->hasDefaultArgument())
113 return NumRequiredArgs;
116 unsigned TemplateParameterList::getDepth() const {
120 const NamedDecl *FirstParm = getParam(0);
121 if (const TemplateTypeParmDecl *TTP
122 = dyn_cast<TemplateTypeParmDecl>(FirstParm))
123 return TTP->getDepth();
124 else if (const NonTypeTemplateParmDecl *NTTP
125 = dyn_cast<NonTypeTemplateParmDecl>(FirstParm))
126 return NTTP->getDepth();
128 return cast<TemplateTemplateParmDecl>(FirstParm)->getDepth();
131 static void AdoptTemplateParameterList(TemplateParameterList *Params,
132 DeclContext *Owner) {
133 for (NamedDecl *P : *Params) {
134 P->setDeclContext(Owner);
136 if (auto *TTP = dyn_cast<TemplateTemplateParmDecl>(P))
137 AdoptTemplateParameterList(TTP->getTemplateParameters(), Owner);
143 void *allocateDefaultArgStorageChain(const ASTContext &C) {
144 return new (C) char[sizeof(void*) * 2];
149 //===----------------------------------------------------------------------===//
150 // RedeclarableTemplateDecl Implementation
151 //===----------------------------------------------------------------------===//
153 RedeclarableTemplateDecl::CommonBase *RedeclarableTemplateDecl::getCommonPtr() const {
157 // Walk the previous-declaration chain until we either find a declaration
158 // with a common pointer or we run out of previous declarations.
159 SmallVector<const RedeclarableTemplateDecl *, 2> PrevDecls;
160 for (const RedeclarableTemplateDecl *Prev = getPreviousDecl(); Prev;
161 Prev = Prev->getPreviousDecl()) {
163 Common = Prev->Common;
167 PrevDecls.push_back(Prev);
170 // If we never found a common pointer, allocate one now.
172 // FIXME: If any of the declarations is from an AST file, we probably
173 // need an update record to add the common data.
175 Common = newCommon(getASTContext());
178 // Update any previous declarations we saw with the common pointer.
179 for (const RedeclarableTemplateDecl *Prev : PrevDecls)
180 Prev->Common = Common;
185 void RedeclarableTemplateDecl::loadLazySpecializationsImpl() const {
186 // Grab the most recent declaration to ensure we've loaded any lazy
187 // redeclarations of this template.
188 CommonBase *CommonBasePtr = getMostRecentDecl()->getCommonPtr();
189 if (CommonBasePtr->LazySpecializations) {
190 ASTContext &Context = getASTContext();
191 uint32_t *Specs = CommonBasePtr->LazySpecializations;
192 CommonBasePtr->LazySpecializations = nullptr;
193 for (uint32_t I = 0, N = *Specs++; I != N; ++I)
194 (void)Context.getExternalSource()->GetExternalDecl(Specs[I]);
198 template<class EntryType>
199 typename RedeclarableTemplateDecl::SpecEntryTraits<EntryType>::DeclType *
200 RedeclarableTemplateDecl::findSpecializationImpl(
201 llvm::FoldingSetVector<EntryType> &Specs, ArrayRef<TemplateArgument> Args,
203 using SETraits = SpecEntryTraits<EntryType>;
205 llvm::FoldingSetNodeID ID;
206 EntryType::Profile(ID, Args, getASTContext());
207 EntryType *Entry = Specs.FindNodeOrInsertPos(ID, InsertPos);
208 return Entry ? SETraits::getDecl(Entry)->getMostRecentDecl() : nullptr;
211 template<class Derived, class EntryType>
212 void RedeclarableTemplateDecl::addSpecializationImpl(
213 llvm::FoldingSetVector<EntryType> &Specializations, EntryType *Entry,
215 using SETraits = SpecEntryTraits<EntryType>;
219 void *CorrectInsertPos;
220 assert(!findSpecializationImpl(Specializations,
221 SETraits::getTemplateArgs(Entry),
223 InsertPos == CorrectInsertPos &&
224 "given incorrect InsertPos for specialization");
226 Specializations.InsertNode(Entry, InsertPos);
228 EntryType *Existing = Specializations.GetOrInsertNode(Entry);
230 assert(SETraits::getDecl(Existing)->isCanonicalDecl() &&
231 "non-canonical specialization?");
234 if (ASTMutationListener *L = getASTMutationListener())
235 L->AddedCXXTemplateSpecialization(cast<Derived>(this),
236 SETraits::getDecl(Entry));
239 //===----------------------------------------------------------------------===//
240 // FunctionTemplateDecl Implementation
241 //===----------------------------------------------------------------------===//
243 FunctionTemplateDecl *FunctionTemplateDecl::Create(ASTContext &C,
246 DeclarationName Name,
247 TemplateParameterList *Params,
249 AdoptTemplateParameterList(Params, cast<DeclContext>(Decl));
250 return new (C, DC) FunctionTemplateDecl(C, DC, L, Name, Params, Decl);
253 FunctionTemplateDecl *FunctionTemplateDecl::CreateDeserialized(ASTContext &C,
255 return new (C, ID) FunctionTemplateDecl(C, nullptr, SourceLocation(),
256 DeclarationName(), nullptr, nullptr);
259 RedeclarableTemplateDecl::CommonBase *
260 FunctionTemplateDecl::newCommon(ASTContext &C) const {
261 Common *CommonPtr = new (C) Common;
262 C.addDestruction(CommonPtr);
266 void FunctionTemplateDecl::LoadLazySpecializations() const {
267 loadLazySpecializationsImpl();
270 llvm::FoldingSetVector<FunctionTemplateSpecializationInfo> &
271 FunctionTemplateDecl::getSpecializations() const {
272 LoadLazySpecializations();
273 return getCommonPtr()->Specializations;
277 FunctionTemplateDecl::findSpecialization(ArrayRef<TemplateArgument> Args,
279 return findSpecializationImpl(getSpecializations(), Args, InsertPos);
282 void FunctionTemplateDecl::addSpecialization(
283 FunctionTemplateSpecializationInfo *Info, void *InsertPos) {
284 addSpecializationImpl<FunctionTemplateDecl>(getSpecializations(), Info,
288 ArrayRef<TemplateArgument> FunctionTemplateDecl::getInjectedTemplateArgs() {
289 TemplateParameterList *Params = getTemplateParameters();
290 Common *CommonPtr = getCommonPtr();
291 if (!CommonPtr->InjectedArgs) {
292 auto &Context = getASTContext();
293 SmallVector<TemplateArgument, 16> TemplateArgs;
294 Context.getInjectedTemplateArgs(Params, TemplateArgs);
295 CommonPtr->InjectedArgs =
296 new (Context) TemplateArgument[TemplateArgs.size()];
297 std::copy(TemplateArgs.begin(), TemplateArgs.end(),
298 CommonPtr->InjectedArgs);
301 return llvm::makeArrayRef(CommonPtr->InjectedArgs, Params->size());
304 //===----------------------------------------------------------------------===//
305 // ClassTemplateDecl Implementation
306 //===----------------------------------------------------------------------===//
308 ClassTemplateDecl *ClassTemplateDecl::Create(ASTContext &C,
311 DeclarationName Name,
312 TemplateParameterList *Params,
314 Expr *AssociatedConstraints) {
315 AdoptTemplateParameterList(Params, cast<DeclContext>(Decl));
317 if (!AssociatedConstraints) {
318 return new (C, DC) ClassTemplateDecl(C, DC, L, Name, Params, Decl);
321 ConstrainedTemplateDeclInfo *const CTDI = new (C) ConstrainedTemplateDeclInfo;
322 ClassTemplateDecl *const New =
323 new (C, DC) ClassTemplateDecl(CTDI, C, DC, L, Name, Params, Decl);
324 New->setAssociatedConstraints(AssociatedConstraints);
328 ClassTemplateDecl *ClassTemplateDecl::CreateDeserialized(ASTContext &C,
330 return new (C, ID) ClassTemplateDecl(C, nullptr, SourceLocation(),
331 DeclarationName(), nullptr, nullptr);
334 void ClassTemplateDecl::LoadLazySpecializations() const {
335 loadLazySpecializationsImpl();
338 llvm::FoldingSetVector<ClassTemplateSpecializationDecl> &
339 ClassTemplateDecl::getSpecializations() const {
340 LoadLazySpecializations();
341 return getCommonPtr()->Specializations;
344 llvm::FoldingSetVector<ClassTemplatePartialSpecializationDecl> &
345 ClassTemplateDecl::getPartialSpecializations() {
346 LoadLazySpecializations();
347 return getCommonPtr()->PartialSpecializations;
350 RedeclarableTemplateDecl::CommonBase *
351 ClassTemplateDecl::newCommon(ASTContext &C) const {
352 Common *CommonPtr = new (C) Common;
353 C.addDestruction(CommonPtr);
357 ClassTemplateSpecializationDecl *
358 ClassTemplateDecl::findSpecialization(ArrayRef<TemplateArgument> Args,
360 return findSpecializationImpl(getSpecializations(), Args, InsertPos);
363 void ClassTemplateDecl::AddSpecialization(ClassTemplateSpecializationDecl *D,
365 addSpecializationImpl<ClassTemplateDecl>(getSpecializations(), D, InsertPos);
368 ClassTemplatePartialSpecializationDecl *
369 ClassTemplateDecl::findPartialSpecialization(ArrayRef<TemplateArgument> Args,
371 return findSpecializationImpl(getPartialSpecializations(), Args, InsertPos);
374 void ClassTemplateDecl::AddPartialSpecialization(
375 ClassTemplatePartialSpecializationDecl *D,
378 getPartialSpecializations().InsertNode(D, InsertPos);
380 ClassTemplatePartialSpecializationDecl *Existing
381 = getPartialSpecializations().GetOrInsertNode(D);
383 assert(Existing->isCanonicalDecl() && "Non-canonical specialization?");
386 if (ASTMutationListener *L = getASTMutationListener())
387 L->AddedCXXTemplateSpecialization(this, D);
390 void ClassTemplateDecl::getPartialSpecializations(
391 SmallVectorImpl<ClassTemplatePartialSpecializationDecl *> &PS) {
392 llvm::FoldingSetVector<ClassTemplatePartialSpecializationDecl> &PartialSpecs
393 = getPartialSpecializations();
395 PS.reserve(PartialSpecs.size());
396 for (ClassTemplatePartialSpecializationDecl &P : PartialSpecs)
397 PS.push_back(P.getMostRecentDecl());
400 ClassTemplatePartialSpecializationDecl *
401 ClassTemplateDecl::findPartialSpecialization(QualType T) {
402 ASTContext &Context = getASTContext();
403 for (ClassTemplatePartialSpecializationDecl &P :
404 getPartialSpecializations()) {
405 if (Context.hasSameType(P.getInjectedSpecializationType(), T))
406 return P.getMostRecentDecl();
412 ClassTemplatePartialSpecializationDecl *
413 ClassTemplateDecl::findPartialSpecInstantiatedFromMember(
414 ClassTemplatePartialSpecializationDecl *D) {
415 Decl *DCanon = D->getCanonicalDecl();
416 for (ClassTemplatePartialSpecializationDecl &P : getPartialSpecializations()) {
417 if (P.getInstantiatedFromMember()->getCanonicalDecl() == DCanon)
418 return P.getMostRecentDecl();
425 ClassTemplateDecl::getInjectedClassNameSpecialization() {
426 Common *CommonPtr = getCommonPtr();
427 if (!CommonPtr->InjectedClassNameType.isNull())
428 return CommonPtr->InjectedClassNameType;
430 // C++0x [temp.dep.type]p2:
431 // The template argument list of a primary template is a template argument
432 // list in which the nth template argument has the value of the nth template
433 // parameter of the class template. If the nth template parameter is a
434 // template parameter pack (14.5.3), the nth template argument is a pack
435 // expansion (14.5.3) whose pattern is the name of the template parameter
437 ASTContext &Context = getASTContext();
438 TemplateParameterList *Params = getTemplateParameters();
439 SmallVector<TemplateArgument, 16> TemplateArgs;
440 Context.getInjectedTemplateArgs(Params, TemplateArgs);
441 CommonPtr->InjectedClassNameType
442 = Context.getTemplateSpecializationType(TemplateName(this),
444 return CommonPtr->InjectedClassNameType;
447 //===----------------------------------------------------------------------===//
448 // TemplateTypeParm Allocation/Deallocation Method Implementations
449 //===----------------------------------------------------------------------===//
451 TemplateTypeParmDecl *
452 TemplateTypeParmDecl::Create(const ASTContext &C, DeclContext *DC,
453 SourceLocation KeyLoc, SourceLocation NameLoc,
454 unsigned D, unsigned P, IdentifierInfo *Id,
455 bool Typename, bool ParameterPack) {
456 TemplateTypeParmDecl *TTPDecl =
457 new (C, DC) TemplateTypeParmDecl(DC, KeyLoc, NameLoc, Id, Typename);
458 QualType TTPType = C.getTemplateTypeParmType(D, P, ParameterPack, TTPDecl);
459 TTPDecl->setTypeForDecl(TTPType.getTypePtr());
463 TemplateTypeParmDecl *
464 TemplateTypeParmDecl::CreateDeserialized(const ASTContext &C, unsigned ID) {
465 return new (C, ID) TemplateTypeParmDecl(nullptr, SourceLocation(),
466 SourceLocation(), nullptr, false);
469 SourceLocation TemplateTypeParmDecl::getDefaultArgumentLoc() const {
470 return hasDefaultArgument()
471 ? getDefaultArgumentInfo()->getTypeLoc().getBeginLoc()
475 SourceRange TemplateTypeParmDecl::getSourceRange() const {
476 if (hasDefaultArgument() && !defaultArgumentWasInherited())
477 return SourceRange(getLocStart(),
478 getDefaultArgumentInfo()->getTypeLoc().getEndLoc());
480 return TypeDecl::getSourceRange();
483 unsigned TemplateTypeParmDecl::getDepth() const {
484 return getTypeForDecl()->getAs<TemplateTypeParmType>()->getDepth();
487 unsigned TemplateTypeParmDecl::getIndex() const {
488 return getTypeForDecl()->getAs<TemplateTypeParmType>()->getIndex();
491 bool TemplateTypeParmDecl::isParameterPack() const {
492 return getTypeForDecl()->getAs<TemplateTypeParmType>()->isParameterPack();
495 //===----------------------------------------------------------------------===//
496 // NonTypeTemplateParmDecl Method Implementations
497 //===----------------------------------------------------------------------===//
499 NonTypeTemplateParmDecl::NonTypeTemplateParmDecl(
500 DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, unsigned D,
501 unsigned P, IdentifierInfo *Id, QualType T, TypeSourceInfo *TInfo,
502 ArrayRef<QualType> ExpandedTypes, ArrayRef<TypeSourceInfo *> ExpandedTInfos)
503 : DeclaratorDecl(NonTypeTemplateParm, DC, IdLoc, Id, T, TInfo, StartLoc),
504 TemplateParmPosition(D, P), ParameterPack(true),
505 ExpandedParameterPack(true), NumExpandedTypes(ExpandedTypes.size()) {
506 if (!ExpandedTypes.empty() && !ExpandedTInfos.empty()) {
508 getTrailingObjects<std::pair<QualType, TypeSourceInfo *>>();
509 for (unsigned I = 0; I != NumExpandedTypes; ++I) {
510 new (&TypesAndInfos[I].first) QualType(ExpandedTypes[I]);
511 TypesAndInfos[I].second = ExpandedTInfos[I];
516 NonTypeTemplateParmDecl *
517 NonTypeTemplateParmDecl::Create(const ASTContext &C, DeclContext *DC,
518 SourceLocation StartLoc, SourceLocation IdLoc,
519 unsigned D, unsigned P, IdentifierInfo *Id,
520 QualType T, bool ParameterPack,
521 TypeSourceInfo *TInfo) {
522 return new (C, DC) NonTypeTemplateParmDecl(DC, StartLoc, IdLoc, D, P, Id,
523 T, ParameterPack, TInfo);
526 NonTypeTemplateParmDecl *NonTypeTemplateParmDecl::Create(
527 const ASTContext &C, DeclContext *DC, SourceLocation StartLoc,
528 SourceLocation IdLoc, unsigned D, unsigned P, IdentifierInfo *Id,
529 QualType T, TypeSourceInfo *TInfo, ArrayRef<QualType> ExpandedTypes,
530 ArrayRef<TypeSourceInfo *> ExpandedTInfos) {
532 additionalSizeToAlloc<std::pair<QualType, TypeSourceInfo *>>(
533 ExpandedTypes.size()))
534 NonTypeTemplateParmDecl(DC, StartLoc, IdLoc, D, P, Id, T, TInfo,
535 ExpandedTypes, ExpandedTInfos);
538 NonTypeTemplateParmDecl *
539 NonTypeTemplateParmDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
540 return new (C, ID) NonTypeTemplateParmDecl(nullptr, SourceLocation(),
541 SourceLocation(), 0, 0, nullptr,
542 QualType(), false, nullptr);
545 NonTypeTemplateParmDecl *
546 NonTypeTemplateParmDecl::CreateDeserialized(ASTContext &C, unsigned ID,
547 unsigned NumExpandedTypes) {
549 new (C, ID, additionalSizeToAlloc<std::pair<QualType, TypeSourceInfo *>>(
551 NonTypeTemplateParmDecl(nullptr, SourceLocation(), SourceLocation(),
552 0, 0, nullptr, QualType(), nullptr, None,
554 NTTP->NumExpandedTypes = NumExpandedTypes;
558 SourceRange NonTypeTemplateParmDecl::getSourceRange() const {
559 if (hasDefaultArgument() && !defaultArgumentWasInherited())
560 return SourceRange(getOuterLocStart(),
561 getDefaultArgument()->getSourceRange().getEnd());
562 return DeclaratorDecl::getSourceRange();
565 SourceLocation NonTypeTemplateParmDecl::getDefaultArgumentLoc() const {
566 return hasDefaultArgument()
567 ? getDefaultArgument()->getSourceRange().getBegin()
571 //===----------------------------------------------------------------------===//
572 // TemplateTemplateParmDecl Method Implementations
573 //===----------------------------------------------------------------------===//
575 void TemplateTemplateParmDecl::anchor() {}
577 TemplateTemplateParmDecl::TemplateTemplateParmDecl(
578 DeclContext *DC, SourceLocation L, unsigned D, unsigned P,
579 IdentifierInfo *Id, TemplateParameterList *Params,
580 ArrayRef<TemplateParameterList *> Expansions)
581 : TemplateDecl(TemplateTemplateParm, DC, L, Id, Params),
582 TemplateParmPosition(D, P), ParameterPack(true),
583 ExpandedParameterPack(true), NumExpandedParams(Expansions.size()) {
584 if (!Expansions.empty())
585 std::uninitialized_copy(Expansions.begin(), Expansions.end(),
586 getTrailingObjects<TemplateParameterList *>());
589 TemplateTemplateParmDecl *
590 TemplateTemplateParmDecl::Create(const ASTContext &C, DeclContext *DC,
591 SourceLocation L, unsigned D, unsigned P,
592 bool ParameterPack, IdentifierInfo *Id,
593 TemplateParameterList *Params) {
594 return new (C, DC) TemplateTemplateParmDecl(DC, L, D, P, ParameterPack, Id,
598 TemplateTemplateParmDecl *
599 TemplateTemplateParmDecl::Create(const ASTContext &C, DeclContext *DC,
600 SourceLocation L, unsigned D, unsigned P,
602 TemplateParameterList *Params,
603 ArrayRef<TemplateParameterList *> Expansions) {
605 additionalSizeToAlloc<TemplateParameterList *>(Expansions.size()))
606 TemplateTemplateParmDecl(DC, L, D, P, Id, Params, Expansions);
609 TemplateTemplateParmDecl *
610 TemplateTemplateParmDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
611 return new (C, ID) TemplateTemplateParmDecl(nullptr, SourceLocation(), 0, 0,
612 false, nullptr, nullptr);
615 TemplateTemplateParmDecl *
616 TemplateTemplateParmDecl::CreateDeserialized(ASTContext &C, unsigned ID,
617 unsigned NumExpansions) {
619 new (C, ID, additionalSizeToAlloc<TemplateParameterList *>(NumExpansions))
620 TemplateTemplateParmDecl(nullptr, SourceLocation(), 0, 0, nullptr,
622 TTP->NumExpandedParams = NumExpansions;
626 SourceLocation TemplateTemplateParmDecl::getDefaultArgumentLoc() const {
627 return hasDefaultArgument() ? getDefaultArgument().getLocation()
631 void TemplateTemplateParmDecl::setDefaultArgument(
632 const ASTContext &C, const TemplateArgumentLoc &DefArg) {
633 if (DefArg.getArgument().isNull())
634 DefaultArgument.set(nullptr);
636 DefaultArgument.set(new (C) TemplateArgumentLoc(DefArg));
639 //===----------------------------------------------------------------------===//
640 // TemplateArgumentList Implementation
641 //===----------------------------------------------------------------------===//
642 TemplateArgumentList::TemplateArgumentList(ArrayRef<TemplateArgument> Args)
643 : Arguments(getTrailingObjects<TemplateArgument>()),
644 NumArguments(Args.size()) {
645 std::uninitialized_copy(Args.begin(), Args.end(),
646 getTrailingObjects<TemplateArgument>());
649 TemplateArgumentList *
650 TemplateArgumentList::CreateCopy(ASTContext &Context,
651 ArrayRef<TemplateArgument> Args) {
652 void *Mem = Context.Allocate(totalSizeToAlloc<TemplateArgument>(Args.size()));
653 return new (Mem) TemplateArgumentList(Args);
656 FunctionTemplateSpecializationInfo *
657 FunctionTemplateSpecializationInfo::Create(ASTContext &C, FunctionDecl *FD,
658 FunctionTemplateDecl *Template,
659 TemplateSpecializationKind TSK,
660 const TemplateArgumentList *TemplateArgs,
661 const TemplateArgumentListInfo *TemplateArgsAsWritten,
662 SourceLocation POI) {
663 const ASTTemplateArgumentListInfo *ArgsAsWritten = nullptr;
664 if (TemplateArgsAsWritten)
665 ArgsAsWritten = ASTTemplateArgumentListInfo::Create(C,
666 *TemplateArgsAsWritten);
668 return new (C) FunctionTemplateSpecializationInfo(FD, Template, TSK,
674 //===----------------------------------------------------------------------===//
675 // TemplateDecl Implementation
676 //===----------------------------------------------------------------------===//
678 void TemplateDecl::anchor() {}
680 //===----------------------------------------------------------------------===//
681 // ClassTemplateSpecializationDecl Implementation
682 //===----------------------------------------------------------------------===//
684 ClassTemplateSpecializationDecl::
685 ClassTemplateSpecializationDecl(ASTContext &Context, Kind DK, TagKind TK,
686 DeclContext *DC, SourceLocation StartLoc,
687 SourceLocation IdLoc,
688 ClassTemplateDecl *SpecializedTemplate,
689 ArrayRef<TemplateArgument> Args,
690 ClassTemplateSpecializationDecl *PrevDecl)
691 : CXXRecordDecl(DK, TK, Context, DC, StartLoc, IdLoc,
692 SpecializedTemplate->getIdentifier(), PrevDecl),
693 SpecializedTemplate(SpecializedTemplate),
694 TemplateArgs(TemplateArgumentList::CreateCopy(Context, Args)),
695 SpecializationKind(TSK_Undeclared) {
698 ClassTemplateSpecializationDecl::ClassTemplateSpecializationDecl(ASTContext &C,
700 : CXXRecordDecl(DK, TTK_Struct, C, nullptr, SourceLocation(),
701 SourceLocation(), nullptr, nullptr),
702 SpecializationKind(TSK_Undeclared) {}
704 ClassTemplateSpecializationDecl *
705 ClassTemplateSpecializationDecl::Create(ASTContext &Context, TagKind TK,
707 SourceLocation StartLoc,
708 SourceLocation IdLoc,
709 ClassTemplateDecl *SpecializedTemplate,
710 ArrayRef<TemplateArgument> Args,
711 ClassTemplateSpecializationDecl *PrevDecl) {
712 ClassTemplateSpecializationDecl *Result =
713 new (Context, DC) ClassTemplateSpecializationDecl(
714 Context, ClassTemplateSpecialization, TK, DC, StartLoc, IdLoc,
715 SpecializedTemplate, Args, PrevDecl);
716 Result->MayHaveOutOfDateDef = false;
718 Context.getTypeDeclType(Result, PrevDecl);
722 ClassTemplateSpecializationDecl *
723 ClassTemplateSpecializationDecl::CreateDeserialized(ASTContext &C,
725 ClassTemplateSpecializationDecl *Result =
726 new (C, ID) ClassTemplateSpecializationDecl(C, ClassTemplateSpecialization);
727 Result->MayHaveOutOfDateDef = false;
731 void ClassTemplateSpecializationDecl::getNameForDiagnostic(
732 raw_ostream &OS, const PrintingPolicy &Policy, bool Qualified) const {
733 NamedDecl::getNameForDiagnostic(OS, Policy, Qualified);
735 auto *PS = dyn_cast<ClassTemplatePartialSpecializationDecl>(this);
736 if (const ASTTemplateArgumentListInfo *ArgsAsWritten =
737 PS ? PS->getTemplateArgsAsWritten() : nullptr) {
738 printTemplateArgumentList(OS, ArgsAsWritten->arguments(), Policy);
740 const TemplateArgumentList &TemplateArgs = getTemplateArgs();
741 printTemplateArgumentList(OS, TemplateArgs.asArray(), Policy);
746 ClassTemplateSpecializationDecl::getSpecializedTemplate() const {
747 if (SpecializedPartialSpecialization *PartialSpec
748 = SpecializedTemplate.dyn_cast<SpecializedPartialSpecialization*>())
749 return PartialSpec->PartialSpecialization->getSpecializedTemplate();
750 return SpecializedTemplate.get<ClassTemplateDecl*>();
754 ClassTemplateSpecializationDecl::getSourceRange() const {
756 SourceLocation Begin = getTemplateKeywordLoc();
757 if (Begin.isValid()) {
758 // Here we have an explicit (partial) specialization or instantiation.
759 assert(getSpecializationKind() == TSK_ExplicitSpecialization ||
760 getSpecializationKind() == TSK_ExplicitInstantiationDeclaration ||
761 getSpecializationKind() == TSK_ExplicitInstantiationDefinition);
762 if (getExternLoc().isValid())
763 Begin = getExternLoc();
764 SourceLocation End = getBraceRange().getEnd();
766 End = getTypeAsWritten()->getTypeLoc().getEndLoc();
767 return SourceRange(Begin, End);
769 // An implicit instantiation of a class template partial specialization
770 // uses ExplicitInfo to record the TypeAsWritten, but the source
771 // locations should be retrieved from the instantiation pattern.
772 using CTPSDecl = ClassTemplatePartialSpecializationDecl;
773 CTPSDecl *ctpsd = const_cast<CTPSDecl*>(cast<CTPSDecl>(this));
774 CTPSDecl *inst_from = ctpsd->getInstantiatedFromMember();
775 assert(inst_from != nullptr);
776 return inst_from->getSourceRange();
779 // No explicit info available.
780 llvm::PointerUnion<ClassTemplateDecl *,
781 ClassTemplatePartialSpecializationDecl *>
782 inst_from = getInstantiatedFrom();
783 if (inst_from.isNull())
784 return getSpecializedTemplate()->getSourceRange();
785 if (ClassTemplateDecl *ctd = inst_from.dyn_cast<ClassTemplateDecl*>())
786 return ctd->getSourceRange();
787 return inst_from.get<ClassTemplatePartialSpecializationDecl*>()
792 //===----------------------------------------------------------------------===//
793 // ClassTemplatePartialSpecializationDecl Implementation
794 //===----------------------------------------------------------------------===//
795 void ClassTemplatePartialSpecializationDecl::anchor() {}
797 ClassTemplatePartialSpecializationDecl::
798 ClassTemplatePartialSpecializationDecl(ASTContext &Context, TagKind TK,
800 SourceLocation StartLoc,
801 SourceLocation IdLoc,
802 TemplateParameterList *Params,
803 ClassTemplateDecl *SpecializedTemplate,
804 ArrayRef<TemplateArgument> Args,
805 const ASTTemplateArgumentListInfo *ArgInfos,
806 ClassTemplatePartialSpecializationDecl *PrevDecl)
807 : ClassTemplateSpecializationDecl(Context,
808 ClassTemplatePartialSpecialization,
809 TK, DC, StartLoc, IdLoc,
810 SpecializedTemplate, Args, PrevDecl),
811 TemplateParams(Params), ArgsAsWritten(ArgInfos),
812 InstantiatedFromMember(nullptr, false) {
813 AdoptTemplateParameterList(Params, this);
816 ClassTemplatePartialSpecializationDecl *
817 ClassTemplatePartialSpecializationDecl::
818 Create(ASTContext &Context, TagKind TK,DeclContext *DC,
819 SourceLocation StartLoc, SourceLocation IdLoc,
820 TemplateParameterList *Params,
821 ClassTemplateDecl *SpecializedTemplate,
822 ArrayRef<TemplateArgument> Args,
823 const TemplateArgumentListInfo &ArgInfos,
824 QualType CanonInjectedType,
825 ClassTemplatePartialSpecializationDecl *PrevDecl) {
826 const ASTTemplateArgumentListInfo *ASTArgInfos =
827 ASTTemplateArgumentListInfo::Create(Context, ArgInfos);
829 ClassTemplatePartialSpecializationDecl *Result = new (Context, DC)
830 ClassTemplatePartialSpecializationDecl(Context, TK, DC, StartLoc, IdLoc,
831 Params, SpecializedTemplate, Args,
832 ASTArgInfos, PrevDecl);
833 Result->setSpecializationKind(TSK_ExplicitSpecialization);
834 Result->MayHaveOutOfDateDef = false;
836 Context.getInjectedClassNameType(Result, CanonInjectedType);
840 ClassTemplatePartialSpecializationDecl *
841 ClassTemplatePartialSpecializationDecl::CreateDeserialized(ASTContext &C,
843 ClassTemplatePartialSpecializationDecl *Result =
844 new (C, ID) ClassTemplatePartialSpecializationDecl(C);
845 Result->MayHaveOutOfDateDef = false;
849 //===----------------------------------------------------------------------===//
850 // FriendTemplateDecl Implementation
851 //===----------------------------------------------------------------------===//
853 void FriendTemplateDecl::anchor() {}
856 FriendTemplateDecl::Create(ASTContext &Context, DeclContext *DC,
858 MutableArrayRef<TemplateParameterList *> Params,
859 FriendUnion Friend, SourceLocation FLoc) {
860 return new (Context, DC) FriendTemplateDecl(DC, L, Params, Friend, FLoc);
863 FriendTemplateDecl *FriendTemplateDecl::CreateDeserialized(ASTContext &C,
865 return new (C, ID) FriendTemplateDecl(EmptyShell());
868 //===----------------------------------------------------------------------===//
869 // TypeAliasTemplateDecl Implementation
870 //===----------------------------------------------------------------------===//
872 TypeAliasTemplateDecl *TypeAliasTemplateDecl::Create(ASTContext &C,
875 DeclarationName Name,
876 TemplateParameterList *Params,
878 AdoptTemplateParameterList(Params, DC);
879 return new (C, DC) TypeAliasTemplateDecl(C, DC, L, Name, Params, Decl);
882 TypeAliasTemplateDecl *TypeAliasTemplateDecl::CreateDeserialized(ASTContext &C,
884 return new (C, ID) TypeAliasTemplateDecl(C, nullptr, SourceLocation(),
885 DeclarationName(), nullptr, nullptr);
888 RedeclarableTemplateDecl::CommonBase *
889 TypeAliasTemplateDecl::newCommon(ASTContext &C) const {
890 Common *CommonPtr = new (C) Common;
891 C.addDestruction(CommonPtr);
895 //===----------------------------------------------------------------------===//
896 // ClassScopeFunctionSpecializationDecl Implementation
897 //===----------------------------------------------------------------------===//
899 void ClassScopeFunctionSpecializationDecl::anchor() {}
901 ClassScopeFunctionSpecializationDecl *
902 ClassScopeFunctionSpecializationDecl::CreateDeserialized(ASTContext &C,
904 return new (C, ID) ClassScopeFunctionSpecializationDecl(
905 nullptr, SourceLocation(), nullptr, false, TemplateArgumentListInfo());
908 //===----------------------------------------------------------------------===//
909 // VarTemplateDecl Implementation
910 //===----------------------------------------------------------------------===//
912 VarTemplateDecl *VarTemplateDecl::getDefinition() {
913 VarTemplateDecl *CurD = this;
915 if (CurD->isThisDeclarationADefinition())
917 CurD = CurD->getPreviousDecl();
922 VarTemplateDecl *VarTemplateDecl::Create(ASTContext &C, DeclContext *DC,
923 SourceLocation L, DeclarationName Name,
924 TemplateParameterList *Params,
926 return new (C, DC) VarTemplateDecl(C, DC, L, Name, Params, Decl);
929 VarTemplateDecl *VarTemplateDecl::CreateDeserialized(ASTContext &C,
931 return new (C, ID) VarTemplateDecl(C, nullptr, SourceLocation(),
932 DeclarationName(), nullptr, nullptr);
935 void VarTemplateDecl::LoadLazySpecializations() const {
936 loadLazySpecializationsImpl();
939 llvm::FoldingSetVector<VarTemplateSpecializationDecl> &
940 VarTemplateDecl::getSpecializations() const {
941 LoadLazySpecializations();
942 return getCommonPtr()->Specializations;
945 llvm::FoldingSetVector<VarTemplatePartialSpecializationDecl> &
946 VarTemplateDecl::getPartialSpecializations() {
947 LoadLazySpecializations();
948 return getCommonPtr()->PartialSpecializations;
951 RedeclarableTemplateDecl::CommonBase *
952 VarTemplateDecl::newCommon(ASTContext &C) const {
953 Common *CommonPtr = new (C) Common;
954 C.addDestruction(CommonPtr);
958 VarTemplateSpecializationDecl *
959 VarTemplateDecl::findSpecialization(ArrayRef<TemplateArgument> Args,
961 return findSpecializationImpl(getSpecializations(), Args, InsertPos);
964 void VarTemplateDecl::AddSpecialization(VarTemplateSpecializationDecl *D,
966 addSpecializationImpl<VarTemplateDecl>(getSpecializations(), D, InsertPos);
969 VarTemplatePartialSpecializationDecl *
970 VarTemplateDecl::findPartialSpecialization(ArrayRef<TemplateArgument> Args,
972 return findSpecializationImpl(getPartialSpecializations(), Args, InsertPos);
975 void VarTemplateDecl::AddPartialSpecialization(
976 VarTemplatePartialSpecializationDecl *D, void *InsertPos) {
978 getPartialSpecializations().InsertNode(D, InsertPos);
980 VarTemplatePartialSpecializationDecl *Existing =
981 getPartialSpecializations().GetOrInsertNode(D);
983 assert(Existing->isCanonicalDecl() && "Non-canonical specialization?");
986 if (ASTMutationListener *L = getASTMutationListener())
987 L->AddedCXXTemplateSpecialization(this, D);
990 void VarTemplateDecl::getPartialSpecializations(
991 SmallVectorImpl<VarTemplatePartialSpecializationDecl *> &PS) {
992 llvm::FoldingSetVector<VarTemplatePartialSpecializationDecl> &PartialSpecs =
993 getPartialSpecializations();
995 PS.reserve(PartialSpecs.size());
996 for (VarTemplatePartialSpecializationDecl &P : PartialSpecs)
997 PS.push_back(P.getMostRecentDecl());
1000 VarTemplatePartialSpecializationDecl *
1001 VarTemplateDecl::findPartialSpecInstantiatedFromMember(
1002 VarTemplatePartialSpecializationDecl *D) {
1003 Decl *DCanon = D->getCanonicalDecl();
1004 for (VarTemplatePartialSpecializationDecl &P : getPartialSpecializations()) {
1005 if (P.getInstantiatedFromMember()->getCanonicalDecl() == DCanon)
1006 return P.getMostRecentDecl();
1012 //===----------------------------------------------------------------------===//
1013 // VarTemplateSpecializationDecl Implementation
1014 //===----------------------------------------------------------------------===//
1016 VarTemplateSpecializationDecl::VarTemplateSpecializationDecl(
1017 Kind DK, ASTContext &Context, DeclContext *DC, SourceLocation StartLoc,
1018 SourceLocation IdLoc, VarTemplateDecl *SpecializedTemplate, QualType T,
1019 TypeSourceInfo *TInfo, StorageClass S, ArrayRef<TemplateArgument> Args)
1020 : VarDecl(DK, Context, DC, StartLoc, IdLoc,
1021 SpecializedTemplate->getIdentifier(), T, TInfo, S),
1022 SpecializedTemplate(SpecializedTemplate),
1023 TemplateArgs(TemplateArgumentList::CreateCopy(Context, Args)),
1024 SpecializationKind(TSK_Undeclared), IsCompleteDefinition(false) {}
1026 VarTemplateSpecializationDecl::VarTemplateSpecializationDecl(Kind DK,
1028 : VarDecl(DK, C, nullptr, SourceLocation(), SourceLocation(), nullptr,
1029 QualType(), nullptr, SC_None),
1030 SpecializationKind(TSK_Undeclared), IsCompleteDefinition(false) {}
1032 VarTemplateSpecializationDecl *VarTemplateSpecializationDecl::Create(
1033 ASTContext &Context, DeclContext *DC, SourceLocation StartLoc,
1034 SourceLocation IdLoc, VarTemplateDecl *SpecializedTemplate, QualType T,
1035 TypeSourceInfo *TInfo, StorageClass S, ArrayRef<TemplateArgument> Args) {
1036 return new (Context, DC) VarTemplateSpecializationDecl(
1037 VarTemplateSpecialization, Context, DC, StartLoc, IdLoc,
1038 SpecializedTemplate, T, TInfo, S, Args);
1041 VarTemplateSpecializationDecl *
1042 VarTemplateSpecializationDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
1044 VarTemplateSpecializationDecl(VarTemplateSpecialization, C);
1047 void VarTemplateSpecializationDecl::getNameForDiagnostic(
1048 raw_ostream &OS, const PrintingPolicy &Policy, bool Qualified) const {
1049 NamedDecl::getNameForDiagnostic(OS, Policy, Qualified);
1051 auto *PS = dyn_cast<VarTemplatePartialSpecializationDecl>(this);
1052 if (const ASTTemplateArgumentListInfo *ArgsAsWritten =
1053 PS ? PS->getTemplateArgsAsWritten() : nullptr) {
1054 printTemplateArgumentList(OS, ArgsAsWritten->arguments(), Policy);
1056 const TemplateArgumentList &TemplateArgs = getTemplateArgs();
1057 printTemplateArgumentList(OS, TemplateArgs.asArray(), Policy);
1061 VarTemplateDecl *VarTemplateSpecializationDecl::getSpecializedTemplate() const {
1062 if (SpecializedPartialSpecialization *PartialSpec =
1063 SpecializedTemplate.dyn_cast<SpecializedPartialSpecialization *>())
1064 return PartialSpec->PartialSpecialization->getSpecializedTemplate();
1065 return SpecializedTemplate.get<VarTemplateDecl *>();
1068 void VarTemplateSpecializationDecl::setTemplateArgsInfo(
1069 const TemplateArgumentListInfo &ArgsInfo) {
1070 TemplateArgsInfo.setLAngleLoc(ArgsInfo.getLAngleLoc());
1071 TemplateArgsInfo.setRAngleLoc(ArgsInfo.getRAngleLoc());
1072 for (const TemplateArgumentLoc &Loc : ArgsInfo.arguments())
1073 TemplateArgsInfo.addArgument(Loc);
1076 //===----------------------------------------------------------------------===//
1077 // VarTemplatePartialSpecializationDecl Implementation
1078 //===----------------------------------------------------------------------===//
1080 void VarTemplatePartialSpecializationDecl::anchor() {}
1082 VarTemplatePartialSpecializationDecl::VarTemplatePartialSpecializationDecl(
1083 ASTContext &Context, DeclContext *DC, SourceLocation StartLoc,
1084 SourceLocation IdLoc, TemplateParameterList *Params,
1085 VarTemplateDecl *SpecializedTemplate, QualType T, TypeSourceInfo *TInfo,
1086 StorageClass S, ArrayRef<TemplateArgument> Args,
1087 const ASTTemplateArgumentListInfo *ArgInfos)
1088 : VarTemplateSpecializationDecl(VarTemplatePartialSpecialization, Context,
1089 DC, StartLoc, IdLoc, SpecializedTemplate, T,
1091 TemplateParams(Params), ArgsAsWritten(ArgInfos),
1092 InstantiatedFromMember(nullptr, false) {
1093 // TODO: The template parameters should be in DC by now. Verify.
1094 // AdoptTemplateParameterList(Params, DC);
1097 VarTemplatePartialSpecializationDecl *
1098 VarTemplatePartialSpecializationDecl::Create(
1099 ASTContext &Context, DeclContext *DC, SourceLocation StartLoc,
1100 SourceLocation IdLoc, TemplateParameterList *Params,
1101 VarTemplateDecl *SpecializedTemplate, QualType T, TypeSourceInfo *TInfo,
1102 StorageClass S, ArrayRef<TemplateArgument> Args,
1103 const TemplateArgumentListInfo &ArgInfos) {
1104 const ASTTemplateArgumentListInfo *ASTArgInfos
1105 = ASTTemplateArgumentListInfo::Create(Context, ArgInfos);
1107 VarTemplatePartialSpecializationDecl *Result =
1108 new (Context, DC) VarTemplatePartialSpecializationDecl(
1109 Context, DC, StartLoc, IdLoc, Params, SpecializedTemplate, T, TInfo,
1110 S, Args, ASTArgInfos);
1111 Result->setSpecializationKind(TSK_ExplicitSpecialization);
1115 VarTemplatePartialSpecializationDecl *
1116 VarTemplatePartialSpecializationDecl::CreateDeserialized(ASTContext &C,
1118 return new (C, ID) VarTemplatePartialSpecializationDecl(C);
1121 static TemplateParameterList *
1122 createMakeIntegerSeqParameterList(const ASTContext &C, DeclContext *DC) {
1124 auto *T = TemplateTypeParmDecl::Create(
1125 C, DC, SourceLocation(), SourceLocation(), /*Depth=*/1, /*Position=*/0,
1126 /*Id=*/nullptr, /*Typename=*/true, /*ParameterPack=*/false);
1127 T->setImplicit(true);
1130 TypeSourceInfo *TI =
1131 C.getTrivialTypeSourceInfo(QualType(T->getTypeForDecl(), 0));
1132 auto *N = NonTypeTemplateParmDecl::Create(
1133 C, DC, SourceLocation(), SourceLocation(), /*Depth=*/0, /*Position=*/1,
1134 /*Id=*/nullptr, TI->getType(), /*ParameterPack=*/true, TI);
1135 N->setImplicit(true);
1137 // <typename T, T ...Ints>
1138 NamedDecl *P[2] = {T, N};
1139 auto *TPL = TemplateParameterList::Create(
1140 C, SourceLocation(), SourceLocation(), P, SourceLocation(), nullptr);
1142 // template <typename T, ...Ints> class IntSeq
1143 auto *TemplateTemplateParm = TemplateTemplateParmDecl::Create(
1144 C, DC, SourceLocation(), /*Depth=*/0, /*Position=*/0,
1145 /*ParameterPack=*/false, /*Id=*/nullptr, TPL);
1146 TemplateTemplateParm->setImplicit(true);
1149 auto *TemplateTypeParm = TemplateTypeParmDecl::Create(
1150 C, DC, SourceLocation(), SourceLocation(), /*Depth=*/0, /*Position=*/1,
1151 /*Id=*/nullptr, /*Typename=*/true, /*ParameterPack=*/false);
1152 TemplateTypeParm->setImplicit(true);
1155 TypeSourceInfo *TInfo = C.getTrivialTypeSourceInfo(
1156 QualType(TemplateTypeParm->getTypeForDecl(), 0));
1157 auto *NonTypeTemplateParm = NonTypeTemplateParmDecl::Create(
1158 C, DC, SourceLocation(), SourceLocation(), /*Depth=*/0, /*Position=*/2,
1159 /*Id=*/nullptr, TInfo->getType(), /*ParameterPack=*/false, TInfo);
1160 NamedDecl *Params[] = {TemplateTemplateParm, TemplateTypeParm,
1161 NonTypeTemplateParm};
1163 // template <template <typename T, T ...Ints> class IntSeq, typename T, T N>
1164 return TemplateParameterList::Create(C, SourceLocation(), SourceLocation(),
1165 Params, SourceLocation(), nullptr);
1168 static TemplateParameterList *
1169 createTypePackElementParameterList(const ASTContext &C, DeclContext *DC) {
1170 // std::size_t Index
1171 TypeSourceInfo *TInfo = C.getTrivialTypeSourceInfo(C.getSizeType());
1172 auto *Index = NonTypeTemplateParmDecl::Create(
1173 C, DC, SourceLocation(), SourceLocation(), /*Depth=*/0, /*Position=*/0,
1174 /*Id=*/nullptr, TInfo->getType(), /*ParameterPack=*/false, TInfo);
1177 auto *Ts = TemplateTypeParmDecl::Create(
1178 C, DC, SourceLocation(), SourceLocation(), /*Depth=*/0, /*Position=*/1,
1179 /*Id=*/nullptr, /*Typename=*/true, /*ParameterPack=*/true);
1180 Ts->setImplicit(true);
1182 // template <std::size_t Index, typename ...T>
1183 NamedDecl *Params[] = {Index, Ts};
1184 return TemplateParameterList::Create(C, SourceLocation(), SourceLocation(),
1185 llvm::makeArrayRef(Params),
1186 SourceLocation(), nullptr);
1189 static TemplateParameterList *createBuiltinTemplateParameterList(
1190 const ASTContext &C, DeclContext *DC, BuiltinTemplateKind BTK) {
1192 case BTK__make_integer_seq:
1193 return createMakeIntegerSeqParameterList(C, DC);
1194 case BTK__type_pack_element:
1195 return createTypePackElementParameterList(C, DC);
1198 llvm_unreachable("unhandled BuiltinTemplateKind!");
1201 void BuiltinTemplateDecl::anchor() {}
1203 BuiltinTemplateDecl::BuiltinTemplateDecl(const ASTContext &C, DeclContext *DC,
1204 DeclarationName Name,
1205 BuiltinTemplateKind BTK)
1206 : TemplateDecl(BuiltinTemplate, DC, SourceLocation(), Name,
1207 createBuiltinTemplateParameterList(C, DC, BTK)),