106a59bb8260ce3d52de761865dee90f90054a5ccSebastian Redl//===--- DeclTemplate.cpp - Template Declaration AST Node Implementation --===// 2aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// 3aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// The LLVM Compiler Infrastructure 4aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// 5aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// This file is distributed under the University of Illinois Open Source 6aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// License. See LICENSE.TXT for details. 7aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// 8aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 9aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// 10aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// This file implements the C++ related Decl classes for templates. 11aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// 12aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 13aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 14aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor#include "clang/AST/DeclTemplate.h" 1555fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/AST/ASTContext.h" 1655fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/AST/ASTMutationListener.h" 1755fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/AST/DeclCXX.h" 1855f6b14230c94272efbbcdd89a92224c8db9f225Douglas Gregor#include "clang/AST/Expr.h" 19b95cc97b2023d00cd3fbae8455bc9d728eab5e5dDouglas Gregor#include "clang/AST/ExprCXX.h" 20833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall#include "clang/AST/TypeLoc.h" 2187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#include "clang/Basic/Builtins.h" 22aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor#include "clang/Basic/IdentifierTable.h" 23aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor#include "llvm/ADT/STLExtras.h" 24910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor#include <memory> 25aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregorusing namespace clang; 26aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 27aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 28aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// TemplateParameterList Implementation 29aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 30aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 31ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas GregorTemplateParameterList::TemplateParameterList(SourceLocation TemplateLoc, 32ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas Gregor SourceLocation LAngleLoc, 334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ArrayRef<NamedDecl *> Params, 34ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas Gregor SourceLocation RAngleLoc) 35ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas Gregor : TemplateLoc(TemplateLoc), LAngleLoc(LAngleLoc), RAngleLoc(RAngleLoc), 364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar NumParams(Params.size()), ContainsUnexpandedParameterPack(false) { 376964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith assert(this->NumParams == NumParams && "Too many template parameters"); 386964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith for (unsigned Idx = 0; Idx < NumParams; ++Idx) { 396964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith NamedDecl *P = Params[Idx]; 406964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith begin()[Idx] = P; 416964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith 426964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith if (!P->isTemplateParameterPack()) { 436964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith if (NonTypeTemplateParmDecl *NTTP = dyn_cast<NonTypeTemplateParmDecl>(P)) 446964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith if (NTTP->getType()->containsUnexpandedParameterPack()) 456964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith ContainsUnexpandedParameterPack = true; 466964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith 476964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith if (TemplateTemplateParmDecl *TTP = dyn_cast<TemplateTemplateParmDecl>(P)) 486964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith if (TTP->getTemplateParameters()->containsUnexpandedParameterPack()) 496964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith ContainsUnexpandedParameterPack = true; 506964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith 516964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith // FIXME: If a default argument contains an unexpanded parameter pack, the 526964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith // template parameter list does too. 536964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith } 546964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith } 55aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor} 56aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 574967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTemplateParameterList *TemplateParameterList::Create( 584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar const ASTContext &C, SourceLocation TemplateLoc, SourceLocation LAngleLoc, 594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ArrayRef<NamedDecl *> Params, SourceLocation RAngleLoc) { 604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar void *Mem = C.Allocate(totalSizeToAlloc<NamedDecl *>(Params.size()), 6187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar llvm::alignOf<TemplateParameterList>()); 621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return new (Mem) TemplateParameterList(TemplateLoc, LAngleLoc, Params, 634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar RAngleLoc); 64aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor} 65aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 6662cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregorunsigned TemplateParameterList::getMinRequiredArguments() const { 676952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor unsigned NumRequiredArgs = 0; 684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar for (const NamedDecl *P : asArray()) { 694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (P->isTemplateParameterPack()) { 704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (const auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(P)) 716952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor if (NTTP->isExpandedParameterPack()) { 726952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor NumRequiredArgs += NTTP->getNumExpansionTypes(); 736952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor continue; 746952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor } 754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 7662cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor break; 776952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor } 784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (const auto *TTP = dyn_cast<TemplateTypeParmDecl>(P)) { 806952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor if (TTP->hasDefaultArgument()) 816952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor break; 824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } else if (const auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(P)) { 836952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor if (NTTP->hasDefaultArgument()) 846952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor break; 854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } else if (cast<TemplateTemplateParmDecl>(P)->hasDefaultArgument()) 866952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor break; 874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 886952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor ++NumRequiredArgs; 8962cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor } 904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 9162cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor return NumRequiredArgs; 9262cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor} 9362cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor 94ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregorunsigned TemplateParameterList::getDepth() const { 95ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor if (size() == 0) 96ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor return 0; 97ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor 98ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor const NamedDecl *FirstParm = getParam(0); 99ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor if (const TemplateTypeParmDecl *TTP 100ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor = dyn_cast<TemplateTypeParmDecl>(FirstParm)) 101ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor return TTP->getDepth(); 102ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor else if (const NonTypeTemplateParmDecl *NTTP 103ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor = dyn_cast<NonTypeTemplateParmDecl>(FirstParm)) 104ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor return NTTP->getDepth(); 105ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor else 106ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor return cast<TemplateTemplateParmDecl>(FirstParm)->getDepth(); 107ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor} 108ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor 109787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregorstatic void AdoptTemplateParameterList(TemplateParameterList *Params, 110787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor DeclContext *Owner) { 1114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar for (NamedDecl *P : *Params) { 1124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar P->setDeclContext(Owner); 1134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 1144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (auto *TTP = dyn_cast<TemplateTemplateParmDecl>(P)) 115787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor AdoptTemplateParameterList(TTP->getTemplateParameters(), Owner); 116787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor } 117787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor} 118787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor 119b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarnamespace clang { 120b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarvoid *allocateDefaultArgStorageChain(const ASTContext &C) { 121b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar return new (C) char[sizeof(void*) * 2]; 122b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar} 123b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar} 124b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar 125aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 1269eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne// RedeclarableTemplateDecl Implementation 1279eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne//===----------------------------------------------------------------------===// 1289eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne 129b76d9718caea48b9333979b3da6f3a80110840cbDmitri GribenkoRedeclarableTemplateDecl::CommonBase *RedeclarableTemplateDecl::getCommonPtr() const { 1309297535638b59e652bc521bf8e6c87856d639279Rafael Espindola if (Common) 1319297535638b59e652bc521bf8e6c87856d639279Rafael Espindola return Common; 1329eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne 1339297535638b59e652bc521bf8e6c87856d639279Rafael Espindola // Walk the previous-declaration chain until we either find a declaration 1349297535638b59e652bc521bf8e6c87856d639279Rafael Espindola // with a common pointer or we run out of previous declarations. 1359297535638b59e652bc521bf8e6c87856d639279Rafael Espindola SmallVector<const RedeclarableTemplateDecl *, 2> PrevDecls; 1369297535638b59e652bc521bf8e6c87856d639279Rafael Espindola for (const RedeclarableTemplateDecl *Prev = getPreviousDecl(); Prev; 1379297535638b59e652bc521bf8e6c87856d639279Rafael Espindola Prev = Prev->getPreviousDecl()) { 1389297535638b59e652bc521bf8e6c87856d639279Rafael Espindola if (Prev->Common) { 1399297535638b59e652bc521bf8e6c87856d639279Rafael Espindola Common = Prev->Common; 1409297535638b59e652bc521bf8e6c87856d639279Rafael Espindola break; 1418a8950b13e4d438f732d24f22f63ebe1a9e0075eDouglas Gregor } 1429297535638b59e652bc521bf8e6c87856d639279Rafael Espindola 1439297535638b59e652bc521bf8e6c87856d639279Rafael Espindola PrevDecls.push_back(Prev); 1449297535638b59e652bc521bf8e6c87856d639279Rafael Espindola } 1459297535638b59e652bc521bf8e6c87856d639279Rafael Espindola 1469297535638b59e652bc521bf8e6c87856d639279Rafael Espindola // If we never found a common pointer, allocate one now. 1479297535638b59e652bc521bf8e6c87856d639279Rafael Espindola if (!Common) { 1489297535638b59e652bc521bf8e6c87856d639279Rafael Espindola // FIXME: If any of the declarations is from an AST file, we probably 1499297535638b59e652bc521bf8e6c87856d639279Rafael Espindola // need an update record to add the common data. 1509297535638b59e652bc521bf8e6c87856d639279Rafael Espindola 1519297535638b59e652bc521bf8e6c87856d639279Rafael Espindola Common = newCommon(getASTContext()); 1528a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne } 1538a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne 1549297535638b59e652bc521bf8e6c87856d639279Rafael Espindola // Update any previous declarations we saw with the common pointer. 1554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar for (const RedeclarableTemplateDecl *Prev : PrevDecls) 1564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Prev->Common = Common; 1579297535638b59e652bc521bf8e6c87856d639279Rafael Espindola 1587c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor return Common; 159f88718ea0ca0d64b7fd31d109f1d9ec769a9c45fPeter Collingbourne} 160f88718ea0ca0d64b7fd31d109f1d9ec769a9c45fPeter Collingbourne 1610e2c34f92f00628d48968dfea096d36381f494cbStephen Hinestemplate<class EntryType> 1620e2c34f92f00628d48968dfea096d36381f494cbStephen Hinestypename RedeclarableTemplateDecl::SpecEntryTraits<EntryType>::DeclType * 1634048590d5774fd4b08661b5cf59b6f90b62f283aPeter CollingbourneRedeclarableTemplateDecl::findSpecializationImpl( 1640e2c34f92f00628d48968dfea096d36381f494cbStephen Hines llvm::FoldingSetVector<EntryType> &Specs, ArrayRef<TemplateArgument> Args, 1650e2c34f92f00628d48968dfea096d36381f494cbStephen Hines void *&InsertPos) { 1664048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne typedef SpecEntryTraits<EntryType> SETraits; 1674048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne llvm::FoldingSetNodeID ID; 168c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines EntryType::Profile(ID,Args, getASTContext()); 1694048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne EntryType *Entry = Specs.FindNodeOrInsertPos(ID, InsertPos); 1700e2c34f92f00628d48968dfea096d36381f494cbStephen Hines return Entry ? SETraits::getDecl(Entry)->getMostRecentDecl() : nullptr; 1710e2c34f92f00628d48968dfea096d36381f494cbStephen Hines} 1720e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 1730e2c34f92f00628d48968dfea096d36381f494cbStephen Hinestemplate<class Derived, class EntryType> 1740e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesvoid RedeclarableTemplateDecl::addSpecializationImpl( 1750e2c34f92f00628d48968dfea096d36381f494cbStephen Hines llvm::FoldingSetVector<EntryType> &Specializations, EntryType *Entry, 1760e2c34f92f00628d48968dfea096d36381f494cbStephen Hines void *InsertPos) { 1770e2c34f92f00628d48968dfea096d36381f494cbStephen Hines typedef SpecEntryTraits<EntryType> SETraits; 1780e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (InsertPos) { 1790e2c34f92f00628d48968dfea096d36381f494cbStephen Hines#ifndef NDEBUG 1800e2c34f92f00628d48968dfea096d36381f494cbStephen Hines void *CorrectInsertPos; 1810e2c34f92f00628d48968dfea096d36381f494cbStephen Hines assert(!findSpecializationImpl(Specializations, 1820e2c34f92f00628d48968dfea096d36381f494cbStephen Hines SETraits::getTemplateArgs(Entry), 1830e2c34f92f00628d48968dfea096d36381f494cbStephen Hines CorrectInsertPos) && 1840e2c34f92f00628d48968dfea096d36381f494cbStephen Hines InsertPos == CorrectInsertPos && 1850e2c34f92f00628d48968dfea096d36381f494cbStephen Hines "given incorrect InsertPos for specialization"); 1860e2c34f92f00628d48968dfea096d36381f494cbStephen Hines#endif 1870e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Specializations.InsertNode(Entry, InsertPos); 1880e2c34f92f00628d48968dfea096d36381f494cbStephen Hines } else { 1890e2c34f92f00628d48968dfea096d36381f494cbStephen Hines EntryType *Existing = Specializations.GetOrInsertNode(Entry); 1900e2c34f92f00628d48968dfea096d36381f494cbStephen Hines (void)Existing; 1910e2c34f92f00628d48968dfea096d36381f494cbStephen Hines assert(SETraits::getDecl(Existing)->isCanonicalDecl() && 1920e2c34f92f00628d48968dfea096d36381f494cbStephen Hines "non-canonical specialization?"); 1930e2c34f92f00628d48968dfea096d36381f494cbStephen Hines } 1940e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 1950e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (ASTMutationListener *L = getASTMutationListener()) 1960e2c34f92f00628d48968dfea096d36381f494cbStephen Hines L->AddedCXXTemplateSpecialization(cast<Derived>(this), 1970e2c34f92f00628d48968dfea096d36381f494cbStephen Hines SETraits::getDecl(Entry)); 1984048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne} 1994048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne 200c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor/// \brief Generate the injected template arguments for the given template 201c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor/// parameter list, e.g., for the injected-class-name of a class template. 202c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregorstatic void GenerateInjectedTemplateArgs(ASTContext &Context, 2034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar TemplateParameterList *Params, 204c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor TemplateArgument *Args) { 2054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar for (NamedDecl *Param : *Params) { 206c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor TemplateArgument Arg; 2074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (auto *TTP = dyn_cast<TemplateTypeParmDecl>(Param)) { 208c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor QualType ArgType = Context.getTypeDeclType(TTP); 209c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor if (TTP->isParameterPack()) 21066874fb18afbffb8b2ca05576851a64534be3352David Blaikie ArgType = Context.getPackExpansionType(ArgType, None); 211dc84cd5efdd3430efb22546b4ac656aa0540b210David Blaikie 212c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor Arg = TemplateArgument(ArgType); 2134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } else if (auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(Param)) { 214f4b88a45902af1802a1cb42ba48b1c474474f228John McCall Expr *E = new (Context) DeclRefExpr(NTTP, /*enclosing*/ false, 215c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor NTTP->getType().getNonLValueExprType(Context), 216c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor Expr::getValueKindForType(NTTP->getType()), 217c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor NTTP->getLocation()); 2184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 219c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor if (NTTP->isParameterPack()) 22066874fb18afbffb8b2ca05576851a64534be3352David Blaikie E = new (Context) PackExpansionExpr(Context.DependentTy, E, 22166874fb18afbffb8b2ca05576851a64534be3352David Blaikie NTTP->getLocation(), None); 222c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor Arg = TemplateArgument(E); 223c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor } else { 2244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar auto *TTP = cast<TemplateTemplateParmDecl>(Param); 225c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor if (TTP->isParameterPack()) 226dc84cd5efdd3430efb22546b4ac656aa0540b210David Blaikie Arg = TemplateArgument(TemplateName(TTP), Optional<unsigned>()); 227c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor else 228c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor Arg = TemplateArgument(TemplateName(TTP)); 229c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor } 2304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 2314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (Param->isTemplateParameterPack()) 23287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar Arg = TemplateArgument::CreatePackCopy(Context, Arg); 23387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 234c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor *Args++ = Arg; 235c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor } 236c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor} 2374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 2389eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne//===----------------------------------------------------------------------===// 239aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// FunctionTemplateDecl Implementation 240aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 241aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 2420054531488928a424666ac11fcdc6bcc5112de52Douglas Gregorvoid FunctionTemplateDecl::DeallocateCommon(void *Ptr) { 2430054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor static_cast<Common *>(Ptr)->~Common(); 2440054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor} 2450054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor 246aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorFunctionTemplateDecl *FunctionTemplateDecl::Create(ASTContext &C, 247aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor DeclContext *DC, 248aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor SourceLocation L, 249aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor DeclarationName Name, 250127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor TemplateParameterList *Params, 251aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor NamedDecl *Decl) { 252787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor AdoptTemplateParameterList(Params, cast<DeclContext>(Decl)); 2536bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return new (C, DC) FunctionTemplateDecl(C, DC, L, Name, Params, Decl); 254aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor} 255aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 2561e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorFunctionTemplateDecl *FunctionTemplateDecl::CreateDeserialized(ASTContext &C, 2571e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor unsigned ID) { 2586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return new (C, ID) FunctionTemplateDecl(C, nullptr, SourceLocation(), 2596bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines DeclarationName(), nullptr, nullptr); 2609a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor} 2619a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor 2626b5415196327fa8ef00f028ba175fafef1738ae1Argyrios KyrtzidisRedeclarableTemplateDecl::CommonBase * 263b76d9718caea48b9333979b3da6f3a80110840cbDmitri GribenkoFunctionTemplateDecl::newCommon(ASTContext &C) const { 2646b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis Common *CommonPtr = new (C) Common; 2656b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis C.AddDeallocation(DeallocateCommon, CommonPtr); 2669eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne return CommonPtr; 2679eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne} 2689eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne 2696982bf4d77bc57a85ee173b631729fce673f16efRichard Smithvoid FunctionTemplateDecl::LoadLazySpecializations() const { 2700e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // Grab the most recent declaration to ensure we've loaded any lazy 2710e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // redeclarations of this template. 2720e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // 2730e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // FIXME: Avoid walking the entire redeclaration chain here. 2740e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Common *CommonPtr = getMostRecentDecl()->getCommonPtr(); 2756982bf4d77bc57a85ee173b631729fce673f16efRichard Smith if (CommonPtr->LazySpecializations) { 2766982bf4d77bc57a85ee173b631729fce673f16efRichard Smith ASTContext &Context = getASTContext(); 2776982bf4d77bc57a85ee173b631729fce673f16efRichard Smith uint32_t *Specs = CommonPtr->LazySpecializations; 2786bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines CommonPtr->LazySpecializations = nullptr; 2796982bf4d77bc57a85ee173b631729fce673f16efRichard Smith for (uint32_t I = 0, N = *Specs++; I != N; ++I) 2806982bf4d77bc57a85ee173b631729fce673f16efRichard Smith (void)Context.getExternalSource()->GetExternalDecl(Specs[I]); 2816982bf4d77bc57a85ee173b631729fce673f16efRichard Smith } 2826982bf4d77bc57a85ee173b631729fce673f16efRichard Smith} 2836982bf4d77bc57a85ee173b631729fce673f16efRichard Smith 2846982bf4d77bc57a85ee173b631729fce673f16efRichard Smithllvm::FoldingSetVector<FunctionTemplateSpecializationInfo> & 2856982bf4d77bc57a85ee173b631729fce673f16efRichard SmithFunctionTemplateDecl::getSpecializations() const { 2866982bf4d77bc57a85ee173b631729fce673f16efRichard Smith LoadLazySpecializations(); 2876982bf4d77bc57a85ee173b631729fce673f16efRichard Smith return getCommonPtr()->Specializations; 2886982bf4d77bc57a85ee173b631729fce673f16efRichard Smith} 2896982bf4d77bc57a85ee173b631729fce673f16efRichard Smith 2902c853e401ca406d417eb916e867226050e7be06bArgyrios KyrtzidisFunctionDecl * 291c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen HinesFunctionTemplateDecl::findSpecialization(ArrayRef<TemplateArgument> Args, 292c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines void *&InsertPos) { 293c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines return findSpecializationImpl(getSpecializations(), Args, InsertPos); 2942c853e401ca406d417eb916e867226050e7be06bArgyrios Kyrtzidis} 2952c853e401ca406d417eb916e867226050e7be06bArgyrios Kyrtzidis 2965bbcdbf36f8cf79d99703ef20848c55960065e43Sebastian Redlvoid FunctionTemplateDecl::addSpecialization( 2975bbcdbf36f8cf79d99703ef20848c55960065e43Sebastian Redl FunctionTemplateSpecializationInfo *Info, void *InsertPos) { 2980e2c34f92f00628d48968dfea096d36381f494cbStephen Hines addSpecializationImpl<FunctionTemplateDecl>(getSpecializations(), Info, 2990e2c34f92f00628d48968dfea096d36381f494cbStephen Hines InsertPos); 3005bbcdbf36f8cf79d99703ef20848c55960065e43Sebastian Redl} 3015bbcdbf36f8cf79d99703ef20848c55960065e43Sebastian Redl 3027a9f7c7c68673c46d6e2b83fec6f4cbfbd25f475Richard SmithArrayRef<TemplateArgument> FunctionTemplateDecl::getInjectedTemplateArgs() { 303c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor TemplateParameterList *Params = getTemplateParameters(); 304c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor Common *CommonPtr = getCommonPtr(); 305c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor if (!CommonPtr->InjectedArgs) { 306c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor CommonPtr->InjectedArgs 3077a9f7c7c68673c46d6e2b83fec6f4cbfbd25f475Richard Smith = new (getASTContext()) TemplateArgument[Params->size()]; 3087a9f7c7c68673c46d6e2b83fec6f4cbfbd25f475Richard Smith GenerateInjectedTemplateArgs(getASTContext(), Params, 309c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor CommonPtr->InjectedArgs); 310c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor } 3117a9f7c7c68673c46d6e2b83fec6f4cbfbd25f475Richard Smith 3127a9f7c7c68673c46d6e2b83fec6f4cbfbd25f475Richard Smith return llvm::makeArrayRef(CommonPtr->InjectedArgs, Params->size()); 313c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor} 314c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor 315aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 316aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// ClassTemplateDecl Implementation 317aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 318aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 3190054531488928a424666ac11fcdc6bcc5112de52Douglas Gregorvoid ClassTemplateDecl::DeallocateCommon(void *Ptr) { 3200054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor static_cast<Common *>(Ptr)->~Common(); 3210054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor} 3220054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor 3238731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios KyrtzidisClassTemplateDecl *ClassTemplateDecl::Create(ASTContext &C, 3248731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis DeclContext *DC, 3258731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis SourceLocation L, 3268731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis DeclarationName Name, 3278731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis TemplateParameterList *Params, 3288731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis NamedDecl *Decl, 3298731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis ClassTemplateDecl *PrevDecl) { 330787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor AdoptTemplateParameterList(Params, cast<DeclContext>(Decl)); 3316bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ClassTemplateDecl *New = new (C, DC) ClassTemplateDecl(C, DC, L, Name, 3326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Params, Decl); 333bc6509175e1ce5cc1b48d1b97ac8d23d8b74167cRafael Espindola New->setPreviousDecl(PrevDecl); 3348731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis return New; 3355953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor} 3365953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor 3376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesClassTemplateDecl *ClassTemplateDecl::CreateDeserialized(ASTContext &C, 3381e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor unsigned ID) { 3396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return new (C, ID) ClassTemplateDecl(C, nullptr, SourceLocation(), 3406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines DeclarationName(), nullptr, nullptr); 3419a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor} 3429a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor 343e252a89fc1560ca4cda9a95e4ae05e2dc03ee78cDmitri Gribenkovoid ClassTemplateDecl::LoadLazySpecializations() const { 3440e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // Grab the most recent declaration to ensure we've loaded any lazy 3450e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // redeclarations of this template. 3460e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // 3470e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // FIXME: Avoid walking the entire redeclaration chain here. 3480e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Common *CommonPtr = getMostRecentDecl()->getCommonPtr(); 349c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor if (CommonPtr->LazySpecializations) { 350c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor ASTContext &Context = getASTContext(); 351c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor uint32_t *Specs = CommonPtr->LazySpecializations; 3526bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines CommonPtr->LazySpecializations = nullptr; 353c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor for (uint32_t I = 0, N = *Specs++; I != N; ++I) 354c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor (void)Context.getExternalSource()->GetExternalDecl(Specs[I]); 355c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor } 356c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor} 357c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor 358d964d6380945e0505b623050fe6a3f428008fc2aChandler Carruthllvm::FoldingSetVector<ClassTemplateSpecializationDecl> & 359e252a89fc1560ca4cda9a95e4ae05e2dc03ee78cDmitri GribenkoClassTemplateDecl::getSpecializations() const { 360c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor LoadLazySpecializations(); 361c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor return getCommonPtr()->Specializations; 362c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor} 363c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor 364d964d6380945e0505b623050fe6a3f428008fc2aChandler Carruthllvm::FoldingSetVector<ClassTemplatePartialSpecializationDecl> & 365c8e5cf8f725e111965debb7130ef7466c0c73884Douglas GregorClassTemplateDecl::getPartialSpecializations() { 366c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor LoadLazySpecializations(); 367c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor return getCommonPtr()->PartialSpecializations; 368c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor} 369c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor 3706b5415196327fa8ef00f028ba175fafef1738ae1Argyrios KyrtzidisRedeclarableTemplateDecl::CommonBase * 371b76d9718caea48b9333979b3da6f3a80110840cbDmitri GribenkoClassTemplateDecl::newCommon(ASTContext &C) const { 3726b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis Common *CommonPtr = new (C) Common; 3736b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis C.AddDeallocation(DeallocateCommon, CommonPtr); 3749eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne return CommonPtr; 3759eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne} 3769eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne 377cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplateSpecializationDecl * 378c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen HinesClassTemplateDecl::findSpecialization(ArrayRef<TemplateArgument> Args, 379c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines void *&InsertPos) { 380c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines return findSpecializationImpl(getSpecializations(), Args, InsertPos); 381cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis} 382cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis 383bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidisvoid ClassTemplateDecl::AddSpecialization(ClassTemplateSpecializationDecl *D, 384bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis void *InsertPos) { 3850e2c34f92f00628d48968dfea096d36381f494cbStephen Hines addSpecializationImpl<ClassTemplateDecl>(getSpecializations(), D, InsertPos); 386bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis} 387bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis 388cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplatePartialSpecializationDecl * 389c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen HinesClassTemplateDecl::findPartialSpecialization(ArrayRef<TemplateArgument> Args, 390cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis void *&InsertPos) { 391c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines return findSpecializationImpl(getPartialSpecializations(), Args, InsertPos); 392cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis} 393cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis 394bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidisvoid ClassTemplateDecl::AddPartialSpecialization( 395bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis ClassTemplatePartialSpecializationDecl *D, 396bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis void *InsertPos) { 3971e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor if (InsertPos) 3981e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor getPartialSpecializations().InsertNode(D, InsertPos); 3991e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor else { 4001e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor ClassTemplatePartialSpecializationDecl *Existing 4011e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor = getPartialSpecializations().GetOrInsertNode(D); 4021e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor (void)Existing; 4031e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor assert(Existing->isCanonicalDecl() && "Non-canonical specialization?"); 4041e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor } 4051e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor 406bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis if (ASTMutationListener *L = getASTMutationListener()) 407bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis L->AddedCXXTemplateSpecialization(this, D); 408bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis} 409bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis 410dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregorvoid ClassTemplateDecl::getPartialSpecializations( 4115f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVectorImpl<ClassTemplatePartialSpecializationDecl *> &PS) { 412d964d6380945e0505b623050fe6a3f428008fc2aChandler Carruth llvm::FoldingSetVector<ClassTemplatePartialSpecializationDecl> &PartialSpecs 4135bf1bdc2fedb0c29b5fcdb4abc852aa85b4fe26aArgyrios Kyrtzidis = getPartialSpecializations(); 414dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor PS.clear(); 41537fd27dbb941d27f4bd7412e534e7e5089d6781bRichard Smith PS.reserve(PartialSpecs.size()); 4164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar for (ClassTemplatePartialSpecializationDecl &P : PartialSpecs) 4174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar PS.push_back(P.getMostRecentDecl()); 418dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor} 419dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor 420b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas GregorClassTemplatePartialSpecializationDecl * 421b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas GregorClassTemplateDecl::findPartialSpecialization(QualType T) { 422b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor ASTContext &Context = getASTContext(); 4234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar for (ClassTemplatePartialSpecializationDecl &P : 4244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar getPartialSpecializations()) { 4254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (Context.hasSameType(P.getInjectedSpecializationType(), T)) 4264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return P.getMostRecentDecl(); 427cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis } 428cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis 4296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 430cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis} 431cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis 432cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplatePartialSpecializationDecl * 433cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplateDecl::findPartialSpecInstantiatedFromMember( 434cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis ClassTemplatePartialSpecializationDecl *D) { 435cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis Decl *DCanon = D->getCanonicalDecl(); 4364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar for (ClassTemplatePartialSpecializationDecl &P : getPartialSpecializations()) { 4374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (P.getInstantiatedFromMember()->getCanonicalDecl() == DCanon) 4384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return P.getMostRecentDecl(); 439b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor } 4401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 442b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor} 443b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor 4443cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCallQualType 44524bae92f08ae098cc50a602d8cf1273b423e14daDouglas GregorClassTemplateDecl::getInjectedClassNameSpecialization() { 4465bf1bdc2fedb0c29b5fcdb4abc852aa85b4fe26aArgyrios Kyrtzidis Common *CommonPtr = getCommonPtr(); 4477da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor if (!CommonPtr->InjectedClassNameType.isNull()) 4487da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor return CommonPtr->InjectedClassNameType; 4497da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor 450b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor // C++0x [temp.dep.type]p2: 451b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor // The template argument list of a primary template is a template argument 452b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor // list in which the nth template argument has the value of the nth template 453b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor // parameter of the class template. If the nth template parameter is a 454b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor // template parameter pack (14.5.3), the nth template argument is a pack 455b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor // expansion (14.5.3) whose pattern is the name of the template parameter 456b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor // pack. 45724bae92f08ae098cc50a602d8cf1273b423e14daDouglas Gregor ASTContext &Context = getASTContext(); 4587da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor TemplateParameterList *Params = getTemplateParameters(); 4595f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<TemplateArgument, 16> TemplateArgs; 460c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor TemplateArgs.resize(Params->size()); 461c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor GenerateInjectedTemplateArgs(getASTContext(), Params, TemplateArgs.data()); 4627da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor CommonPtr->InjectedClassNameType 4631275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor = Context.getTemplateSpecializationType(TemplateName(this), 4644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar TemplateArgs); 4657da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor return CommonPtr->InjectedClassNameType; 4667da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor} 4677da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor 468aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 469aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// TemplateTypeParm Allocation/Deallocation Method Implementations 470aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 471aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 472aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorTemplateTypeParmDecl * 4734ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadTemplateTypeParmDecl::Create(const ASTContext &C, DeclContext *DC, 474344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara SourceLocation KeyLoc, SourceLocation NameLoc, 475344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara unsigned D, unsigned P, IdentifierInfo *Id, 476344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara bool Typename, bool ParameterPack) { 4774fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth TemplateTypeParmDecl *TTPDecl = 478651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines new (C, DC) TemplateTypeParmDecl(DC, KeyLoc, NameLoc, Id, Typename); 4794fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth QualType TTPType = C.getTemplateTypeParmType(D, P, ParameterPack, TTPDecl); 4806bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines TTPDecl->setTypeForDecl(TTPType.getTypePtr()); 4814fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth return TTPDecl; 482aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor} 483aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 484b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios KyrtzidisTemplateTypeParmDecl * 4851e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorTemplateTypeParmDecl::CreateDeserialized(const ASTContext &C, unsigned ID) { 4866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return new (C, ID) TemplateTypeParmDecl(nullptr, SourceLocation(), 4876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines SourceLocation(), nullptr, false); 488b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios Kyrtzidis} 489b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios Kyrtzidis 490833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallSourceLocation TemplateTypeParmDecl::getDefaultArgumentLoc() const { 49177d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara return hasDefaultArgument() 492b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar ? getDefaultArgumentInfo()->getTypeLoc().getBeginLoc() 493b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar : SourceLocation(); 49477d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara} 49577d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara 49677d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo BagnaraSourceRange TemplateTypeParmDecl::getSourceRange() const { 49777d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara if (hasDefaultArgument() && !defaultArgumentWasInherited()) 498344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara return SourceRange(getLocStart(), 499b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar getDefaultArgumentInfo()->getTypeLoc().getEndLoc()); 50077d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara else 501344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara return TypeDecl::getSourceRange(); 502833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall} 503833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 504ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregorunsigned TemplateTypeParmDecl::getDepth() const { 5056bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return getTypeForDecl()->getAs<TemplateTypeParmType>()->getDepth(); 506ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor} 507ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor 508ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregorunsigned TemplateTypeParmDecl::getIndex() const { 5096bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return getTypeForDecl()->getAs<TemplateTypeParmType>()->getIndex(); 510ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor} 511ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor 5124fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruthbool TemplateTypeParmDecl::isParameterPack() const { 5136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return getTypeForDecl()->getAs<TemplateTypeParmType>()->isParameterPack(); 5144fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth} 5154fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth 516aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 517aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// NonTypeTemplateParmDecl Method Implementations 518aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 519aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 5204967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarNonTypeTemplateParmDecl::NonTypeTemplateParmDecl( 5214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, unsigned D, 5224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar unsigned P, IdentifierInfo *Id, QualType T, TypeSourceInfo *TInfo, 5234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ArrayRef<QualType> ExpandedTypes, ArrayRef<TypeSourceInfo *> ExpandedTInfos) 5244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar : DeclaratorDecl(NonTypeTemplateParm, DC, IdLoc, Id, T, TInfo, StartLoc), 5254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar TemplateParmPosition(D, P), ParameterPack(true), 5264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ExpandedParameterPack(true), NumExpandedTypes(ExpandedTypes.size()) { 5274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (!ExpandedTypes.empty() && !ExpandedTInfos.empty()) { 52887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar auto TypesAndInfos = 52987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar getTrailingObjects<std::pair<QualType, TypeSourceInfo *>>(); 5306952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor for (unsigned I = 0; I != NumExpandedTypes; ++I) { 53187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar new (&TypesAndInfos[I].first) QualType(ExpandedTypes[I]); 53287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar TypesAndInfos[I].second = ExpandedTInfos[I]; 5336952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor } 5346952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor } 5356952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor} 5366952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor 537aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorNonTypeTemplateParmDecl * 5384ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadNonTypeTemplateParmDecl::Create(const ASTContext &C, DeclContext *DC, 539ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara SourceLocation StartLoc, SourceLocation IdLoc, 540ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara unsigned D, unsigned P, IdentifierInfo *Id, 541ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara QualType T, bool ParameterPack, 542ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara TypeSourceInfo *TInfo) { 543651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return new (C, DC) NonTypeTemplateParmDecl(DC, StartLoc, IdLoc, D, P, Id, 544651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines T, ParameterPack, TInfo); 545aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor} 546aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 5474967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarNonTypeTemplateParmDecl *NonTypeTemplateParmDecl::Create( 5484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar const ASTContext &C, DeclContext *DC, SourceLocation StartLoc, 5494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar SourceLocation IdLoc, unsigned D, unsigned P, IdentifierInfo *Id, 5504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar QualType T, TypeSourceInfo *TInfo, ArrayRef<QualType> ExpandedTypes, 5514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ArrayRef<TypeSourceInfo *> ExpandedTInfos) { 55287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return new (C, DC, 55387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar additionalSizeToAlloc<std::pair<QualType, TypeSourceInfo *>>( 5544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ExpandedTypes.size())) 55587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar NonTypeTemplateParmDecl(DC, StartLoc, IdLoc, D, P, Id, T, TInfo, 5564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ExpandedTypes, ExpandedTInfos); 5576952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor} 5586952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor 5591e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorNonTypeTemplateParmDecl * 5601e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorNonTypeTemplateParmDecl::CreateDeserialized(ASTContext &C, unsigned ID) { 5616bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return new (C, ID) NonTypeTemplateParmDecl(nullptr, SourceLocation(), 5626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines SourceLocation(), 0, 0, nullptr, 5636bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines QualType(), false, nullptr); 5641e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor} 5651e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor 5661e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorNonTypeTemplateParmDecl * 5671e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorNonTypeTemplateParmDecl::CreateDeserialized(ASTContext &C, unsigned ID, 5681e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor unsigned NumExpandedTypes) { 5694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar auto *NTTP = 5704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar new (C, ID, additionalSizeToAlloc<std::pair<QualType, TypeSourceInfo *>>( 5714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar NumExpandedTypes)) 5724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar NonTypeTemplateParmDecl(nullptr, SourceLocation(), SourceLocation(), 5734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 0, 0, nullptr, QualType(), nullptr, None, 5744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar None); 5754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar NTTP->NumExpandedTypes = NumExpandedTypes; 5764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return NTTP; 5771e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor} 5781e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor 57976a40219ee5624d78aba167dce02bdbaa930955fJohn McCallSourceRange NonTypeTemplateParmDecl::getSourceRange() const { 580ee4bfd412db491c489fc2ee74916edd73f9c618aAbramo Bagnara if (hasDefaultArgument() && !defaultArgumentWasInherited()) 581a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara return SourceRange(getOuterLocStart(), 582a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara getDefaultArgument()->getSourceRange().getEnd()); 583a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara return DeclaratorDecl::getSourceRange(); 58476a40219ee5624d78aba167dce02bdbaa930955fJohn McCall} 58576a40219ee5624d78aba167dce02bdbaa930955fJohn McCall 586d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas GregorSourceLocation NonTypeTemplateParmDecl::getDefaultArgumentLoc() const { 587d92f7a297c0ed3f7d0ebcbb557e1d4c1925b8c72Abramo Bagnara return hasDefaultArgument() 588d92f7a297c0ed3f7d0ebcbb557e1d4c1925b8c72Abramo Bagnara ? getDefaultArgument()->getSourceRange().getBegin() 589d92f7a297c0ed3f7d0ebcbb557e1d4c1925b8c72Abramo Bagnara : SourceLocation(); 590d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas Gregor} 591d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas Gregor 592aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 593aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// TemplateTemplateParmDecl Method Implementations 594aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 595aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 59699ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid TemplateTemplateParmDecl::anchor() { } 59799ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie 5986964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard SmithTemplateTemplateParmDecl::TemplateTemplateParmDecl( 5996964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith DeclContext *DC, SourceLocation L, unsigned D, unsigned P, 6006964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith IdentifierInfo *Id, TemplateParameterList *Params, 6014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ArrayRef<TemplateParameterList *> Expansions) 6024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar : TemplateDecl(TemplateTemplateParm, DC, L, Id, Params), 6034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar TemplateParmPosition(D, P), ParameterPack(true), 6044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ExpandedParameterPack(true), NumExpandedParams(Expansions.size()) { 6054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (!Expansions.empty()) 6064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar std::uninitialized_copy(Expansions.begin(), Expansions.end(), 60787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar getTrailingObjects<TemplateParameterList *>()); 6086964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith} 6096964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith 610aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorTemplateTemplateParmDecl * 6114ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadTemplateTemplateParmDecl::Create(const ASTContext &C, DeclContext *DC, 612aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor SourceLocation L, unsigned D, unsigned P, 61361c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor bool ParameterPack, IdentifierInfo *Id, 614aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor TemplateParameterList *Params) { 615651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return new (C, DC) TemplateTemplateParmDecl(DC, L, D, P, ParameterPack, Id, 616651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Params); 617aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor} 618aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 6191e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorTemplateTemplateParmDecl * 6206964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard SmithTemplateTemplateParmDecl::Create(const ASTContext &C, DeclContext *DC, 6216964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith SourceLocation L, unsigned D, unsigned P, 6226964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith IdentifierInfo *Id, 6236964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith TemplateParameterList *Params, 624cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko ArrayRef<TemplateParameterList *> Expansions) { 62587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return new (C, DC, 62687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar additionalSizeToAlloc<TemplateParameterList *>(Expansions.size())) 6274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar TemplateTemplateParmDecl(DC, L, D, P, Id, Params, Expansions); 6286964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith} 6296964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith 6306964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard SmithTemplateTemplateParmDecl * 6311e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorTemplateTemplateParmDecl::CreateDeserialized(ASTContext &C, unsigned ID) { 6326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return new (C, ID) TemplateTemplateParmDecl(nullptr, SourceLocation(), 0, 0, 6336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines false, nullptr, nullptr); 6341e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor} 6351e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor 6366964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard SmithTemplateTemplateParmDecl * 6376964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard SmithTemplateTemplateParmDecl::CreateDeserialized(ASTContext &C, unsigned ID, 6386964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith unsigned NumExpansions) { 6394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar auto *TTP = 6404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar new (C, ID, additionalSizeToAlloc<TemplateParameterList *>(NumExpansions)) 6414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar TemplateTemplateParmDecl(nullptr, SourceLocation(), 0, 0, nullptr, 6424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar nullptr, None); 6434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar TTP->NumExpandedParams = NumExpansions; 6444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return TTP; 6456964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith} 6466964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith 64787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga NainarSourceLocation TemplateTemplateParmDecl::getDefaultArgumentLoc() const { 64887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return hasDefaultArgument() ? getDefaultArgument().getLocation() 64987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar : SourceLocation(); 65087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar} 65187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 652b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarvoid TemplateTemplateParmDecl::setDefaultArgument( 653b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar const ASTContext &C, const TemplateArgumentLoc &DefArg) { 654b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar if (DefArg.getArgument().isNull()) 655b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar DefaultArgument.set(nullptr); 656b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar else 657b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar DefaultArgument.set(new (C) TemplateArgumentLoc(DefArg)); 658b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar} 659b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar 6603e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor//===----------------------------------------------------------------------===// 6617e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor// TemplateArgumentList Implementation 6627e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor//===----------------------------------------------------------------------===// 6634967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTemplateArgumentList::TemplateArgumentList(ArrayRef<TemplateArgument> Args) 6644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar : Arguments(getTrailingObjects<TemplateArgument>()), 6654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar NumArguments(Args.size()) { 6664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar std::uninitialized_copy(Args.begin(), Args.end(), 66787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar getTrailingObjects<TemplateArgument>()); 66887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar} 66987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 670910f8008fea79120489a53593fe971b0b8a4a740Douglas GregorTemplateArgumentList * 671910f8008fea79120489a53593fe971b0b8a4a740Douglas GregorTemplateArgumentList::CreateCopy(ASTContext &Context, 6724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ArrayRef<TemplateArgument> Args) { 6734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar void *Mem = Context.Allocate(totalSizeToAlloc<TemplateArgument>(Args.size())); 6744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return new (Mem) TemplateArgumentList(Args); 67594d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis} 67694d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis 67771a7605977113c795edd44fcbd2302ad49506653Argyrios KyrtzidisFunctionTemplateSpecializationInfo * 67871a7605977113c795edd44fcbd2302ad49506653Argyrios KyrtzidisFunctionTemplateSpecializationInfo::Create(ASTContext &C, FunctionDecl *FD, 67971a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis FunctionTemplateDecl *Template, 68071a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis TemplateSpecializationKind TSK, 68171a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis const TemplateArgumentList *TemplateArgs, 68271a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis const TemplateArgumentListInfo *TemplateArgsAsWritten, 68371a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis SourceLocation POI) { 6846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines const ASTTemplateArgumentListInfo *ArgsAsWritten = nullptr; 68571a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis if (TemplateArgsAsWritten) 68671a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis ArgsAsWritten = ASTTemplateArgumentListInfo::Create(C, 68771a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis *TemplateArgsAsWritten); 68871a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis 68971a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis return new (C) FunctionTemplateSpecializationInfo(FD, Template, TSK, 69071a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis TemplateArgs, 69171a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis ArgsAsWritten, 69271a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis POI); 69371a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis} 69471a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis 6957e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor//===----------------------------------------------------------------------===// 69699ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie// TemplateDecl Implementation 69799ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie//===----------------------------------------------------------------------===// 69899ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie 69999ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid TemplateDecl::anchor() { } 70099ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie 70199ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie//===----------------------------------------------------------------------===// 7023e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor// ClassTemplateSpecializationDecl Implementation 7033e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor//===----------------------------------------------------------------------===// 7043e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas GregorClassTemplateSpecializationDecl:: 70513c8577201e4fc0ddac5f09d05fd1778832137d1Douglas GregorClassTemplateSpecializationDecl(ASTContext &Context, Kind DK, TagKind TK, 706ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara DeclContext *DC, SourceLocation StartLoc, 707ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara SourceLocation IdLoc, 7083e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor ClassTemplateDecl *SpecializedTemplate, 7094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ArrayRef<TemplateArgument> Args, 7108e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor ClassTemplateSpecializationDecl *PrevDecl) 7116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines : CXXRecordDecl(DK, TK, Context, DC, StartLoc, IdLoc, 7128e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor SpecializedTemplate->getIdentifier(), 7138e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor PrevDecl), 7143e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor SpecializedTemplate(SpecializedTemplate), 7156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ExplicitInfo(nullptr), 7164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar TemplateArgs(TemplateArgumentList::CreateCopy(Context, Args)), 7177e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor SpecializationKind(TSK_Undeclared) { 7183e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor} 7191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesClassTemplateSpecializationDecl::ClassTemplateSpecializationDecl(ASTContext &C, 7216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Kind DK) 7226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines : CXXRecordDecl(DK, TTK_Struct, C, nullptr, SourceLocation(), 7236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines SourceLocation(), nullptr, nullptr), 7246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ExplicitInfo(nullptr), SpecializationKind(TSK_Undeclared) {} 72594d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis 7263e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas GregorClassTemplateSpecializationDecl * 72713c8577201e4fc0ddac5f09d05fd1778832137d1Douglas GregorClassTemplateSpecializationDecl::Create(ASTContext &Context, TagKind TK, 728ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara DeclContext *DC, 729ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara SourceLocation StartLoc, 730ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara SourceLocation IdLoc, 7313e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor ClassTemplateDecl *SpecializedTemplate, 7324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ArrayRef<TemplateArgument> Args, 733cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor ClassTemplateSpecializationDecl *PrevDecl) { 734651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ClassTemplateSpecializationDecl *Result = 735651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines new (Context, DC) ClassTemplateSpecializationDecl( 736651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Context, ClassTemplateSpecialization, TK, DC, StartLoc, IdLoc, 7374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar SpecializedTemplate, Args, PrevDecl); 7386bd992946bda92193fadce7e4890d4465d2702f4Douglas Gregor Result->MayHaveOutOfDateDef = false; 7396bd992946bda92193fadce7e4890d4465d2702f4Douglas Gregor 740cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor Context.getTypeDeclType(Result, PrevDecl); 741cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor return Result; 7423e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor} 743c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor 74494d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios KyrtzidisClassTemplateSpecializationDecl * 745651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesClassTemplateSpecializationDecl::CreateDeserialized(ASTContext &C, 7461e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor unsigned ID) { 7476bd992946bda92193fadce7e4890d4465d2702f4Douglas Gregor ClassTemplateSpecializationDecl *Result = 7486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines new (C, ID) ClassTemplateSpecializationDecl(C, ClassTemplateSpecialization); 7496bd992946bda92193fadce7e4890d4465d2702f4Douglas Gregor Result->MayHaveOutOfDateDef = false; 7506bd992946bda92193fadce7e4890d4465d2702f4Douglas Gregor return Result; 75194d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis} 75294d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis 7535eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramervoid ClassTemplateSpecializationDecl::getNameForDiagnostic( 7545eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer raw_ostream &OS, const PrintingPolicy &Policy, bool Qualified) const { 7555eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer NamedDecl::getNameForDiagnostic(OS, Policy, Qualified); 756da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor 757da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor const TemplateArgumentList &TemplateArgs = getTemplateArgs(); 7585eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer TemplateSpecializationType::PrintTemplateArgumentList( 7594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar OS, TemplateArgs.asArray(), Policy); 760da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor} 761da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor 76237d93e9252026d4fb836d9c05d0122a2d46e56beDouglas GregorClassTemplateDecl * 7631eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpClassTemplateSpecializationDecl::getSpecializedTemplate() const { 7641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (SpecializedPartialSpecialization *PartialSpec 76537d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor = SpecializedTemplate.dyn_cast<SpecializedPartialSpecialization*>()) 76637d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor return PartialSpec->PartialSpecialization->getSpecializedTemplate(); 76737d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor return SpecializedTemplate.get<ClassTemplateDecl*>(); 76837d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor} 76937d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor 7704a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo BagnaraSourceRange 7714a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo BagnaraClassTemplateSpecializationDecl::getSourceRange() const { 77209d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara if (ExplicitInfo) { 773b2e80013dbf316f83716a9d9cdc9a6ed5a5a8e2aAbramo Bagnara SourceLocation Begin = getTemplateKeywordLoc(); 774b2e80013dbf316f83716a9d9cdc9a6ed5a5a8e2aAbramo Bagnara if (Begin.isValid()) { 775b2e80013dbf316f83716a9d9cdc9a6ed5a5a8e2aAbramo Bagnara // Here we have an explicit (partial) specialization or instantiation. 776b2e80013dbf316f83716a9d9cdc9a6ed5a5a8e2aAbramo Bagnara assert(getSpecializationKind() == TSK_ExplicitSpecialization || 777b2e80013dbf316f83716a9d9cdc9a6ed5a5a8e2aAbramo Bagnara getSpecializationKind() == TSK_ExplicitInstantiationDeclaration || 778b2e80013dbf316f83716a9d9cdc9a6ed5a5a8e2aAbramo Bagnara getSpecializationKind() == TSK_ExplicitInstantiationDefinition); 779b2e80013dbf316f83716a9d9cdc9a6ed5a5a8e2aAbramo Bagnara if (getExternLoc().isValid()) 780b2e80013dbf316f83716a9d9cdc9a6ed5a5a8e2aAbramo Bagnara Begin = getExternLoc(); 781b2e80013dbf316f83716a9d9cdc9a6ed5a5a8e2aAbramo Bagnara SourceLocation End = getRBraceLoc(); 782b2e80013dbf316f83716a9d9cdc9a6ed5a5a8e2aAbramo Bagnara if (End.isInvalid()) 783b2e80013dbf316f83716a9d9cdc9a6ed5a5a8e2aAbramo Bagnara End = getTypeAsWritten()->getTypeLoc().getEndLoc(); 784b2e80013dbf316f83716a9d9cdc9a6ed5a5a8e2aAbramo Bagnara return SourceRange(Begin, End); 785b2e80013dbf316f83716a9d9cdc9a6ed5a5a8e2aAbramo Bagnara } 786b2e80013dbf316f83716a9d9cdc9a6ed5a5a8e2aAbramo Bagnara // An implicit instantiation of a class template partial specialization 787b2e80013dbf316f83716a9d9cdc9a6ed5a5a8e2aAbramo Bagnara // uses ExplicitInfo to record the TypeAsWritten, but the source 788b2e80013dbf316f83716a9d9cdc9a6ed5a5a8e2aAbramo Bagnara // locations should be retrieved from the instantiation pattern. 789b2e80013dbf316f83716a9d9cdc9a6ed5a5a8e2aAbramo Bagnara typedef ClassTemplatePartialSpecializationDecl CTPSDecl; 790b2e80013dbf316f83716a9d9cdc9a6ed5a5a8e2aAbramo Bagnara CTPSDecl *ctpsd = const_cast<CTPSDecl*>(cast<CTPSDecl>(this)); 791b2e80013dbf316f83716a9d9cdc9a6ed5a5a8e2aAbramo Bagnara CTPSDecl *inst_from = ctpsd->getInstantiatedFromMember(); 7926bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines assert(inst_from != nullptr); 793b2e80013dbf316f83716a9d9cdc9a6ed5a5a8e2aAbramo Bagnara return inst_from->getSourceRange(); 79409d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara } 79509d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara else { 79609d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara // No explicit info available. 79709d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara llvm::PointerUnion<ClassTemplateDecl *, 79809d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara ClassTemplatePartialSpecializationDecl *> 79909d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara inst_from = getInstantiatedFrom(); 80009d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara if (inst_from.isNull()) 80109d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara return getSpecializedTemplate()->getSourceRange(); 80209d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara if (ClassTemplateDecl *ctd = inst_from.dyn_cast<ClassTemplateDecl*>()) 80309d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara return ctd->getSourceRange(); 80409d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara return inst_from.get<ClassTemplatePartialSpecializationDecl*>() 80509d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara ->getSourceRange(); 80609d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara } 8074a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo Bagnara} 8084a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo Bagnara 809c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor//===----------------------------------------------------------------------===// 810c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor// ClassTemplatePartialSpecializationDecl Implementation 811c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor//===----------------------------------------------------------------------===// 81299ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid ClassTemplatePartialSpecializationDecl::anchor() { } 81399ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie 8149a299e0575ce235f491014627c7267e2d2cd73deDouglas GregorClassTemplatePartialSpecializationDecl:: 8159a299e0575ce235f491014627c7267e2d2cd73deDouglas GregorClassTemplatePartialSpecializationDecl(ASTContext &Context, TagKind TK, 816ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara DeclContext *DC, 817ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara SourceLocation StartLoc, 818ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara SourceLocation IdLoc, 8199a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor TemplateParameterList *Params, 8209a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor ClassTemplateDecl *SpecializedTemplate, 8214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ArrayRef<TemplateArgument> Args, 822c1cef0892e049fcd31084f02d1efdd9985d4dfa4Enea Zaffanella const ASTTemplateArgumentListInfo *ArgInfos, 82337fd27dbb941d27f4bd7412e534e7e5089d6781bRichard Smith ClassTemplatePartialSpecializationDecl *PrevDecl) 8249a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor : ClassTemplateSpecializationDecl(Context, 8259a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor ClassTemplatePartialSpecialization, 826ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara TK, DC, StartLoc, IdLoc, 827ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara SpecializedTemplate, 8284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Args, PrevDecl), 8299a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor TemplateParams(Params), ArgsAsWritten(ArgInfos), 8306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines InstantiatedFromMember(nullptr, false) 831c1cef0892e049fcd31084f02d1efdd9985d4dfa4Enea Zaffanella{ 832787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor AdoptTemplateParameterList(Params, this); 8339a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor} 8349a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor 835c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas GregorClassTemplatePartialSpecializationDecl * 836c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas GregorClassTemplatePartialSpecializationDecl:: 837ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo BagnaraCreate(ASTContext &Context, TagKind TK,DeclContext *DC, 838ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara SourceLocation StartLoc, SourceLocation IdLoc, 839c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor TemplateParameterList *Params, 840c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor ClassTemplateDecl *SpecializedTemplate, 8414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ArrayRef<TemplateArgument> Args, 842d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall const TemplateArgumentListInfo &ArgInfos, 8433cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall QualType CanonInjectedType, 84437fd27dbb941d27f4bd7412e534e7e5089d6781bRichard Smith ClassTemplatePartialSpecializationDecl *PrevDecl) { 845c1cef0892e049fcd31084f02d1efdd9985d4dfa4Enea Zaffanella const ASTTemplateArgumentListInfo *ASTArgInfos = 846c1cef0892e049fcd31084f02d1efdd9985d4dfa4Enea Zaffanella ASTTemplateArgumentListInfo::Create(Context, ArgInfos); 847833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 848651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ClassTemplatePartialSpecializationDecl *Result = new (Context, DC) 849651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ClassTemplatePartialSpecializationDecl(Context, TK, DC, StartLoc, IdLoc, 850651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Params, SpecializedTemplate, Args, 8514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ASTArgInfos, PrevDecl); 852c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor Result->setSpecializationKind(TSK_ExplicitSpecialization); 8536bd992946bda92193fadce7e4890d4465d2702f4Douglas Gregor Result->MayHaveOutOfDateDef = false; 8543cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall 8553cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall Context.getInjectedClassNameType(Result, CanonInjectedType); 856c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor return Result; 857c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor} 858dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall 85994d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios KyrtzidisClassTemplatePartialSpecializationDecl * 8601e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorClassTemplatePartialSpecializationDecl::CreateDeserialized(ASTContext &C, 8611e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor unsigned ID) { 862651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ClassTemplatePartialSpecializationDecl *Result = 8636bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines new (C, ID) ClassTemplatePartialSpecializationDecl(C); 8646bd992946bda92193fadce7e4890d4465d2702f4Douglas Gregor Result->MayHaveOutOfDateDef = false; 8656bd992946bda92193fadce7e4890d4465d2702f4Douglas Gregor return Result; 86694d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis} 86794d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis 868dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall//===----------------------------------------------------------------------===// 869dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall// FriendTemplateDecl Implementation 870dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall//===----------------------------------------------------------------------===// 871dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall 87299ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid FriendTemplateDecl::anchor() { } 87399ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie 8744967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarFriendTemplateDecl * 8754967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarFriendTemplateDecl::Create(ASTContext &Context, DeclContext *DC, 8764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar SourceLocation L, 8774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar MutableArrayRef<TemplateParameterList *> Params, 8784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar FriendUnion Friend, SourceLocation FLoc) { 8794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return new (Context, DC) FriendTemplateDecl(DC, L, Params, Friend, FLoc); 880dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall} 881554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis 8821e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorFriendTemplateDecl *FriendTemplateDecl::CreateDeserialized(ASTContext &C, 8831e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor unsigned ID) { 884651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return new (C, ID) FriendTemplateDecl(EmptyShell()); 885554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis} 8863e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith 8873e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith//===----------------------------------------------------------------------===// 8883e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith// TypeAliasTemplateDecl Implementation 8893e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith//===----------------------------------------------------------------------===// 8903e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith 8913e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard SmithTypeAliasTemplateDecl *TypeAliasTemplateDecl::Create(ASTContext &C, 8923e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith DeclContext *DC, 8933e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith SourceLocation L, 8943e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith DeclarationName Name, 8953e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith TemplateParameterList *Params, 8963e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith NamedDecl *Decl) { 8973e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith AdoptTemplateParameterList(Params, DC); 8986bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return new (C, DC) TypeAliasTemplateDecl(C, DC, L, Name, Params, Decl); 8993e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith} 9003e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith 9011e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorTypeAliasTemplateDecl *TypeAliasTemplateDecl::CreateDeserialized(ASTContext &C, 9021e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor unsigned ID) { 9036bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return new (C, ID) TypeAliasTemplateDecl(C, nullptr, SourceLocation(), 9046bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines DeclarationName(), nullptr, nullptr); 9053e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith} 9063e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith 9073e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smithvoid TypeAliasTemplateDecl::DeallocateCommon(void *Ptr) { 9083e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith static_cast<Common *>(Ptr)->~Common(); 9093e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith} 9103e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard SmithRedeclarableTemplateDecl::CommonBase * 911b76d9718caea48b9333979b3da6f3a80110840cbDmitri GribenkoTypeAliasTemplateDecl::newCommon(ASTContext &C) const { 9123e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith Common *CommonPtr = new (C) Common; 9133e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith C.AddDeallocation(DeallocateCommon, CommonPtr); 9143e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith return CommonPtr; 9153e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith} 9163e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith 91799ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie//===----------------------------------------------------------------------===// 91899ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie// ClassScopeFunctionSpecializationDecl Implementation 91999ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie//===----------------------------------------------------------------------===// 92099ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie 92199ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid ClassScopeFunctionSpecializationDecl::anchor() { } 9221e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor 9231e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorClassScopeFunctionSpecializationDecl * 9241e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorClassScopeFunctionSpecializationDecl::CreateDeserialized(ASTContext &C, 9251e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor unsigned ID) { 926651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return new (C, ID) ClassScopeFunctionSpecializationDecl( 9276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines nullptr, SourceLocation(), nullptr, false, TemplateArgumentListInfo()); 9281e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor} 929ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 930ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo//===----------------------------------------------------------------------===// 931ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo// VarTemplateDecl Implementation 932ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo//===----------------------------------------------------------------------===// 933ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 934ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufovoid VarTemplateDecl::DeallocateCommon(void *Ptr) { 935ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo static_cast<Common *>(Ptr)->~Common(); 936ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo} 937ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 938439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse VoufoVarTemplateDecl *VarTemplateDecl::getDefinition() { 939439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo VarTemplateDecl *CurD = this; 940439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo while (CurD) { 941439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo if (CurD->isThisDeclarationADefinition()) 942439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo return CurD; 943439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo CurD = CurD->getPreviousDecl(); 944439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo } 9456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 946439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo} 947439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo 948ef4579cda09b73e3d4d98af48201da25adc29326Larisse VoufoVarTemplateDecl *VarTemplateDecl::Create(ASTContext &C, DeclContext *DC, 949ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo SourceLocation L, DeclarationName Name, 950ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo TemplateParameterList *Params, 951651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines VarDecl *Decl) { 9526bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return new (C, DC) VarTemplateDecl(C, DC, L, Name, Params, Decl); 953ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo} 954ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 955ef4579cda09b73e3d4d98af48201da25adc29326Larisse VoufoVarTemplateDecl *VarTemplateDecl::CreateDeserialized(ASTContext &C, 956ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo unsigned ID) { 9576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return new (C, ID) VarTemplateDecl(C, nullptr, SourceLocation(), 9586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines DeclarationName(), nullptr, nullptr); 959ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo} 960ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 961651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// TODO: Unify across class, function and variable templates? 9628d2a5ea694ed0002b45deb2bd35db451b16a07d6Larisse Voufo// May require moving this and Common to RedeclarableTemplateDecl. 963ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufovoid VarTemplateDecl::LoadLazySpecializations() const { 9640e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // Grab the most recent declaration to ensure we've loaded any lazy 9650e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // redeclarations of this template. 9660e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // 9670e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // FIXME: Avoid walking the entire redeclaration chain here. 9680e2c34f92f00628d48968dfea096d36381f494cbStephen Hines Common *CommonPtr = getMostRecentDecl()->getCommonPtr(); 969ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo if (CommonPtr->LazySpecializations) { 970ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo ASTContext &Context = getASTContext(); 971ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo uint32_t *Specs = CommonPtr->LazySpecializations; 9726bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines CommonPtr->LazySpecializations = nullptr; 973ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo for (uint32_t I = 0, N = *Specs++; I != N; ++I) 974ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo (void)Context.getExternalSource()->GetExternalDecl(Specs[I]); 975ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo } 976ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo} 977ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 978ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufollvm::FoldingSetVector<VarTemplateSpecializationDecl> & 979ef4579cda09b73e3d4d98af48201da25adc29326Larisse VoufoVarTemplateDecl::getSpecializations() const { 980ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo LoadLazySpecializations(); 981ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo return getCommonPtr()->Specializations; 982ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo} 983ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 984ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufollvm::FoldingSetVector<VarTemplatePartialSpecializationDecl> & 985ef4579cda09b73e3d4d98af48201da25adc29326Larisse VoufoVarTemplateDecl::getPartialSpecializations() { 986ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo LoadLazySpecializations(); 987ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo return getCommonPtr()->PartialSpecializations; 988ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo} 989ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 990ef4579cda09b73e3d4d98af48201da25adc29326Larisse VoufoRedeclarableTemplateDecl::CommonBase * 991ef4579cda09b73e3d4d98af48201da25adc29326Larisse VoufoVarTemplateDecl::newCommon(ASTContext &C) const { 992ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo Common *CommonPtr = new (C) Common; 993ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo C.AddDeallocation(DeallocateCommon, CommonPtr); 994ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo return CommonPtr; 995ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo} 996ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 997ef4579cda09b73e3d4d98af48201da25adc29326Larisse VoufoVarTemplateSpecializationDecl * 998c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen HinesVarTemplateDecl::findSpecialization(ArrayRef<TemplateArgument> Args, 999c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines void *&InsertPos) { 1000c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines return findSpecializationImpl(getSpecializations(), Args, InsertPos); 1001ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo} 1002ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 1003ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufovoid VarTemplateDecl::AddSpecialization(VarTemplateSpecializationDecl *D, 1004ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo void *InsertPos) { 10050e2c34f92f00628d48968dfea096d36381f494cbStephen Hines addSpecializationImpl<VarTemplateDecl>(getSpecializations(), D, InsertPos); 1006ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo} 1007ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 1008ef4579cda09b73e3d4d98af48201da25adc29326Larisse VoufoVarTemplatePartialSpecializationDecl * 1009c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen HinesVarTemplateDecl::findPartialSpecialization(ArrayRef<TemplateArgument> Args, 1010c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines void *&InsertPos) { 1011c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines return findSpecializationImpl(getPartialSpecializations(), Args, InsertPos); 1012ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo} 1013ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 1014ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufovoid VarTemplateDecl::AddPartialSpecialization( 1015ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo VarTemplatePartialSpecializationDecl *D, void *InsertPos) { 1016ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo if (InsertPos) 1017ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo getPartialSpecializations().InsertNode(D, InsertPos); 1018ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo else { 1019ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo VarTemplatePartialSpecializationDecl *Existing = 1020ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo getPartialSpecializations().GetOrInsertNode(D); 1021ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo (void)Existing; 1022ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo assert(Existing->isCanonicalDecl() && "Non-canonical specialization?"); 1023ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo } 1024ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 1025ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo if (ASTMutationListener *L = getASTMutationListener()) 1026ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo L->AddedCXXTemplateSpecialization(this, D); 1027ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo} 1028ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 1029ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufovoid VarTemplateDecl::getPartialSpecializations( 1030ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo SmallVectorImpl<VarTemplatePartialSpecializationDecl *> &PS) { 1031ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo llvm::FoldingSetVector<VarTemplatePartialSpecializationDecl> &PartialSpecs = 1032ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo getPartialSpecializations(); 1033ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo PS.clear(); 103437fd27dbb941d27f4bd7412e534e7e5089d6781bRichard Smith PS.reserve(PartialSpecs.size()); 10354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar for (VarTemplatePartialSpecializationDecl &P : PartialSpecs) 10364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar PS.push_back(P.getMostRecentDecl()); 1037ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo} 1038ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 1039ef4579cda09b73e3d4d98af48201da25adc29326Larisse VoufoVarTemplatePartialSpecializationDecl * 1040ef4579cda09b73e3d4d98af48201da25adc29326Larisse VoufoVarTemplateDecl::findPartialSpecInstantiatedFromMember( 1041ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo VarTemplatePartialSpecializationDecl *D) { 1042ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo Decl *DCanon = D->getCanonicalDecl(); 10434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar for (VarTemplatePartialSpecializationDecl &P : getPartialSpecializations()) { 10444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar if (P.getInstantiatedFromMember()->getCanonicalDecl() == DCanon) 10454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return P.getMostRecentDecl(); 1046ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo } 1047ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 10486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 1049ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo} 1050ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 1051ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo//===----------------------------------------------------------------------===// 1052ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo// VarTemplateSpecializationDecl Implementation 1053ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo//===----------------------------------------------------------------------===// 1054ef4579cda09b73e3d4d98af48201da25adc29326Larisse VoufoVarTemplateSpecializationDecl::VarTemplateSpecializationDecl( 10556bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Kind DK, ASTContext &Context, DeclContext *DC, SourceLocation StartLoc, 1056ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo SourceLocation IdLoc, VarTemplateDecl *SpecializedTemplate, QualType T, 10574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar TypeSourceInfo *TInfo, StorageClass S, ArrayRef<TemplateArgument> Args) 10586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines : VarDecl(DK, Context, DC, StartLoc, IdLoc, 10596bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines SpecializedTemplate->getIdentifier(), T, TInfo, S), 10606bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines SpecializedTemplate(SpecializedTemplate), ExplicitInfo(nullptr), 10614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar TemplateArgs(TemplateArgumentList::CreateCopy(Context, Args)), 1062ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo SpecializationKind(TSK_Undeclared) {} 1063ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 10646bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesVarTemplateSpecializationDecl::VarTemplateSpecializationDecl(Kind DK, 10656bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ASTContext &C) 10666bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines : VarDecl(DK, C, nullptr, SourceLocation(), SourceLocation(), nullptr, 10676bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines QualType(), nullptr, SC_None), 10686bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ExplicitInfo(nullptr), SpecializationKind(TSK_Undeclared) {} 1069ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 1070ef4579cda09b73e3d4d98af48201da25adc29326Larisse VoufoVarTemplateSpecializationDecl *VarTemplateSpecializationDecl::Create( 1071ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo ASTContext &Context, DeclContext *DC, SourceLocation StartLoc, 1072ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo SourceLocation IdLoc, VarTemplateDecl *SpecializedTemplate, QualType T, 10734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar TypeSourceInfo *TInfo, StorageClass S, ArrayRef<TemplateArgument> Args) { 1074651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return new (Context, DC) VarTemplateSpecializationDecl( 10756bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines VarTemplateSpecialization, Context, DC, StartLoc, IdLoc, 10764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar SpecializedTemplate, T, TInfo, S, Args); 1077ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo} 1078ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 1079ef4579cda09b73e3d4d98af48201da25adc29326Larisse VoufoVarTemplateSpecializationDecl * 1080ef4579cda09b73e3d4d98af48201da25adc29326Larisse VoufoVarTemplateSpecializationDecl::CreateDeserialized(ASTContext &C, unsigned ID) { 10816bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return new (C, ID) 10826bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines VarTemplateSpecializationDecl(VarTemplateSpecialization, C); 1083ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo} 1084ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 1085ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufovoid VarTemplateSpecializationDecl::getNameForDiagnostic( 1086ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo raw_ostream &OS, const PrintingPolicy &Policy, bool Qualified) const { 1087ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo NamedDecl::getNameForDiagnostic(OS, Policy, Qualified); 1088ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 1089ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo const TemplateArgumentList &TemplateArgs = getTemplateArgs(); 1090ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo TemplateSpecializationType::PrintTemplateArgumentList( 10914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar OS, TemplateArgs.asArray(), Policy); 1092ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo} 1093ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 1094ef4579cda09b73e3d4d98af48201da25adc29326Larisse VoufoVarTemplateDecl *VarTemplateSpecializationDecl::getSpecializedTemplate() const { 1095ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo if (SpecializedPartialSpecialization *PartialSpec = 1096ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo SpecializedTemplate.dyn_cast<SpecializedPartialSpecialization *>()) 1097ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo return PartialSpec->PartialSpecialization->getSpecializedTemplate(); 1098ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo return SpecializedTemplate.get<VarTemplateDecl *>(); 1099ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo} 1100ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 1101ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufovoid VarTemplateSpecializationDecl::setTemplateArgsInfo( 1102ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo const TemplateArgumentListInfo &ArgsInfo) { 1103ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo TemplateArgsInfo.setLAngleLoc(ArgsInfo.getLAngleLoc()); 1104ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo TemplateArgsInfo.setRAngleLoc(ArgsInfo.getRAngleLoc()); 11054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar for (const TemplateArgumentLoc &Loc : ArgsInfo.arguments()) 11064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar TemplateArgsInfo.addArgument(Loc); 1107ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo} 1108ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 1109ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo//===----------------------------------------------------------------------===// 1110ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo// VarTemplatePartialSpecializationDecl Implementation 1111ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo//===----------------------------------------------------------------------===// 1112ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufovoid VarTemplatePartialSpecializationDecl::anchor() {} 1113ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 1114ef4579cda09b73e3d4d98af48201da25adc29326Larisse VoufoVarTemplatePartialSpecializationDecl::VarTemplatePartialSpecializationDecl( 1115ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo ASTContext &Context, DeclContext *DC, SourceLocation StartLoc, 1116ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo SourceLocation IdLoc, TemplateParameterList *Params, 1117ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo VarTemplateDecl *SpecializedTemplate, QualType T, TypeSourceInfo *TInfo, 11184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar StorageClass S, ArrayRef<TemplateArgument> Args, 111937fd27dbb941d27f4bd7412e534e7e5089d6781bRichard Smith const ASTTemplateArgumentListInfo *ArgInfos) 11206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines : VarTemplateSpecializationDecl(VarTemplatePartialSpecialization, Context, 1121ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo DC, StartLoc, IdLoc, SpecializedTemplate, T, 11224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar TInfo, S, Args), 1123ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo TemplateParams(Params), ArgsAsWritten(ArgInfos), 11246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines InstantiatedFromMember(nullptr, false) { 1125ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo // TODO: The template parameters should be in DC by now. Verify. 1126ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo // AdoptTemplateParameterList(Params, DC); 1127ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo} 1128ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 1129ef4579cda09b73e3d4d98af48201da25adc29326Larisse VoufoVarTemplatePartialSpecializationDecl * 1130ef4579cda09b73e3d4d98af48201da25adc29326Larisse VoufoVarTemplatePartialSpecializationDecl::Create( 1131ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo ASTContext &Context, DeclContext *DC, SourceLocation StartLoc, 1132ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo SourceLocation IdLoc, TemplateParameterList *Params, 1133ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo VarTemplateDecl *SpecializedTemplate, QualType T, TypeSourceInfo *TInfo, 11344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar StorageClass S, ArrayRef<TemplateArgument> Args, 113537fd27dbb941d27f4bd7412e534e7e5089d6781bRichard Smith const TemplateArgumentListInfo &ArgInfos) { 1136c1cef0892e049fcd31084f02d1efdd9985d4dfa4Enea Zaffanella const ASTTemplateArgumentListInfo *ASTArgInfos 1137c1cef0892e049fcd31084f02d1efdd9985d4dfa4Enea Zaffanella = ASTTemplateArgumentListInfo::Create(Context, ArgInfos); 1138ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 1139ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo VarTemplatePartialSpecializationDecl *Result = 1140651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines new (Context, DC) VarTemplatePartialSpecializationDecl( 1141ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo Context, DC, StartLoc, IdLoc, Params, SpecializedTemplate, T, TInfo, 11424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar S, Args, ASTArgInfos); 1143ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo Result->setSpecializationKind(TSK_ExplicitSpecialization); 1144ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo return Result; 1145ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo} 1146ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 1147ef4579cda09b73e3d4d98af48201da25adc29326Larisse VoufoVarTemplatePartialSpecializationDecl * 1148ef4579cda09b73e3d4d98af48201da25adc29326Larisse VoufoVarTemplatePartialSpecializationDecl::CreateDeserialized(ASTContext &C, 1149ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo unsigned ID) { 11506bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return new (C, ID) VarTemplatePartialSpecializationDecl(C); 1151ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo} 115287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 115387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarstatic TemplateParameterList * 115487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga NainarcreateMakeIntegerSeqParameterList(const ASTContext &C, DeclContext *DC) { 115587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // typename T 115687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar auto *T = TemplateTypeParmDecl::Create( 115787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar C, DC, SourceLocation(), SourceLocation(), /*Depth=*/1, /*Position=*/0, 115887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar /*Id=*/nullptr, /*Typename=*/true, /*ParameterPack=*/false); 115987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar T->setImplicit(true); 116087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 116187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // T ...Ints 116287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar TypeSourceInfo *TI = 116387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar C.getTrivialTypeSourceInfo(QualType(T->getTypeForDecl(), 0)); 116487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar auto *N = NonTypeTemplateParmDecl::Create( 116587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar C, DC, SourceLocation(), SourceLocation(), /*Depth=*/0, /*Position=*/1, 116687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar /*Id=*/nullptr, TI->getType(), /*ParameterPack=*/true, TI); 116787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar N->setImplicit(true); 116887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 116987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // <typename T, T ...Ints> 117087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar NamedDecl *P[2] = {T, N}; 117187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar auto *TPL = TemplateParameterList::Create( 11724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar C, SourceLocation(), SourceLocation(), P, SourceLocation()); 117387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 117487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // template <typename T, ...Ints> class IntSeq 117587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar auto *TemplateTemplateParm = TemplateTemplateParmDecl::Create( 117687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar C, DC, SourceLocation(), /*Depth=*/0, /*Position=*/0, 117787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar /*ParameterPack=*/false, /*Id=*/nullptr, TPL); 117887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar TemplateTemplateParm->setImplicit(true); 117987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 118087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // typename T 118187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar auto *TemplateTypeParm = TemplateTypeParmDecl::Create( 118287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar C, DC, SourceLocation(), SourceLocation(), /*Depth=*/0, /*Position=*/1, 118387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar /*Id=*/nullptr, /*Typename=*/true, /*ParameterPack=*/false); 118487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar TemplateTypeParm->setImplicit(true); 118587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 118687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // T N 118787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar TypeSourceInfo *TInfo = C.getTrivialTypeSourceInfo( 118887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar QualType(TemplateTypeParm->getTypeForDecl(), 0)); 118987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar auto *NonTypeTemplateParm = NonTypeTemplateParmDecl::Create( 119087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar C, DC, SourceLocation(), SourceLocation(), /*Depth=*/0, /*Position=*/2, 119187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar /*Id=*/nullptr, TInfo->getType(), /*ParameterPack=*/false, TInfo); 119287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar NamedDecl *Params[] = {TemplateTemplateParm, TemplateTypeParm, 119387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar NonTypeTemplateParm}; 119487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 119587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar // template <template <typename T, T ...Ints> class IntSeq, typename T, T N> 119687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return TemplateParameterList::Create(C, SourceLocation(), SourceLocation(), 11974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Params, SourceLocation()); 11984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 11994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 12004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarstatic TemplateParameterList * 12014967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarcreateTypePackElementParameterList(const ASTContext &C, DeclContext *DC) { 12024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // std::size_t Index 12034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar TypeSourceInfo *TInfo = C.getTrivialTypeSourceInfo(C.getSizeType()); 12044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar auto *Index = NonTypeTemplateParmDecl::Create( 12054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar C, DC, SourceLocation(), SourceLocation(), /*Depth=*/0, /*Position=*/0, 12064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /*Id=*/nullptr, TInfo->getType(), /*ParameterPack=*/false, TInfo); 12074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 12084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // typename ...T 12094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar auto *Ts = TemplateTypeParmDecl::Create( 12104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar C, DC, SourceLocation(), SourceLocation(), /*Depth=*/0, /*Position=*/1, 12114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /*Id=*/nullptr, /*Typename=*/true, /*ParameterPack=*/true); 12124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar Ts->setImplicit(true); 12134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 12144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // template <std::size_t Index, typename ...T> 12154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar NamedDecl *Params[] = {Index, Ts}; 12164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return TemplateParameterList::Create(C, SourceLocation(), SourceLocation(), 12174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar llvm::makeArrayRef(Params), 12184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar SourceLocation()); 121987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar} 122087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 122187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarstatic TemplateParameterList *createBuiltinTemplateParameterList( 122287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar const ASTContext &C, DeclContext *DC, BuiltinTemplateKind BTK) { 122387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar switch (BTK) { 122487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar case BTK__make_integer_seq: 122587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar return createMakeIntegerSeqParameterList(C, DC); 12264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar case BTK__type_pack_element: 12274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return createTypePackElementParameterList(C, DC); 122887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar } 122987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 123087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar llvm_unreachable("unhandled BuiltinTemplateKind!"); 123187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar} 123287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 123387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarvoid BuiltinTemplateDecl::anchor() {} 123487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar 123587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga NainarBuiltinTemplateDecl::BuiltinTemplateDecl(const ASTContext &C, DeclContext *DC, 123687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar DeclarationName Name, 123787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar BuiltinTemplateKind BTK) 123887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar : TemplateDecl(BuiltinTemplate, DC, SourceLocation(), Name, 123987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar createBuiltinTemplateParameterList(C, DC, BTK)), 124087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar BTK(BTK) {} 1241