DeclTemplate.cpp revision 3e4c6c4c79a03f5cb0c4671d7c282d623c6dc35e
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 2279a299e0575ce235f491014627c7267e2d2cd73deDouglas GregorFunctionTemplateDecl *FunctionTemplateDecl::Create(ASTContext &C, EmptyShell) { 2289a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor return new (C) FunctionTemplateDecl(0, SourceLocation(), DeclarationName(), 2299a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor 0, 0); 2309a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor} 2319a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor 2326b5415196327fa8ef00f028ba175fafef1738ae1Argyrios KyrtzidisRedeclarableTemplateDecl::CommonBase * 2336b5415196327fa8ef00f028ba175fafef1738ae1Argyrios KyrtzidisFunctionTemplateDecl::newCommon(ASTContext &C) { 2346b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis Common *CommonPtr = new (C) Common; 2356b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis C.AddDeallocation(DeallocateCommon, CommonPtr); 2369eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne return CommonPtr; 2379eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne} 2389eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne 2392c853e401ca406d417eb916e867226050e7be06bArgyrios KyrtzidisFunctionDecl * 2402c853e401ca406d417eb916e867226050e7be06bArgyrios KyrtzidisFunctionTemplateDecl::findSpecialization(const TemplateArgument *Args, 2412c853e401ca406d417eb916e867226050e7be06bArgyrios Kyrtzidis unsigned NumArgs, void *&InsertPos) { 2424048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne return findSpecializationImpl(getSpecializations(), Args, NumArgs, InsertPos); 2432c853e401ca406d417eb916e867226050e7be06bArgyrios Kyrtzidis} 2442c853e401ca406d417eb916e867226050e7be06bArgyrios Kyrtzidis 2455bbcdbf36f8cf79d99703ef20848c55960065e43Sebastian Redlvoid FunctionTemplateDecl::addSpecialization( 2465bbcdbf36f8cf79d99703ef20848c55960065e43Sebastian Redl FunctionTemplateSpecializationInfo *Info, void *InsertPos) { 2475bbcdbf36f8cf79d99703ef20848c55960065e43Sebastian Redl getSpecializations().InsertNode(Info, InsertPos); 2485bbcdbf36f8cf79d99703ef20848c55960065e43Sebastian Redl if (ASTMutationListener *L = getASTMutationListener()) 2495bbcdbf36f8cf79d99703ef20848c55960065e43Sebastian Redl L->AddedCXXTemplateSpecialization(this, Info->Function); 2505bbcdbf36f8cf79d99703ef20848c55960065e43Sebastian Redl} 2515bbcdbf36f8cf79d99703ef20848c55960065e43Sebastian Redl 252c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregorstd::pair<const TemplateArgument *, unsigned> 253c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas GregorFunctionTemplateDecl::getInjectedTemplateArgs() { 254c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor TemplateParameterList *Params = getTemplateParameters(); 255c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor Common *CommonPtr = getCommonPtr(); 256c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor if (!CommonPtr->InjectedArgs) { 257c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor CommonPtr->InjectedArgs 258c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor = new (getASTContext()) TemplateArgument [Params->size()]; 259c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor GenerateInjectedTemplateArgs(getASTContext(), Params, 260c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor CommonPtr->InjectedArgs); 261c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor } 262c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor 263c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor return std::make_pair(CommonPtr->InjectedArgs, Params->size()); 264c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor} 265c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor 266aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 267aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// ClassTemplateDecl Implementation 268aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 269aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 2700054531488928a424666ac11fcdc6bcc5112de52Douglas Gregorvoid ClassTemplateDecl::DeallocateCommon(void *Ptr) { 2710054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor static_cast<Common *>(Ptr)->~Common(); 2720054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor} 2730054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor 2748731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios KyrtzidisClassTemplateDecl *ClassTemplateDecl::Create(ASTContext &C, 2758731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis DeclContext *DC, 2768731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis SourceLocation L, 2778731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis DeclarationName Name, 2788731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis TemplateParameterList *Params, 2798731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis NamedDecl *Decl, 2808731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis ClassTemplateDecl *PrevDecl) { 281787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor AdoptTemplateParameterList(Params, cast<DeclContext>(Decl)); 2828731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis ClassTemplateDecl *New = new (C) ClassTemplateDecl(DC, L, Name, Params, Decl); 2835bf1bdc2fedb0c29b5fcdb4abc852aa85b4fe26aArgyrios Kyrtzidis New->setPreviousDeclaration(PrevDecl); 2848731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis return New; 2855953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor} 2865953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor 2879a299e0575ce235f491014627c7267e2d2cd73deDouglas GregorClassTemplateDecl *ClassTemplateDecl::Create(ASTContext &C, EmptyShell Empty) { 2889a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor return new (C) ClassTemplateDecl(Empty); 2899a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor} 2909a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor 291c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregorvoid ClassTemplateDecl::LoadLazySpecializations() { 292c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor Common *CommonPtr = getCommonPtr(); 293c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor if (CommonPtr->LazySpecializations) { 294c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor ASTContext &Context = getASTContext(); 295c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor uint32_t *Specs = CommonPtr->LazySpecializations; 296c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor CommonPtr->LazySpecializations = 0; 297c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor for (uint32_t I = 0, N = *Specs++; I != N; ++I) 298c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor (void)Context.getExternalSource()->GetExternalDecl(Specs[I]); 299c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor } 300c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor} 301c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor 302c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregorllvm::FoldingSet<ClassTemplateSpecializationDecl> & 303c8e5cf8f725e111965debb7130ef7466c0c73884Douglas GregorClassTemplateDecl::getSpecializations() { 304c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor LoadLazySpecializations(); 305c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor return getCommonPtr()->Specializations; 306c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor} 307c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor 308c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregorllvm::FoldingSet<ClassTemplatePartialSpecializationDecl> & 309c8e5cf8f725e111965debb7130ef7466c0c73884Douglas GregorClassTemplateDecl::getPartialSpecializations() { 310c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor LoadLazySpecializations(); 311c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor return getCommonPtr()->PartialSpecializations; 312c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor} 313c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor 3146b5415196327fa8ef00f028ba175fafef1738ae1Argyrios KyrtzidisRedeclarableTemplateDecl::CommonBase * 3156b5415196327fa8ef00f028ba175fafef1738ae1Argyrios KyrtzidisClassTemplateDecl::newCommon(ASTContext &C) { 3166b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis Common *CommonPtr = new (C) Common; 3176b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis C.AddDeallocation(DeallocateCommon, CommonPtr); 3189eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne return CommonPtr; 3199eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne} 3209eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne 321cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplateSpecializationDecl * 322cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplateDecl::findSpecialization(const TemplateArgument *Args, 323cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis unsigned NumArgs, void *&InsertPos) { 3244048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne return findSpecializationImpl(getSpecializations(), Args, NumArgs, InsertPos); 325cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis} 326cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis 327bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidisvoid ClassTemplateDecl::AddSpecialization(ClassTemplateSpecializationDecl *D, 328bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis void *InsertPos) { 329bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis getSpecializations().InsertNode(D, InsertPos); 330bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis if (ASTMutationListener *L = getASTMutationListener()) 331bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis L->AddedCXXTemplateSpecialization(this, D); 332bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis} 333bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis 334cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplatePartialSpecializationDecl * 335cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplateDecl::findPartialSpecialization(const TemplateArgument *Args, 336cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis unsigned NumArgs, 337cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis void *&InsertPos) { 3384048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne return findSpecializationImpl(getPartialSpecializations(), Args, NumArgs, 3394048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne InsertPos); 340cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis} 341cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis 342bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidisvoid ClassTemplateDecl::AddPartialSpecialization( 343bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis ClassTemplatePartialSpecializationDecl *D, 344bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis void *InsertPos) { 345bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis getPartialSpecializations().InsertNode(D, InsertPos); 346bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis if (ASTMutationListener *L = getASTMutationListener()) 347bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis L->AddedCXXTemplateSpecialization(this, D); 348bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis} 349bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis 350dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregorvoid ClassTemplateDecl::getPartialSpecializations( 351dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor llvm::SmallVectorImpl<ClassTemplatePartialSpecializationDecl *> &PS) { 352dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor llvm::FoldingSet<ClassTemplatePartialSpecializationDecl> &PartialSpecs 3535bf1bdc2fedb0c29b5fcdb4abc852aa85b4fe26aArgyrios Kyrtzidis = getPartialSpecializations(); 354dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor PS.clear(); 355dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor PS.resize(PartialSpecs.size()); 356dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor for (llvm::FoldingSet<ClassTemplatePartialSpecializationDecl>::iterator 357dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor P = PartialSpecs.begin(), PEnd = PartialSpecs.end(); 358dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor P != PEnd; ++P) { 359dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor assert(!PS[P->getSequenceNumber()]); 360cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis PS[P->getSequenceNumber()] = P->getMostRecentDeclaration(); 361dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor } 362dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor} 363dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor 364b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas GregorClassTemplatePartialSpecializationDecl * 365b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas GregorClassTemplateDecl::findPartialSpecialization(QualType T) { 366b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor ASTContext &Context = getASTContext(); 367b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor typedef llvm::FoldingSet<ClassTemplatePartialSpecializationDecl>::iterator 368b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor partial_spec_iterator; 369b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor for (partial_spec_iterator P = getPartialSpecializations().begin(), 370b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor PEnd = getPartialSpecializations().end(); 371b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor P != PEnd; ++P) { 37231f17ecbef57b5679c017c375db330546b7b5145John McCall if (Context.hasSameType(P->getInjectedSpecializationType(), T)) 373cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis return P->getMostRecentDeclaration(); 374cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis } 375cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis 376cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis return 0; 377cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis} 378cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis 379cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplatePartialSpecializationDecl * 380cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplateDecl::findPartialSpecInstantiatedFromMember( 381cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis ClassTemplatePartialSpecializationDecl *D) { 382cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis Decl *DCanon = D->getCanonicalDecl(); 383cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis for (llvm::FoldingSet<ClassTemplatePartialSpecializationDecl>::iterator 384cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis P = getPartialSpecializations().begin(), 385cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis PEnd = getPartialSpecializations().end(); 386cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis P != PEnd; ++P) { 387cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis if (P->getInstantiatedFromMember()->getCanonicalDecl() == DCanon) 388cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis return P->getMostRecentDeclaration(); 389b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor } 3901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 391b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor return 0; 392b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor} 393b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor 3943cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCallQualType 39524bae92f08ae098cc50a602d8cf1273b423e14daDouglas GregorClassTemplateDecl::getInjectedClassNameSpecialization() { 3965bf1bdc2fedb0c29b5fcdb4abc852aa85b4fe26aArgyrios Kyrtzidis Common *CommonPtr = getCommonPtr(); 3977da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor if (!CommonPtr->InjectedClassNameType.isNull()) 3987da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor return CommonPtr->InjectedClassNameType; 3997da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor 400b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor // C++0x [temp.dep.type]p2: 401b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor // The template argument list of a primary template is a template argument 402b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor // list in which the nth template argument has the value of the nth template 403b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor // parameter of the class template. If the nth template parameter is a 404b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor // template parameter pack (14.5.3), the nth template argument is a pack 405b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor // expansion (14.5.3) whose pattern is the name of the template parameter 406b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor // pack. 40724bae92f08ae098cc50a602d8cf1273b423e14daDouglas Gregor ASTContext &Context = getASTContext(); 4087da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor TemplateParameterList *Params = getTemplateParameters(); 4097da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor llvm::SmallVector<TemplateArgument, 16> TemplateArgs; 410c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor TemplateArgs.resize(Params->size()); 411c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor GenerateInjectedTemplateArgs(getASTContext(), Params, TemplateArgs.data()); 4127da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor CommonPtr->InjectedClassNameType 4131275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor = Context.getTemplateSpecializationType(TemplateName(this), 4147da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor &TemplateArgs[0], 4151275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor TemplateArgs.size()); 4167da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor return CommonPtr->InjectedClassNameType; 4177da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor} 4187da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor 419aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 420aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// TemplateTypeParm Allocation/Deallocation Method Implementations 421aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 422aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 423aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorTemplateTypeParmDecl * 4244ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadTemplateTypeParmDecl::Create(const ASTContext &C, DeclContext *DC, 425344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara SourceLocation KeyLoc, SourceLocation NameLoc, 426344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara unsigned D, unsigned P, IdentifierInfo *Id, 427344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara bool Typename, bool ParameterPack) { 4284fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth TemplateTypeParmDecl *TTPDecl = 4294fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth new (C) TemplateTypeParmDecl(DC, KeyLoc, NameLoc, Id, Typename); 4304fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth QualType TTPType = C.getTemplateTypeParmType(D, P, ParameterPack, TTPDecl); 4314fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth TTPDecl->TypeForDecl = TTPType.getTypePtr(); 4324fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth return TTPDecl; 433aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor} 434aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 435b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios KyrtzidisTemplateTypeParmDecl * 4364ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadTemplateTypeParmDecl::Create(const ASTContext &C, EmptyShell Empty) { 437344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara return new (C) TemplateTypeParmDecl(0, SourceLocation(), SourceLocation(), 4384fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth 0, false); 439b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios Kyrtzidis} 440b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios Kyrtzidis 441833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallSourceLocation TemplateTypeParmDecl::getDefaultArgumentLoc() const { 44277d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara return hasDefaultArgument() 44377d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara ? DefaultArgument->getTypeLoc().getBeginLoc() 44477d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara : SourceLocation(); 44577d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara} 44677d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara 44777d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo BagnaraSourceRange TemplateTypeParmDecl::getSourceRange() const { 44877d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara if (hasDefaultArgument() && !defaultArgumentWasInherited()) 449344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara return SourceRange(getLocStart(), 45077d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara DefaultArgument->getTypeLoc().getEndLoc()); 45177d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara else 452344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara return TypeDecl::getSourceRange(); 453833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall} 454833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 455ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregorunsigned TemplateTypeParmDecl::getDepth() const { 456ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor return TypeForDecl->getAs<TemplateTypeParmType>()->getDepth(); 457ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor} 458ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor 459ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregorunsigned TemplateTypeParmDecl::getIndex() const { 460ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor return TypeForDecl->getAs<TemplateTypeParmType>()->getIndex(); 461ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor} 462ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor 4634fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruthbool TemplateTypeParmDecl::isParameterPack() const { 4644fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth return TypeForDecl->getAs<TemplateTypeParmType>()->isParameterPack(); 4654fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth} 4664fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth 467aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 468aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// NonTypeTemplateParmDecl Method Implementations 469aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 470aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 4716952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas GregorNonTypeTemplateParmDecl::NonTypeTemplateParmDecl(DeclContext *DC, 472ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara SourceLocation StartLoc, 473ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara SourceLocation IdLoc, 474ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara unsigned D, unsigned P, 475ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara IdentifierInfo *Id, 4766952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor QualType T, 4776952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor TypeSourceInfo *TInfo, 4786952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor const QualType *ExpandedTypes, 4796952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor unsigned NumExpandedTypes, 4806952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor TypeSourceInfo **ExpandedTInfos) 481ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara : DeclaratorDecl(NonTypeTemplateParm, DC, IdLoc, Id, T, TInfo, StartLoc), 4826952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor TemplateParmPosition(D, P), DefaultArgumentAndInherited(0, false), 4836952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor ParameterPack(true), ExpandedParameterPack(true), 4846952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor NumExpandedTypes(NumExpandedTypes) 4856952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor{ 4866952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor if (ExpandedTypes && ExpandedTInfos) { 4876952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor void **TypesAndInfos = reinterpret_cast<void **>(this + 1); 4886952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor for (unsigned I = 0; I != NumExpandedTypes; ++I) { 4896952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor TypesAndInfos[2*I] = ExpandedTypes[I].getAsOpaquePtr(); 4906952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor TypesAndInfos[2*I + 1] = ExpandedTInfos[I]; 4916952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor } 4926952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor } 4936952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor} 4946952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor 495aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorNonTypeTemplateParmDecl * 4964ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadNonTypeTemplateParmDecl::Create(const ASTContext &C, DeclContext *DC, 497ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara SourceLocation StartLoc, SourceLocation IdLoc, 498ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara unsigned D, unsigned P, IdentifierInfo *Id, 499ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara QualType T, bool ParameterPack, 500ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara TypeSourceInfo *TInfo) { 501ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara return new (C) NonTypeTemplateParmDecl(DC, StartLoc, IdLoc, D, P, Id, 502ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara T, ParameterPack, TInfo); 503aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor} 504aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 5056952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas GregorNonTypeTemplateParmDecl * 5066952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas GregorNonTypeTemplateParmDecl::Create(const ASTContext &C, DeclContext *DC, 507ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara SourceLocation StartLoc, SourceLocation IdLoc, 508ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara unsigned D, unsigned P, 5096952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor IdentifierInfo *Id, QualType T, 5106952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor TypeSourceInfo *TInfo, 5116952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor const QualType *ExpandedTypes, 5126952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor unsigned NumExpandedTypes, 5136952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor TypeSourceInfo **ExpandedTInfos) { 5146952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor unsigned Size = sizeof(NonTypeTemplateParmDecl) 5156952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor + NumExpandedTypes * 2 * sizeof(void*); 5166952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor void *Mem = C.Allocate(Size); 517ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara return new (Mem) NonTypeTemplateParmDecl(DC, StartLoc, IdLoc, 518ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara D, P, Id, T, TInfo, 5196952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor ExpandedTypes, NumExpandedTypes, 5206952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor ExpandedTInfos); 5216952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor} 5226952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor 52376a40219ee5624d78aba167dce02bdbaa930955fJohn McCallSourceRange NonTypeTemplateParmDecl::getSourceRange() const { 524ee4bfd412db491c489fc2ee74916edd73f9c618aAbramo Bagnara if (hasDefaultArgument() && !defaultArgumentWasInherited()) 525a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara return SourceRange(getOuterLocStart(), 526a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara getDefaultArgument()->getSourceRange().getEnd()); 527a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara return DeclaratorDecl::getSourceRange(); 52876a40219ee5624d78aba167dce02bdbaa930955fJohn McCall} 52976a40219ee5624d78aba167dce02bdbaa930955fJohn McCall 530d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas GregorSourceLocation NonTypeTemplateParmDecl::getDefaultArgumentLoc() const { 531d92f7a297c0ed3f7d0ebcbb557e1d4c1925b8c72Abramo Bagnara return hasDefaultArgument() 532d92f7a297c0ed3f7d0ebcbb557e1d4c1925b8c72Abramo Bagnara ? getDefaultArgument()->getSourceRange().getBegin() 533d92f7a297c0ed3f7d0ebcbb557e1d4c1925b8c72Abramo Bagnara : SourceLocation(); 534d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas Gregor} 535d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas Gregor 536aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 537aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// TemplateTemplateParmDecl Method Implementations 538aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 539aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 540aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorTemplateTemplateParmDecl * 5414ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadTemplateTemplateParmDecl::Create(const ASTContext &C, DeclContext *DC, 542aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor SourceLocation L, unsigned D, unsigned P, 54361c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor bool ParameterPack, IdentifierInfo *Id, 544aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor TemplateParameterList *Params) { 54561c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor return new (C) TemplateTemplateParmDecl(DC, L, D, P, ParameterPack, Id, 54661c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor Params); 547aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor} 548aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 5493e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor//===----------------------------------------------------------------------===// 5507e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor// TemplateArgumentList Implementation 5517e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor//===----------------------------------------------------------------------===// 552910f8008fea79120489a53593fe971b0b8a4a740Douglas GregorTemplateArgumentList * 553910f8008fea79120489a53593fe971b0b8a4a740Douglas GregorTemplateArgumentList::CreateCopy(ASTContext &Context, 554910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor const TemplateArgument *Args, 555910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor unsigned NumArgs) { 556910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor std::size_t Size = sizeof(TemplateArgumentList) 557910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor + NumArgs * sizeof(TemplateArgument); 558910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor void *Mem = Context.Allocate(Size); 559910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor TemplateArgument *StoredArgs 560910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor = reinterpret_cast<TemplateArgument *>( 561910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor static_cast<TemplateArgumentList *>(Mem) + 1); 562910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor std::uninitialized_copy(Args, Args + NumArgs, StoredArgs); 563910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor return new (Mem) TemplateArgumentList(StoredArgs, NumArgs, true); 56494d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis} 56594d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis 5667e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor//===----------------------------------------------------------------------===// 5673e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor// ClassTemplateSpecializationDecl Implementation 5683e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor//===----------------------------------------------------------------------===// 5693e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas GregorClassTemplateSpecializationDecl:: 57013c8577201e4fc0ddac5f09d05fd1778832137d1Douglas GregorClassTemplateSpecializationDecl(ASTContext &Context, Kind DK, TagKind TK, 571ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara DeclContext *DC, SourceLocation StartLoc, 572ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara SourceLocation IdLoc, 5733e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor ClassTemplateDecl *SpecializedTemplate, 574910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor const TemplateArgument *Args, 575910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor unsigned NumArgs, 5768e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor ClassTemplateSpecializationDecl *PrevDecl) 577ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara : CXXRecordDecl(DK, TK, DC, StartLoc, IdLoc, 5788e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor SpecializedTemplate->getIdentifier(), 5798e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor PrevDecl), 5803e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor SpecializedTemplate(SpecializedTemplate), 581c98971d5c994caed9452aeadd0122c855e0f4de1Abramo Bagnara ExplicitInfo(0), 582910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor TemplateArgs(TemplateArgumentList::CreateCopy(Context, Args, NumArgs)), 5837e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor SpecializationKind(TSK_Undeclared) { 5843e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor} 5851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 58694d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios KyrtzidisClassTemplateSpecializationDecl::ClassTemplateSpecializationDecl(Kind DK) 587ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara : CXXRecordDecl(DK, TTK_Struct, 0, SourceLocation(), SourceLocation(), 0, 0), 58894d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis ExplicitInfo(0), 58994d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis SpecializationKind(TSK_Undeclared) { 59094d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis} 59194d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis 5923e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas GregorClassTemplateSpecializationDecl * 59313c8577201e4fc0ddac5f09d05fd1778832137d1Douglas GregorClassTemplateSpecializationDecl::Create(ASTContext &Context, TagKind TK, 594ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara DeclContext *DC, 595ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara SourceLocation StartLoc, 596ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara SourceLocation IdLoc, 5973e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor ClassTemplateDecl *SpecializedTemplate, 598910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor const TemplateArgument *Args, 599910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor unsigned NumArgs, 600cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor ClassTemplateSpecializationDecl *PrevDecl) { 601cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor ClassTemplateSpecializationDecl *Result 6021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump = new (Context)ClassTemplateSpecializationDecl(Context, 603c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor ClassTemplateSpecialization, 604ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara TK, DC, StartLoc, IdLoc, 6057e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor SpecializedTemplate, 606910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor Args, NumArgs, 6078e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor PrevDecl); 608cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor Context.getTypeDeclType(Result, PrevDecl); 609cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor return Result; 6103e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor} 611c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor 61294d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios KyrtzidisClassTemplateSpecializationDecl * 613b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios KyrtzidisClassTemplateSpecializationDecl::Create(ASTContext &Context, EmptyShell Empty) { 61494d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis return 61594d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis new (Context)ClassTemplateSpecializationDecl(ClassTemplateSpecialization); 61694d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis} 61794d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis 618da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregorvoid 619da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas GregorClassTemplateSpecializationDecl::getNameForDiagnostic(std::string &S, 620da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor const PrintingPolicy &Policy, 621da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor bool Qualified) const { 622da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor NamedDecl::getNameForDiagnostic(S, Policy, Qualified); 623da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor 624da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor const TemplateArgumentList &TemplateArgs = getTemplateArgs(); 625da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor S += TemplateSpecializationType::PrintTemplateArgumentList( 626da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor TemplateArgs.data(), 627da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor TemplateArgs.size(), 628da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor Policy); 629da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor} 630da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor 63137d93e9252026d4fb836d9c05d0122a2d46e56beDouglas GregorClassTemplateDecl * 6321eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpClassTemplateSpecializationDecl::getSpecializedTemplate() const { 6331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (SpecializedPartialSpecialization *PartialSpec 63437d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor = SpecializedTemplate.dyn_cast<SpecializedPartialSpecialization*>()) 63537d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor return PartialSpec->PartialSpecialization->getSpecializedTemplate(); 63637d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor return SpecializedTemplate.get<ClassTemplateDecl*>(); 63737d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor} 63837d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor 6394a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo BagnaraSourceRange 6404a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo BagnaraClassTemplateSpecializationDecl::getSourceRange() const { 6414a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo Bagnara if (!ExplicitInfo) 6424a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo Bagnara return SourceRange(); 6434a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo Bagnara SourceLocation Begin = getExternLoc(); 6444a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo Bagnara if (Begin.isInvalid()) 6454a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo Bagnara Begin = getTemplateKeywordLoc(); 6464a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo Bagnara SourceLocation End = getRBraceLoc(); 6474a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo Bagnara if (End.isInvalid()) 6484a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo Bagnara End = getTypeAsWritten()->getTypeLoc().getEndLoc(); 6494a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo Bagnara return SourceRange(Begin, End); 6504a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo Bagnara} 6514a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo Bagnara 652c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor//===----------------------------------------------------------------------===// 653c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor// ClassTemplatePartialSpecializationDecl Implementation 654c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor//===----------------------------------------------------------------------===// 6559a299e0575ce235f491014627c7267e2d2cd73deDouglas GregorClassTemplatePartialSpecializationDecl:: 6569a299e0575ce235f491014627c7267e2d2cd73deDouglas GregorClassTemplatePartialSpecializationDecl(ASTContext &Context, TagKind TK, 657ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara DeclContext *DC, 658ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara SourceLocation StartLoc, 659ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara SourceLocation IdLoc, 6609a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor TemplateParameterList *Params, 6619a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor ClassTemplateDecl *SpecializedTemplate, 6629a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor const TemplateArgument *Args, 6639a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor unsigned NumArgs, 6649a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor TemplateArgumentLoc *ArgInfos, 6659a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor unsigned NumArgInfos, 6669a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor ClassTemplatePartialSpecializationDecl *PrevDecl, 6679a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor unsigned SequenceNumber) 6689a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor : ClassTemplateSpecializationDecl(Context, 6699a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor ClassTemplatePartialSpecialization, 670ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara TK, DC, StartLoc, IdLoc, 671ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara SpecializedTemplate, 6729a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor Args, NumArgs, PrevDecl), 6739a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor TemplateParams(Params), ArgsAsWritten(ArgInfos), 6749a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor NumArgsAsWritten(NumArgInfos), SequenceNumber(SequenceNumber), 6759a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor InstantiatedFromMember(0, false) 6769a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor{ 677787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor AdoptTemplateParameterList(Params, this); 6789a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor} 6799a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor 680c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas GregorClassTemplatePartialSpecializationDecl * 681c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas GregorClassTemplatePartialSpecializationDecl:: 682ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo BagnaraCreate(ASTContext &Context, TagKind TK,DeclContext *DC, 683ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara SourceLocation StartLoc, SourceLocation IdLoc, 684c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor TemplateParameterList *Params, 685c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor ClassTemplateDecl *SpecializedTemplate, 686910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor const TemplateArgument *Args, 687910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor unsigned NumArgs, 688d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall const TemplateArgumentListInfo &ArgInfos, 6893cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall QualType CanonInjectedType, 690dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor ClassTemplatePartialSpecializationDecl *PrevDecl, 691dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor unsigned SequenceNumber) { 692d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall unsigned N = ArgInfos.size(); 693833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateArgumentLoc *ClonedArgs = new (Context) TemplateArgumentLoc[N]; 694833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall for (unsigned I = 0; I != N; ++I) 695833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall ClonedArgs[I] = ArgInfos[I]; 696833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 697c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor ClassTemplatePartialSpecializationDecl *Result 698ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara = new (Context)ClassTemplatePartialSpecializationDecl(Context, TK, DC, 699ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara StartLoc, IdLoc, 700ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara Params, 701c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor SpecializedTemplate, 702910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor Args, NumArgs, 703833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall ClonedArgs, N, 704dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor PrevDecl, 705dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor SequenceNumber); 706c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor Result->setSpecializationKind(TSK_ExplicitSpecialization); 7073cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall 7083cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall Context.getInjectedClassNameType(Result, CanonInjectedType); 709c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor return Result; 710c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor} 711dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall 71294d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios KyrtzidisClassTemplatePartialSpecializationDecl * 713b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios KyrtzidisClassTemplatePartialSpecializationDecl::Create(ASTContext &Context, 714b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios Kyrtzidis EmptyShell Empty) { 71594d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis return new (Context)ClassTemplatePartialSpecializationDecl(); 71694d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis} 71794d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis 718dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall//===----------------------------------------------------------------------===// 719dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall// FriendTemplateDecl Implementation 720dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall//===----------------------------------------------------------------------===// 721dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall 722dd4a3b0065b9a7e7b00073df415a798886c090f3John McCallFriendTemplateDecl *FriendTemplateDecl::Create(ASTContext &Context, 723dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall DeclContext *DC, 724dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall SourceLocation L, 725dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall unsigned NParams, 726dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall TemplateParameterList **Params, 727dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall FriendUnion Friend, 728dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall SourceLocation FLoc) { 729dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall FriendTemplateDecl *Result 730dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall = new (Context) FriendTemplateDecl(DC, L, NParams, Params, Friend, FLoc); 731dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall return Result; 732dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall} 733554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis 734554e6aa2da082575514607c3639c246c04b3232aArgyrios KyrtzidisFriendTemplateDecl *FriendTemplateDecl::Create(ASTContext &Context, 735554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis EmptyShell Empty) { 736554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis return new (Context) FriendTemplateDecl(Empty); 737554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis} 7383e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith 7393e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith//===----------------------------------------------------------------------===// 7403e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith// TypeAliasTemplateDecl Implementation 7413e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith//===----------------------------------------------------------------------===// 7423e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith 7433e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard SmithTypeAliasTemplateDecl *TypeAliasTemplateDecl::Create(ASTContext &C, 7443e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith DeclContext *DC, 7453e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith SourceLocation L, 7463e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith DeclarationName Name, 7473e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith TemplateParameterList *Params, 7483e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith NamedDecl *Decl) { 7493e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith AdoptTemplateParameterList(Params, DC); 7503e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith return new (C) TypeAliasTemplateDecl(DC, L, Name, Params, Decl); 7513e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith} 7523e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith 7533e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard SmithTypeAliasTemplateDecl *TypeAliasTemplateDecl::Create(ASTContext &C, 7543e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith EmptyShell) { 7553e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith return new (C) TypeAliasTemplateDecl(0, SourceLocation(), DeclarationName(), 7563e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith 0, 0); 7573e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith} 7583e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith 7593e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smithvoid TypeAliasTemplateDecl::DeallocateCommon(void *Ptr) { 7603e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith static_cast<Common *>(Ptr)->~Common(); 7613e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith} 7623e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard SmithRedeclarableTemplateDecl::CommonBase * 7633e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard SmithTypeAliasTemplateDecl::newCommon(ASTContext &C) { 7643e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith Common *CommonPtr = new (C) Common; 7653e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith C.AddDeallocation(DeallocateCommon, CommonPtr); 7663e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith return CommonPtr; 7673e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith} 7683e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith 769