DeclTemplate.cpp revision 1e68ecc4fcce12f683c4fd38acfd1a004001b04f
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/DeclCXX.h" 15aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor#include "clang/AST/DeclTemplate.h" 1655f6b14230c94272efbbcdd89a92224c8db9f225Douglas Gregor#include "clang/AST/Expr.h" 17b95cc97b2023d00cd3fbae8455bc9d728eab5e5dDouglas Gregor#include "clang/AST/ExprCXX.h" 18aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor#include "clang/AST/ASTContext.h" 19833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall#include "clang/AST/TypeLoc.h" 20bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis#include "clang/AST/ASTMutationListener.h" 21aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor#include "clang/Basic/IdentifierTable.h" 22aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor#include "llvm/ADT/STLExtras.h" 23910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor#include <memory> 24aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregorusing namespace clang; 25aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 26aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 27aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// TemplateParameterList Implementation 28aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 29aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 30ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas GregorTemplateParameterList::TemplateParameterList(SourceLocation TemplateLoc, 31ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas Gregor SourceLocation LAngleLoc, 32bf4ea56cdc376cef5a12abf6bf18dc34805c2226Douglas Gregor NamedDecl **Params, unsigned NumParams, 33ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas Gregor SourceLocation RAngleLoc) 34ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas Gregor : TemplateLoc(TemplateLoc), LAngleLoc(LAngleLoc), RAngleLoc(RAngleLoc), 35ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas Gregor NumParams(NumParams) { 36aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor for (unsigned Idx = 0; Idx < NumParams; ++Idx) 37aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor begin()[Idx] = Params[Idx]; 38aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor} 39aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 40aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorTemplateParameterList * 414ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadTemplateParameterList::Create(const ASTContext &C, SourceLocation TemplateLoc, 42bf4ea56cdc376cef5a12abf6bf18dc34805c2226Douglas Gregor SourceLocation LAngleLoc, NamedDecl **Params, 43ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas Gregor unsigned NumParams, SourceLocation RAngleLoc) { 44bf4ea56cdc376cef5a12abf6bf18dc34805c2226Douglas Gregor unsigned Size = sizeof(TemplateParameterList) 45bf4ea56cdc376cef5a12abf6bf18dc34805c2226Douglas Gregor + sizeof(NamedDecl *) * NumParams; 46aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor unsigned Align = llvm::AlignOf<TemplateParameterList>::Alignment; 47aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor void *Mem = C.Allocate(Size, Align); 481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return new (Mem) TemplateParameterList(TemplateLoc, LAngleLoc, Params, 49ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas Gregor NumParams, RAngleLoc); 50aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor} 51aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 5262cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregorunsigned TemplateParameterList::getMinRequiredArguments() const { 536952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor unsigned NumRequiredArgs = 0; 546952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor for (iterator P = const_cast<TemplateParameterList *>(this)->begin(), 556952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor PEnd = const_cast<TemplateParameterList *>(this)->end(); 566952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor P != PEnd; ++P) { 576952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor if ((*P)->isTemplateParameterPack()) { 586952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor if (NonTypeTemplateParmDecl *NTTP = dyn_cast<NonTypeTemplateParmDecl>(*P)) 596952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor if (NTTP->isExpandedParameterPack()) { 606952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor NumRequiredArgs += NTTP->getNumExpansionTypes(); 616952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor continue; 626952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor } 636952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor 6462cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor break; 656952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor } 666952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor 676952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(*P)) { 686952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor if (TTP->hasDefaultArgument()) 696952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor break; 706952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor } else if (NonTypeTemplateParmDecl *NTTP 716952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor = dyn_cast<NonTypeTemplateParmDecl>(*P)) { 726952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor if (NTTP->hasDefaultArgument()) 736952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor break; 746952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor } else if (cast<TemplateTemplateParmDecl>(*P)->hasDefaultArgument()) 756952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor break; 766952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor 776952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor ++NumRequiredArgs; 7862cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor } 796952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor 8062cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor return NumRequiredArgs; 8162cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor} 8262cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor 83ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregorunsigned TemplateParameterList::getDepth() const { 84ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor if (size() == 0) 85ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor return 0; 86ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor 87ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor const NamedDecl *FirstParm = getParam(0); 88ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor if (const TemplateTypeParmDecl *TTP 89ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor = dyn_cast<TemplateTypeParmDecl>(FirstParm)) 90ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor return TTP->getDepth(); 91ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor else if (const NonTypeTemplateParmDecl *NTTP 92ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor = dyn_cast<NonTypeTemplateParmDecl>(FirstParm)) 93ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor return NTTP->getDepth(); 94ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor else 95ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor return cast<TemplateTemplateParmDecl>(FirstParm)->getDepth(); 96ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor} 97ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor 98787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregorstatic void AdoptTemplateParameterList(TemplateParameterList *Params, 99787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor DeclContext *Owner) { 100787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor for (TemplateParameterList::iterator P = Params->begin(), 101787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor PEnd = Params->end(); 102787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor P != PEnd; ++P) { 103787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor (*P)->setDeclContext(Owner); 104787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor 105787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor if (TemplateTemplateParmDecl *TTP = dyn_cast<TemplateTemplateParmDecl>(*P)) 106787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor AdoptTemplateParameterList(TTP->getTemplateParameters(), Owner); 107787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor } 108787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor} 109787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor 110aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 1119eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne// RedeclarableTemplateDecl Implementation 1129eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne//===----------------------------------------------------------------------===// 1139eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne 1149eabebafc165a67812eacc184806e7bf34c5f0a5Peter CollingbourneRedeclarableTemplateDecl::CommonBase *RedeclarableTemplateDecl::getCommonPtr() { 1159eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne // Find the first declaration of this function template. 1169eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne RedeclarableTemplateDecl *First = getCanonicalDecl(); 1179eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne 1189eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne if (First->CommonOrPrev.isNull()) { 1196b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis CommonBase *CommonPtr = First->newCommon(getASTContext()); 1209eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne First->CommonOrPrev = CommonPtr; 1218a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne CommonPtr->Latest = First; 1229eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne } 1239eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne return First->CommonOrPrev.get<CommonBase*>(); 1249eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne} 1259eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne 1269eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne 1279eabebafc165a67812eacc184806e7bf34c5f0a5Peter CollingbourneRedeclarableTemplateDecl *RedeclarableTemplateDecl::getCanonicalDeclImpl() { 1289eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne RedeclarableTemplateDecl *Tmpl = this; 1299eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne while (Tmpl->getPreviousDeclaration()) 1309eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne Tmpl = Tmpl->getPreviousDeclaration(); 1319eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne return Tmpl; 1329eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne} 1339eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne 1348a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbournevoid RedeclarableTemplateDecl::setPreviousDeclarationImpl( 1358a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne RedeclarableTemplateDecl *Prev) { 1368a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne if (Prev) { 1378a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne CommonBase *Common = Prev->getCommonPtr(); 1388a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne Prev = Common->Latest; 1398a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne Common->Latest = this; 1408a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne CommonOrPrev = Prev; 1418a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne } else { 1428a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne assert(CommonOrPrev.is<CommonBase*>() && "Cannot reset TemplateDecl Prev"); 1438a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne } 1448a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne} 1458a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne 146f88718ea0ca0d64b7fd31d109f1d9ec769a9c45fPeter CollingbourneRedeclarableTemplateDecl *RedeclarableTemplateDecl::getNextRedeclaration() { 147f88718ea0ca0d64b7fd31d109f1d9ec769a9c45fPeter Collingbourne if (CommonOrPrev.is<RedeclarableTemplateDecl*>()) 148f88718ea0ca0d64b7fd31d109f1d9ec769a9c45fPeter Collingbourne return CommonOrPrev.get<RedeclarableTemplateDecl*>(); 149f88718ea0ca0d64b7fd31d109f1d9ec769a9c45fPeter Collingbourne CommonBase *Common = CommonOrPrev.get<CommonBase*>(); 150f88718ea0ca0d64b7fd31d109f1d9ec769a9c45fPeter Collingbourne return Common ? Common->Latest : this; 151f88718ea0ca0d64b7fd31d109f1d9ec769a9c45fPeter Collingbourne} 152f88718ea0ca0d64b7fd31d109f1d9ec769a9c45fPeter Collingbourne 1534048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbournetemplate <class EntryType> 1544048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbournetypename RedeclarableTemplateDecl::SpecEntryTraits<EntryType>::DeclType* 1554048590d5774fd4b08661b5cf59b6f90b62f283aPeter CollingbourneRedeclarableTemplateDecl::findSpecializationImpl( 1564048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne llvm::FoldingSet<EntryType> &Specs, 1574048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne const TemplateArgument *Args, unsigned NumArgs, 1584048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne void *&InsertPos) { 1594048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne typedef SpecEntryTraits<EntryType> SETraits; 1604048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne llvm::FoldingSetNodeID ID; 1614048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne EntryType::Profile(ID,Args,NumArgs, getASTContext()); 1624048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne EntryType *Entry = Specs.FindNodeOrInsertPos(ID, InsertPos); 1634048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne return Entry ? SETraits::getMostRecentDeclaration(Entry) : 0; 1644048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne} 1654048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne 166c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor/// \brief Generate the injected template arguments for the given template 167c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor/// parameter list, e.g., for the injected-class-name of a class template. 168c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregorstatic void GenerateInjectedTemplateArgs(ASTContext &Context, 169c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor TemplateParameterList *Params, 170c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor TemplateArgument *Args) { 171c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor for (TemplateParameterList::iterator Param = Params->begin(), 172c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor ParamEnd = Params->end(); 173c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor Param != ParamEnd; ++Param) { 174c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor TemplateArgument Arg; 175c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(*Param)) { 176c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor QualType ArgType = Context.getTypeDeclType(TTP); 177c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor if (TTP->isParameterPack()) 178c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor ArgType = Context.getPackExpansionType(ArgType, 179c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor llvm::Optional<unsigned>()); 180c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor 181c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor Arg = TemplateArgument(ArgType); 182c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor } else if (NonTypeTemplateParmDecl *NTTP = 183c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor dyn_cast<NonTypeTemplateParmDecl>(*Param)) { 184c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor Expr *E = new (Context) DeclRefExpr(NTTP, 185c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor NTTP->getType().getNonLValueExprType(Context), 186c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor Expr::getValueKindForType(NTTP->getType()), 187c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor NTTP->getLocation()); 188c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor 189c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor if (NTTP->isParameterPack()) 190c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor E = new (Context) PackExpansionExpr(Context.DependentTy, E, 191c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor NTTP->getLocation(), 192c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor llvm::Optional<unsigned>()); 193c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor Arg = TemplateArgument(E); 194c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor } else { 195c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor TemplateTemplateParmDecl *TTP = cast<TemplateTemplateParmDecl>(*Param); 196c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor if (TTP->isParameterPack()) 197c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor Arg = TemplateArgument(TemplateName(TTP), llvm::Optional<unsigned>()); 198c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor else 199c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor Arg = TemplateArgument(TemplateName(TTP)); 200c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor } 201c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor 202c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor if ((*Param)->isTemplateParameterPack()) 203c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor Arg = TemplateArgument::CreatePackCopy(Context, &Arg, 1); 204c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor 205c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor *Args++ = Arg; 206c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor } 207c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor} 208c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor 2099eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne//===----------------------------------------------------------------------===// 210aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// FunctionTemplateDecl Implementation 211aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 212aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 2130054531488928a424666ac11fcdc6bcc5112de52Douglas Gregorvoid FunctionTemplateDecl::DeallocateCommon(void *Ptr) { 2140054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor static_cast<Common *>(Ptr)->~Common(); 2150054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor} 2160054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor 217aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorFunctionTemplateDecl *FunctionTemplateDecl::Create(ASTContext &C, 218aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor DeclContext *DC, 219aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor SourceLocation L, 220aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor DeclarationName Name, 221127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor TemplateParameterList *Params, 222aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor NamedDecl *Decl) { 223787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor AdoptTemplateParameterList(Params, cast<DeclContext>(Decl)); 224aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor return new (C) FunctionTemplateDecl(DC, L, Name, Params, Decl); 225aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor} 226aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 2271e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorFunctionTemplateDecl *FunctionTemplateDecl::CreateDeserialized(ASTContext &C, 2281e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor unsigned ID) { 2291e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor void *Mem = AllocateDeserializedDecl(C, ID, sizeof(FunctionTemplateDecl)); 2301e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor return new (Mem) FunctionTemplateDecl(0, SourceLocation(), DeclarationName(), 2311e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor 0, 0); 2329a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor} 2339a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor 2346b5415196327fa8ef00f028ba175fafef1738ae1Argyrios KyrtzidisRedeclarableTemplateDecl::CommonBase * 2356b5415196327fa8ef00f028ba175fafef1738ae1Argyrios KyrtzidisFunctionTemplateDecl::newCommon(ASTContext &C) { 2366b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis Common *CommonPtr = new (C) Common; 2376b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis C.AddDeallocation(DeallocateCommon, CommonPtr); 2389eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne return CommonPtr; 2399eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne} 2409eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne 2412c853e401ca406d417eb916e867226050e7be06bArgyrios KyrtzidisFunctionDecl * 2422c853e401ca406d417eb916e867226050e7be06bArgyrios KyrtzidisFunctionTemplateDecl::findSpecialization(const TemplateArgument *Args, 2432c853e401ca406d417eb916e867226050e7be06bArgyrios Kyrtzidis unsigned NumArgs, void *&InsertPos) { 2444048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne return findSpecializationImpl(getSpecializations(), Args, NumArgs, InsertPos); 2452c853e401ca406d417eb916e867226050e7be06bArgyrios Kyrtzidis} 2462c853e401ca406d417eb916e867226050e7be06bArgyrios Kyrtzidis 2475bbcdbf36f8cf79d99703ef20848c55960065e43Sebastian Redlvoid FunctionTemplateDecl::addSpecialization( 2485bbcdbf36f8cf79d99703ef20848c55960065e43Sebastian Redl FunctionTemplateSpecializationInfo *Info, void *InsertPos) { 2495bbcdbf36f8cf79d99703ef20848c55960065e43Sebastian Redl getSpecializations().InsertNode(Info, InsertPos); 2505bbcdbf36f8cf79d99703ef20848c55960065e43Sebastian Redl if (ASTMutationListener *L = getASTMutationListener()) 2515bbcdbf36f8cf79d99703ef20848c55960065e43Sebastian Redl L->AddedCXXTemplateSpecialization(this, Info->Function); 2525bbcdbf36f8cf79d99703ef20848c55960065e43Sebastian Redl} 2535bbcdbf36f8cf79d99703ef20848c55960065e43Sebastian Redl 254c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregorstd::pair<const TemplateArgument *, unsigned> 255c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas GregorFunctionTemplateDecl::getInjectedTemplateArgs() { 256c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor TemplateParameterList *Params = getTemplateParameters(); 257c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor Common *CommonPtr = getCommonPtr(); 258c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor if (!CommonPtr->InjectedArgs) { 259c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor CommonPtr->InjectedArgs 260c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor = new (getASTContext()) TemplateArgument [Params->size()]; 261c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor GenerateInjectedTemplateArgs(getASTContext(), Params, 262c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor CommonPtr->InjectedArgs); 263c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor } 264c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor 265c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor return std::make_pair(CommonPtr->InjectedArgs, Params->size()); 266c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor} 267c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor 268aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 269aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// ClassTemplateDecl Implementation 270aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 271aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 2720054531488928a424666ac11fcdc6bcc5112de52Douglas Gregorvoid ClassTemplateDecl::DeallocateCommon(void *Ptr) { 2730054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor static_cast<Common *>(Ptr)->~Common(); 2740054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor} 2750054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor 2768731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios KyrtzidisClassTemplateDecl *ClassTemplateDecl::Create(ASTContext &C, 2778731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis DeclContext *DC, 2788731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis SourceLocation L, 2798731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis DeclarationName Name, 2808731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis TemplateParameterList *Params, 2818731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis NamedDecl *Decl, 2828731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis ClassTemplateDecl *PrevDecl) { 283787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor AdoptTemplateParameterList(Params, cast<DeclContext>(Decl)); 2848731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis ClassTemplateDecl *New = new (C) ClassTemplateDecl(DC, L, Name, Params, Decl); 2855bf1bdc2fedb0c29b5fcdb4abc852aa85b4fe26aArgyrios Kyrtzidis New->setPreviousDeclaration(PrevDecl); 2868731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis return New; 2875953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor} 2885953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor 2891e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorClassTemplateDecl *ClassTemplateDecl::CreateDeserialized(ASTContext &C, 2901e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor unsigned ID) { 2911e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor void *Mem = AllocateDeserializedDecl(C, ID, sizeof(ClassTemplateDecl)); 2921e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor return new (Mem) ClassTemplateDecl(EmptyShell()); 2939a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor} 2949a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor 295c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregorvoid ClassTemplateDecl::LoadLazySpecializations() { 296c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor Common *CommonPtr = getCommonPtr(); 297c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor if (CommonPtr->LazySpecializations) { 298c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor ASTContext &Context = getASTContext(); 299c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor uint32_t *Specs = CommonPtr->LazySpecializations; 300c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor CommonPtr->LazySpecializations = 0; 301c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor for (uint32_t I = 0, N = *Specs++; I != N; ++I) 302c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor (void)Context.getExternalSource()->GetExternalDecl(Specs[I]); 303c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor } 304c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor} 305c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor 306c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregorllvm::FoldingSet<ClassTemplateSpecializationDecl> & 307c8e5cf8f725e111965debb7130ef7466c0c73884Douglas GregorClassTemplateDecl::getSpecializations() { 308c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor LoadLazySpecializations(); 309c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor return getCommonPtr()->Specializations; 310c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor} 311c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor 312c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregorllvm::FoldingSet<ClassTemplatePartialSpecializationDecl> & 313c8e5cf8f725e111965debb7130ef7466c0c73884Douglas GregorClassTemplateDecl::getPartialSpecializations() { 314c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor LoadLazySpecializations(); 315c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor return getCommonPtr()->PartialSpecializations; 316c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor} 317c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor 3186b5415196327fa8ef00f028ba175fafef1738ae1Argyrios KyrtzidisRedeclarableTemplateDecl::CommonBase * 3196b5415196327fa8ef00f028ba175fafef1738ae1Argyrios KyrtzidisClassTemplateDecl::newCommon(ASTContext &C) { 3206b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis Common *CommonPtr = new (C) Common; 3216b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis C.AddDeallocation(DeallocateCommon, CommonPtr); 3229eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne return CommonPtr; 3239eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne} 3249eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne 325cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplateSpecializationDecl * 326cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplateDecl::findSpecialization(const TemplateArgument *Args, 327cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis unsigned NumArgs, void *&InsertPos) { 3284048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne return findSpecializationImpl(getSpecializations(), Args, NumArgs, InsertPos); 329cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis} 330cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis 331bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidisvoid ClassTemplateDecl::AddSpecialization(ClassTemplateSpecializationDecl *D, 332bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis void *InsertPos) { 333bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis getSpecializations().InsertNode(D, InsertPos); 334bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis if (ASTMutationListener *L = getASTMutationListener()) 335bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis L->AddedCXXTemplateSpecialization(this, D); 336bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis} 337bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis 338cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplatePartialSpecializationDecl * 339cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplateDecl::findPartialSpecialization(const TemplateArgument *Args, 340cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis unsigned NumArgs, 341cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis void *&InsertPos) { 3424048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne return findSpecializationImpl(getPartialSpecializations(), Args, NumArgs, 3434048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne InsertPos); 344cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis} 345cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis 346bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidisvoid ClassTemplateDecl::AddPartialSpecialization( 347bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis ClassTemplatePartialSpecializationDecl *D, 348bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis void *InsertPos) { 349bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis getPartialSpecializations().InsertNode(D, InsertPos); 350bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis if (ASTMutationListener *L = getASTMutationListener()) 351bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis L->AddedCXXTemplateSpecialization(this, D); 352bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis} 353bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis 354dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregorvoid ClassTemplateDecl::getPartialSpecializations( 3555f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVectorImpl<ClassTemplatePartialSpecializationDecl *> &PS) { 356dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor llvm::FoldingSet<ClassTemplatePartialSpecializationDecl> &PartialSpecs 3575bf1bdc2fedb0c29b5fcdb4abc852aa85b4fe26aArgyrios Kyrtzidis = getPartialSpecializations(); 358dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor PS.clear(); 359dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor PS.resize(PartialSpecs.size()); 360dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor for (llvm::FoldingSet<ClassTemplatePartialSpecializationDecl>::iterator 361dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor P = PartialSpecs.begin(), PEnd = PartialSpecs.end(); 362dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor P != PEnd; ++P) { 363dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor assert(!PS[P->getSequenceNumber()]); 364cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis PS[P->getSequenceNumber()] = P->getMostRecentDeclaration(); 365dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor } 366dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor} 367dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor 368b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas GregorClassTemplatePartialSpecializationDecl * 369b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas GregorClassTemplateDecl::findPartialSpecialization(QualType T) { 370b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor ASTContext &Context = getASTContext(); 371b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor typedef llvm::FoldingSet<ClassTemplatePartialSpecializationDecl>::iterator 372b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor partial_spec_iterator; 373b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor for (partial_spec_iterator P = getPartialSpecializations().begin(), 374b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor PEnd = getPartialSpecializations().end(); 375b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor P != PEnd; ++P) { 37631f17ecbef57b5679c017c375db330546b7b5145John McCall if (Context.hasSameType(P->getInjectedSpecializationType(), T)) 377cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis return P->getMostRecentDeclaration(); 378cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis } 379cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis 380cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis return 0; 381cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis} 382cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis 383cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplatePartialSpecializationDecl * 384cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplateDecl::findPartialSpecInstantiatedFromMember( 385cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis ClassTemplatePartialSpecializationDecl *D) { 386cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis Decl *DCanon = D->getCanonicalDecl(); 387cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis for (llvm::FoldingSet<ClassTemplatePartialSpecializationDecl>::iterator 388cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis P = getPartialSpecializations().begin(), 389cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis PEnd = getPartialSpecializations().end(); 390cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis P != PEnd; ++P) { 391cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis if (P->getInstantiatedFromMember()->getCanonicalDecl() == DCanon) 392cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis return P->getMostRecentDeclaration(); 393b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor } 3941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 395b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor return 0; 396b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor} 397b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor 3983cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCallQualType 39924bae92f08ae098cc50a602d8cf1273b423e14daDouglas GregorClassTemplateDecl::getInjectedClassNameSpecialization() { 4005bf1bdc2fedb0c29b5fcdb4abc852aa85b4fe26aArgyrios Kyrtzidis Common *CommonPtr = getCommonPtr(); 4017da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor if (!CommonPtr->InjectedClassNameType.isNull()) 4027da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor return CommonPtr->InjectedClassNameType; 4037da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor 404b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor // C++0x [temp.dep.type]p2: 405b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor // The template argument list of a primary template is a template argument 406b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor // list in which the nth template argument has the value of the nth template 407b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor // parameter of the class template. If the nth template parameter is a 408b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor // template parameter pack (14.5.3), the nth template argument is a pack 409b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor // expansion (14.5.3) whose pattern is the name of the template parameter 410b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor // pack. 41124bae92f08ae098cc50a602d8cf1273b423e14daDouglas Gregor ASTContext &Context = getASTContext(); 4127da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor TemplateParameterList *Params = getTemplateParameters(); 4135f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<TemplateArgument, 16> TemplateArgs; 414c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor TemplateArgs.resize(Params->size()); 415c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor GenerateInjectedTemplateArgs(getASTContext(), Params, TemplateArgs.data()); 4167da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor CommonPtr->InjectedClassNameType 4171275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor = Context.getTemplateSpecializationType(TemplateName(this), 4187da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor &TemplateArgs[0], 4191275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor TemplateArgs.size()); 4207da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor return CommonPtr->InjectedClassNameType; 4217da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor} 4227da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor 423aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 424aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// TemplateTypeParm Allocation/Deallocation Method Implementations 425aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 426aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 427aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorTemplateTypeParmDecl * 4284ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadTemplateTypeParmDecl::Create(const ASTContext &C, DeclContext *DC, 429344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara SourceLocation KeyLoc, SourceLocation NameLoc, 430344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara unsigned D, unsigned P, IdentifierInfo *Id, 431344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara bool Typename, bool ParameterPack) { 4324fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth TemplateTypeParmDecl *TTPDecl = 4334fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth new (C) TemplateTypeParmDecl(DC, KeyLoc, NameLoc, Id, Typename); 4344fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth QualType TTPType = C.getTemplateTypeParmType(D, P, ParameterPack, TTPDecl); 4354fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth TTPDecl->TypeForDecl = TTPType.getTypePtr(); 4364fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth return TTPDecl; 437aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor} 438aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 439b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios KyrtzidisTemplateTypeParmDecl * 4401e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorTemplateTypeParmDecl::CreateDeserialized(const ASTContext &C, unsigned ID) { 4411e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor void *Mem = AllocateDeserializedDecl(C, ID, sizeof(TemplateTypeParmDecl)); 4421e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor return new (Mem) TemplateTypeParmDecl(0, SourceLocation(), SourceLocation(), 4431e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor 0, false); 444b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios Kyrtzidis} 445b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios Kyrtzidis 446833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallSourceLocation TemplateTypeParmDecl::getDefaultArgumentLoc() const { 44777d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara return hasDefaultArgument() 44877d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara ? DefaultArgument->getTypeLoc().getBeginLoc() 44977d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara : SourceLocation(); 45077d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara} 45177d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara 45277d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo BagnaraSourceRange TemplateTypeParmDecl::getSourceRange() const { 45377d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara if (hasDefaultArgument() && !defaultArgumentWasInherited()) 454344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara return SourceRange(getLocStart(), 45577d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara DefaultArgument->getTypeLoc().getEndLoc()); 45677d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara else 457344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara return TypeDecl::getSourceRange(); 458833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall} 459833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 460ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregorunsigned TemplateTypeParmDecl::getDepth() const { 461ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor return TypeForDecl->getAs<TemplateTypeParmType>()->getDepth(); 462ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor} 463ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor 464ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregorunsigned TemplateTypeParmDecl::getIndex() const { 465ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor return TypeForDecl->getAs<TemplateTypeParmType>()->getIndex(); 466ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor} 467ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor 4684fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruthbool TemplateTypeParmDecl::isParameterPack() const { 4694fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth return TypeForDecl->getAs<TemplateTypeParmType>()->isParameterPack(); 4704fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth} 4714fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth 472aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 473aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// NonTypeTemplateParmDecl Method Implementations 474aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 475aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 4766952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas GregorNonTypeTemplateParmDecl::NonTypeTemplateParmDecl(DeclContext *DC, 477ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara SourceLocation StartLoc, 478ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara SourceLocation IdLoc, 479ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara unsigned D, unsigned P, 480ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara IdentifierInfo *Id, 4816952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor QualType T, 4826952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor TypeSourceInfo *TInfo, 4836952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor const QualType *ExpandedTypes, 4846952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor unsigned NumExpandedTypes, 4856952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor TypeSourceInfo **ExpandedTInfos) 486ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara : DeclaratorDecl(NonTypeTemplateParm, DC, IdLoc, Id, T, TInfo, StartLoc), 4876952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor TemplateParmPosition(D, P), DefaultArgumentAndInherited(0, false), 4886952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor ParameterPack(true), ExpandedParameterPack(true), 4896952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor NumExpandedTypes(NumExpandedTypes) 4906952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor{ 4916952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor if (ExpandedTypes && ExpandedTInfos) { 4926952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor void **TypesAndInfos = reinterpret_cast<void **>(this + 1); 4936952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor for (unsigned I = 0; I != NumExpandedTypes; ++I) { 4946952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor TypesAndInfos[2*I] = ExpandedTypes[I].getAsOpaquePtr(); 4956952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor TypesAndInfos[2*I + 1] = ExpandedTInfos[I]; 4966952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor } 4976952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor } 4986952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor} 4996952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor 500aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorNonTypeTemplateParmDecl * 5014ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadNonTypeTemplateParmDecl::Create(const ASTContext &C, DeclContext *DC, 502ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara SourceLocation StartLoc, SourceLocation IdLoc, 503ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara unsigned D, unsigned P, IdentifierInfo *Id, 504ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara QualType T, bool ParameterPack, 505ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara TypeSourceInfo *TInfo) { 506ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara return new (C) NonTypeTemplateParmDecl(DC, StartLoc, IdLoc, D, P, Id, 507ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara T, ParameterPack, TInfo); 508aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor} 509aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 5106952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas GregorNonTypeTemplateParmDecl * 5116952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas GregorNonTypeTemplateParmDecl::Create(const ASTContext &C, DeclContext *DC, 512ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara SourceLocation StartLoc, SourceLocation IdLoc, 513ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara unsigned D, unsigned P, 5146952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor IdentifierInfo *Id, QualType T, 5156952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor TypeSourceInfo *TInfo, 5166952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor const QualType *ExpandedTypes, 5176952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor unsigned NumExpandedTypes, 5186952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor TypeSourceInfo **ExpandedTInfos) { 5196952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor unsigned Size = sizeof(NonTypeTemplateParmDecl) 5206952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor + NumExpandedTypes * 2 * sizeof(void*); 5216952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor void *Mem = C.Allocate(Size); 522ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara return new (Mem) NonTypeTemplateParmDecl(DC, StartLoc, IdLoc, 523ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara D, P, Id, T, TInfo, 5246952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor ExpandedTypes, NumExpandedTypes, 5256952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor ExpandedTInfos); 5266952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor} 5276952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor 5281e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorNonTypeTemplateParmDecl * 5291e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorNonTypeTemplateParmDecl::CreateDeserialized(ASTContext &C, unsigned ID) { 5301e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor void *Mem = AllocateDeserializedDecl(C, ID, sizeof(NonTypeTemplateParmDecl)); 5311e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor return new (Mem) NonTypeTemplateParmDecl(0, SourceLocation(), 5321e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor SourceLocation(), 0, 0, 0, 5331e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor QualType(), false, 0); 5341e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor} 5351e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor 5361e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorNonTypeTemplateParmDecl * 5371e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorNonTypeTemplateParmDecl::CreateDeserialized(ASTContext &C, unsigned ID, 5381e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor unsigned NumExpandedTypes) { 5391e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor unsigned Size = sizeof(NonTypeTemplateParmDecl) 5401e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor + NumExpandedTypes * 2 * sizeof(void*); 5411e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor 5421e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor void *Mem = AllocateDeserializedDecl(C, ID, Size); 5431e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor return new (Mem) NonTypeTemplateParmDecl(0, SourceLocation(), 5441e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor SourceLocation(), 0, 0, 0, 5451e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor QualType(), 0, 0, NumExpandedTypes, 5461e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor 0); 5471e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor} 5481e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor 54976a40219ee5624d78aba167dce02bdbaa930955fJohn McCallSourceRange NonTypeTemplateParmDecl::getSourceRange() const { 550ee4bfd412db491c489fc2ee74916edd73f9c618aAbramo Bagnara if (hasDefaultArgument() && !defaultArgumentWasInherited()) 551a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara return SourceRange(getOuterLocStart(), 552a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara getDefaultArgument()->getSourceRange().getEnd()); 553a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara return DeclaratorDecl::getSourceRange(); 55476a40219ee5624d78aba167dce02bdbaa930955fJohn McCall} 55576a40219ee5624d78aba167dce02bdbaa930955fJohn McCall 556d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas GregorSourceLocation NonTypeTemplateParmDecl::getDefaultArgumentLoc() const { 557d92f7a297c0ed3f7d0ebcbb557e1d4c1925b8c72Abramo Bagnara return hasDefaultArgument() 558d92f7a297c0ed3f7d0ebcbb557e1d4c1925b8c72Abramo Bagnara ? getDefaultArgument()->getSourceRange().getBegin() 559d92f7a297c0ed3f7d0ebcbb557e1d4c1925b8c72Abramo Bagnara : SourceLocation(); 560d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas Gregor} 561d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas Gregor 562aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 563aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// TemplateTemplateParmDecl Method Implementations 564aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 565aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 56699ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid TemplateTemplateParmDecl::anchor() { } 56799ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie 568aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorTemplateTemplateParmDecl * 5694ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadTemplateTemplateParmDecl::Create(const ASTContext &C, DeclContext *DC, 570aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor SourceLocation L, unsigned D, unsigned P, 57161c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor bool ParameterPack, IdentifierInfo *Id, 572aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor TemplateParameterList *Params) { 57361c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor return new (C) TemplateTemplateParmDecl(DC, L, D, P, ParameterPack, Id, 57461c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor Params); 575aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor} 576aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 5771e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorTemplateTemplateParmDecl * 5781e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorTemplateTemplateParmDecl::CreateDeserialized(ASTContext &C, unsigned ID) { 5791e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor void *Mem = AllocateDeserializedDecl(C, ID, sizeof(TemplateTemplateParmDecl)); 5801e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor return new (Mem) TemplateTemplateParmDecl(0, SourceLocation(), 0, 0, false, 5811e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor 0, 0); 5821e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor} 5831e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor 5843e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor//===----------------------------------------------------------------------===// 5857e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor// TemplateArgumentList Implementation 5867e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor//===----------------------------------------------------------------------===// 587910f8008fea79120489a53593fe971b0b8a4a740Douglas GregorTemplateArgumentList * 588910f8008fea79120489a53593fe971b0b8a4a740Douglas GregorTemplateArgumentList::CreateCopy(ASTContext &Context, 589910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor const TemplateArgument *Args, 590910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor unsigned NumArgs) { 591910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor std::size_t Size = sizeof(TemplateArgumentList) 592910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor + NumArgs * sizeof(TemplateArgument); 593910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor void *Mem = Context.Allocate(Size); 594910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor TemplateArgument *StoredArgs 595910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor = reinterpret_cast<TemplateArgument *>( 596910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor static_cast<TemplateArgumentList *>(Mem) + 1); 597910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor std::uninitialized_copy(Args, Args + NumArgs, StoredArgs); 598910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor return new (Mem) TemplateArgumentList(StoredArgs, NumArgs, true); 59994d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis} 60094d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis 60171a7605977113c795edd44fcbd2302ad49506653Argyrios KyrtzidisFunctionTemplateSpecializationInfo * 60271a7605977113c795edd44fcbd2302ad49506653Argyrios KyrtzidisFunctionTemplateSpecializationInfo::Create(ASTContext &C, FunctionDecl *FD, 60371a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis FunctionTemplateDecl *Template, 60471a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis TemplateSpecializationKind TSK, 60571a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis const TemplateArgumentList *TemplateArgs, 60671a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis const TemplateArgumentListInfo *TemplateArgsAsWritten, 60771a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis SourceLocation POI) { 60871a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis const ASTTemplateArgumentListInfo *ArgsAsWritten = 0; 60971a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis if (TemplateArgsAsWritten) 61071a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis ArgsAsWritten = ASTTemplateArgumentListInfo::Create(C, 61171a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis *TemplateArgsAsWritten); 61271a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis 61371a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis return new (C) FunctionTemplateSpecializationInfo(FD, Template, TSK, 61471a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis TemplateArgs, 61571a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis ArgsAsWritten, 61671a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis POI); 61771a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis} 61871a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis 6197e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor//===----------------------------------------------------------------------===// 62099ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie// TemplateDecl Implementation 62199ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie//===----------------------------------------------------------------------===// 62299ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie 62399ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid TemplateDecl::anchor() { } 62499ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie 62599ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie//===----------------------------------------------------------------------===// 6263e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor// ClassTemplateSpecializationDecl Implementation 6273e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor//===----------------------------------------------------------------------===// 6283e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas GregorClassTemplateSpecializationDecl:: 62913c8577201e4fc0ddac5f09d05fd1778832137d1Douglas GregorClassTemplateSpecializationDecl(ASTContext &Context, Kind DK, TagKind TK, 630ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara DeclContext *DC, SourceLocation StartLoc, 631ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara SourceLocation IdLoc, 6323e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor ClassTemplateDecl *SpecializedTemplate, 633910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor const TemplateArgument *Args, 634910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor unsigned NumArgs, 6358e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor ClassTemplateSpecializationDecl *PrevDecl) 636ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara : CXXRecordDecl(DK, TK, DC, StartLoc, IdLoc, 6378e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor SpecializedTemplate->getIdentifier(), 6388e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor PrevDecl), 6393e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor SpecializedTemplate(SpecializedTemplate), 640c98971d5c994caed9452aeadd0122c855e0f4de1Abramo Bagnara ExplicitInfo(0), 641910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor TemplateArgs(TemplateArgumentList::CreateCopy(Context, Args, NumArgs)), 6427e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor SpecializationKind(TSK_Undeclared) { 6433e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor} 6441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 64594d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios KyrtzidisClassTemplateSpecializationDecl::ClassTemplateSpecializationDecl(Kind DK) 646ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara : CXXRecordDecl(DK, TTK_Struct, 0, SourceLocation(), SourceLocation(), 0, 0), 64794d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis ExplicitInfo(0), 64894d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis SpecializationKind(TSK_Undeclared) { 64994d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis} 65094d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis 6513e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas GregorClassTemplateSpecializationDecl * 65213c8577201e4fc0ddac5f09d05fd1778832137d1Douglas GregorClassTemplateSpecializationDecl::Create(ASTContext &Context, TagKind TK, 653ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara DeclContext *DC, 654ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara SourceLocation StartLoc, 655ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara SourceLocation IdLoc, 6563e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor ClassTemplateDecl *SpecializedTemplate, 657910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor const TemplateArgument *Args, 658910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor unsigned NumArgs, 659cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor ClassTemplateSpecializationDecl *PrevDecl) { 660cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor ClassTemplateSpecializationDecl *Result 6611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump = new (Context)ClassTemplateSpecializationDecl(Context, 662c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor ClassTemplateSpecialization, 663ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara TK, DC, StartLoc, IdLoc, 6647e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor SpecializedTemplate, 665910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor Args, NumArgs, 6668e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor PrevDecl); 667cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor Context.getTypeDeclType(Result, PrevDecl); 668cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor return Result; 6693e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor} 670c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor 67194d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios KyrtzidisClassTemplateSpecializationDecl * 6721e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorClassTemplateSpecializationDecl::CreateDeserialized(ASTContext &C, 6731e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor unsigned ID) { 6741e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor void *Mem = AllocateDeserializedDecl(C, ID, 6751e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor sizeof(ClassTemplateSpecializationDecl)); 6761e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor return new (Mem) ClassTemplateSpecializationDecl(ClassTemplateSpecialization); 67794d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis} 67894d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis 679da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregorvoid 680da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas GregorClassTemplateSpecializationDecl::getNameForDiagnostic(std::string &S, 681da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor const PrintingPolicy &Policy, 682da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor bool Qualified) const { 683da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor NamedDecl::getNameForDiagnostic(S, Policy, Qualified); 684da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor 685da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor const TemplateArgumentList &TemplateArgs = getTemplateArgs(); 686da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor S += TemplateSpecializationType::PrintTemplateArgumentList( 687da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor TemplateArgs.data(), 688da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor TemplateArgs.size(), 689da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor Policy); 690da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor} 691da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor 69237d93e9252026d4fb836d9c05d0122a2d46e56beDouglas GregorClassTemplateDecl * 6931eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpClassTemplateSpecializationDecl::getSpecializedTemplate() const { 6941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (SpecializedPartialSpecialization *PartialSpec 69537d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor = SpecializedTemplate.dyn_cast<SpecializedPartialSpecialization*>()) 69637d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor return PartialSpec->PartialSpecialization->getSpecializedTemplate(); 69737d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor return SpecializedTemplate.get<ClassTemplateDecl*>(); 69837d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor} 69937d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor 7004a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo BagnaraSourceRange 7014a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo BagnaraClassTemplateSpecializationDecl::getSourceRange() const { 70209d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara if (ExplicitInfo) { 70309d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara SourceLocation Begin = getExternLoc(); 70409d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara if (Begin.isInvalid()) 70509d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara Begin = getTemplateKeywordLoc(); 70609d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara SourceLocation End = getRBraceLoc(); 70709d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara if (End.isInvalid()) 70809d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara End = getTypeAsWritten()->getTypeLoc().getEndLoc(); 70909d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara return SourceRange(Begin, End); 71009d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara } 71109d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara else { 71209d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara // No explicit info available. 71309d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara llvm::PointerUnion<ClassTemplateDecl *, 71409d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara ClassTemplatePartialSpecializationDecl *> 71509d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara inst_from = getInstantiatedFrom(); 71609d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara if (inst_from.isNull()) 71709d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara return getSpecializedTemplate()->getSourceRange(); 71809d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara if (ClassTemplateDecl *ctd = inst_from.dyn_cast<ClassTemplateDecl*>()) 71909d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara return ctd->getSourceRange(); 72009d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara return inst_from.get<ClassTemplatePartialSpecializationDecl*>() 72109d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara ->getSourceRange(); 72209d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara } 7234a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo Bagnara} 7244a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo Bagnara 725c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor//===----------------------------------------------------------------------===// 726c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor// ClassTemplatePartialSpecializationDecl Implementation 727c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor//===----------------------------------------------------------------------===// 72899ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid ClassTemplatePartialSpecializationDecl::anchor() { } 72999ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie 7309a299e0575ce235f491014627c7267e2d2cd73deDouglas GregorClassTemplatePartialSpecializationDecl:: 7319a299e0575ce235f491014627c7267e2d2cd73deDouglas GregorClassTemplatePartialSpecializationDecl(ASTContext &Context, TagKind TK, 732ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara DeclContext *DC, 733ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara SourceLocation StartLoc, 734ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara SourceLocation IdLoc, 7359a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor TemplateParameterList *Params, 7369a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor ClassTemplateDecl *SpecializedTemplate, 7379a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor const TemplateArgument *Args, 7389a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor unsigned NumArgs, 7399a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor TemplateArgumentLoc *ArgInfos, 7409a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor unsigned NumArgInfos, 7419a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor ClassTemplatePartialSpecializationDecl *PrevDecl, 7429a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor unsigned SequenceNumber) 7439a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor : ClassTemplateSpecializationDecl(Context, 7449a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor ClassTemplatePartialSpecialization, 745ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara TK, DC, StartLoc, IdLoc, 746ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara SpecializedTemplate, 7479a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor Args, NumArgs, PrevDecl), 7489a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor TemplateParams(Params), ArgsAsWritten(ArgInfos), 7499a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor NumArgsAsWritten(NumArgInfos), SequenceNumber(SequenceNumber), 7509a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor InstantiatedFromMember(0, false) 7519a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor{ 752787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor AdoptTemplateParameterList(Params, this); 7539a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor} 7549a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor 755c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas GregorClassTemplatePartialSpecializationDecl * 756c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas GregorClassTemplatePartialSpecializationDecl:: 757ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo BagnaraCreate(ASTContext &Context, TagKind TK,DeclContext *DC, 758ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara SourceLocation StartLoc, SourceLocation IdLoc, 759c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor TemplateParameterList *Params, 760c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor ClassTemplateDecl *SpecializedTemplate, 761910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor const TemplateArgument *Args, 762910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor unsigned NumArgs, 763d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall const TemplateArgumentListInfo &ArgInfos, 7643cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall QualType CanonInjectedType, 765dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor ClassTemplatePartialSpecializationDecl *PrevDecl, 766dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor unsigned SequenceNumber) { 767d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall unsigned N = ArgInfos.size(); 768833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateArgumentLoc *ClonedArgs = new (Context) TemplateArgumentLoc[N]; 769833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall for (unsigned I = 0; I != N; ++I) 770833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall ClonedArgs[I] = ArgInfos[I]; 771833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 772c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor ClassTemplatePartialSpecializationDecl *Result 773ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara = new (Context)ClassTemplatePartialSpecializationDecl(Context, TK, DC, 774ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara StartLoc, IdLoc, 775ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara Params, 776c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor SpecializedTemplate, 777910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor Args, NumArgs, 778833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall ClonedArgs, N, 779dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor PrevDecl, 780dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor SequenceNumber); 781c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor Result->setSpecializationKind(TSK_ExplicitSpecialization); 7823cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall 7833cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall Context.getInjectedClassNameType(Result, CanonInjectedType); 784c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor return Result; 785c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor} 786dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall 78794d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios KyrtzidisClassTemplatePartialSpecializationDecl * 7881e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorClassTemplatePartialSpecializationDecl::CreateDeserialized(ASTContext &C, 7891e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor unsigned ID) { 7901e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor void *Mem = AllocateDeserializedDecl(C, ID, 7911e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor sizeof(ClassTemplatePartialSpecializationDecl)); 7921e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor return new (Mem) ClassTemplatePartialSpecializationDecl(); 79394d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis} 79494d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis 795dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall//===----------------------------------------------------------------------===// 796dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall// FriendTemplateDecl Implementation 797dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall//===----------------------------------------------------------------------===// 798dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall 79999ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid FriendTemplateDecl::anchor() { } 80099ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie 801dd4a3b0065b9a7e7b00073df415a798886c090f3John McCallFriendTemplateDecl *FriendTemplateDecl::Create(ASTContext &Context, 802dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall DeclContext *DC, 803dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall SourceLocation L, 804dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall unsigned NParams, 805dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall TemplateParameterList **Params, 806dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall FriendUnion Friend, 807dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall SourceLocation FLoc) { 808dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall FriendTemplateDecl *Result 809dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall = new (Context) FriendTemplateDecl(DC, L, NParams, Params, Friend, FLoc); 810dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall return Result; 811dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall} 812554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis 8131e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorFriendTemplateDecl *FriendTemplateDecl::CreateDeserialized(ASTContext &C, 8141e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor unsigned ID) { 8151e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor void *Mem = AllocateDeserializedDecl(C, ID, sizeof(FriendTemplateDecl)); 8161e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor return new (Mem) FriendTemplateDecl(EmptyShell()); 817554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis} 8183e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith 8193e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith//===----------------------------------------------------------------------===// 8203e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith// TypeAliasTemplateDecl Implementation 8213e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith//===----------------------------------------------------------------------===// 8223e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith 8233e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard SmithTypeAliasTemplateDecl *TypeAliasTemplateDecl::Create(ASTContext &C, 8243e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith DeclContext *DC, 8253e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith SourceLocation L, 8263e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith DeclarationName Name, 8273e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith TemplateParameterList *Params, 8283e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith NamedDecl *Decl) { 8293e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith AdoptTemplateParameterList(Params, DC); 8303e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith return new (C) TypeAliasTemplateDecl(DC, L, Name, Params, Decl); 8313e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith} 8323e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith 8331e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorTypeAliasTemplateDecl *TypeAliasTemplateDecl::CreateDeserialized(ASTContext &C, 8341e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor unsigned ID) { 8351e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor void *Mem = AllocateDeserializedDecl(C, ID, sizeof(TypeAliasTemplateDecl)); 8361e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor return new (Mem) TypeAliasTemplateDecl(0, SourceLocation(), DeclarationName(), 8371e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor 0, 0); 8383e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith} 8393e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith 8403e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smithvoid TypeAliasTemplateDecl::DeallocateCommon(void *Ptr) { 8413e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith static_cast<Common *>(Ptr)->~Common(); 8423e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith} 8433e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard SmithRedeclarableTemplateDecl::CommonBase * 8443e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard SmithTypeAliasTemplateDecl::newCommon(ASTContext &C) { 8453e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith Common *CommonPtr = new (C) Common; 8463e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith C.AddDeallocation(DeallocateCommon, CommonPtr); 8473e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith return CommonPtr; 8483e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith} 8493e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith 85099ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie//===----------------------------------------------------------------------===// 85199ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie// ClassScopeFunctionSpecializationDecl Implementation 85299ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie//===----------------------------------------------------------------------===// 85399ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie 85499ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid ClassScopeFunctionSpecializationDecl::anchor() { } 8551e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor 8561e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorClassScopeFunctionSpecializationDecl * 8571e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorClassScopeFunctionSpecializationDecl::CreateDeserialized(ASTContext &C, 8581e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor unsigned ID) { 8591e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor void *Mem = AllocateDeserializedDecl(C, ID, 8601e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor sizeof(ClassScopeFunctionSpecializationDecl)); 8611e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor return new (Mem) ClassScopeFunctionSpecializationDecl(0, SourceLocation(), 0); 8621e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor} 863