DeclTemplate.cpp revision 6b02009359a462ffe633696a4441313b462e6566
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() { 1157c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor if (!Common) { 1167c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor // Walk the previous-declaration chain until we either find a declaration 1177c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor // with a common pointer or we run out of previous declarations. 1187c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor llvm::SmallVector<RedeclarableTemplateDecl *, 2> PrevDecls; 119ef96ee0be5f100789f451641542a69cd719144d2Douglas Gregor for (RedeclarableTemplateDecl *Prev = getPreviousDecl(); Prev; 120ef96ee0be5f100789f451641542a69cd719144d2Douglas Gregor Prev = Prev->getPreviousDecl()) { 1217c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor if (Prev->Common) { 1227c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor Common = Prev->Common; 1237c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor break; 1247c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor } 1257c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor 1267c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor PrevDecls.push_back(Prev); 1277c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor } 1289eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne 1297c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor // If we never found a common pointer, allocate one now. 1308a8950b13e4d438f732d24f22f63ebe1a9e0075eDouglas Gregor if (!Common) { 1318a8950b13e4d438f732d24f22f63ebe1a9e0075eDouglas Gregor // FIXME: If any of the declarations is from an AST file, we probably 1328a8950b13e4d438f732d24f22f63ebe1a9e0075eDouglas Gregor // need an update record to add the common data. 1338a8950b13e4d438f732d24f22f63ebe1a9e0075eDouglas Gregor 1347c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor Common = newCommon(getASTContext()); 1358a8950b13e4d438f732d24f22f63ebe1a9e0075eDouglas Gregor } 1367c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor 1377c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor // Update any previous declarations we saw with the common pointer. 1387c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor for (unsigned I = 0, N = PrevDecls.size(); I != N; ++I) 1397c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor PrevDecls[I]->Common = Common; 1408a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne } 1418a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne 1427c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor return Common; 143f88718ea0ca0d64b7fd31d109f1d9ec769a9c45fPeter Collingbourne} 144f88718ea0ca0d64b7fd31d109f1d9ec769a9c45fPeter Collingbourne 1454048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbournetemplate <class EntryType> 1464048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbournetypename RedeclarableTemplateDecl::SpecEntryTraits<EntryType>::DeclType* 1474048590d5774fd4b08661b5cf59b6f90b62f283aPeter CollingbourneRedeclarableTemplateDecl::findSpecializationImpl( 148d964d6380945e0505b623050fe6a3f428008fc2aChandler Carruth llvm::FoldingSetVector<EntryType> &Specs, 1494048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne const TemplateArgument *Args, unsigned NumArgs, 1504048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne void *&InsertPos) { 1514048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne typedef SpecEntryTraits<EntryType> SETraits; 1524048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne llvm::FoldingSetNodeID ID; 1534048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne EntryType::Profile(ID,Args,NumArgs, getASTContext()); 1544048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne EntryType *Entry = Specs.FindNodeOrInsertPos(ID, InsertPos); 155ef96ee0be5f100789f451641542a69cd719144d2Douglas Gregor return Entry ? SETraits::getMostRecentDecl(Entry) : 0; 1564048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne} 1574048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne 158c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor/// \brief Generate the injected template arguments for the given template 159c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor/// parameter list, e.g., for the injected-class-name of a class template. 160c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregorstatic void GenerateInjectedTemplateArgs(ASTContext &Context, 161c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor TemplateParameterList *Params, 162c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor TemplateArgument *Args) { 163c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor for (TemplateParameterList::iterator Param = Params->begin(), 164c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor ParamEnd = Params->end(); 165c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor Param != ParamEnd; ++Param) { 166c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor TemplateArgument Arg; 167c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(*Param)) { 168c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor QualType ArgType = Context.getTypeDeclType(TTP); 169c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor if (TTP->isParameterPack()) 170c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor ArgType = Context.getPackExpansionType(ArgType, 171c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor llvm::Optional<unsigned>()); 172c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor 173c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor Arg = TemplateArgument(ArgType); 174c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor } else if (NonTypeTemplateParmDecl *NTTP = 175c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor dyn_cast<NonTypeTemplateParmDecl>(*Param)) { 176f4b88a45902af1802a1cb42ba48b1c474474f228John McCall Expr *E = new (Context) DeclRefExpr(NTTP, /*enclosing*/ false, 177c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor NTTP->getType().getNonLValueExprType(Context), 178c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor Expr::getValueKindForType(NTTP->getType()), 179c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor NTTP->getLocation()); 180c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor 181c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor if (NTTP->isParameterPack()) 182c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor E = new (Context) PackExpansionExpr(Context.DependentTy, E, 183c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor NTTP->getLocation(), 184c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor llvm::Optional<unsigned>()); 185c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor Arg = TemplateArgument(E); 186c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor } else { 187c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor TemplateTemplateParmDecl *TTP = cast<TemplateTemplateParmDecl>(*Param); 188c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor if (TTP->isParameterPack()) 189c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor Arg = TemplateArgument(TemplateName(TTP), llvm::Optional<unsigned>()); 190c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor else 191c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor Arg = TemplateArgument(TemplateName(TTP)); 192c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor } 193c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor 194c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor if ((*Param)->isTemplateParameterPack()) 195c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor Arg = TemplateArgument::CreatePackCopy(Context, &Arg, 1); 196c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor 197c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor *Args++ = Arg; 198c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor } 199c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor} 200c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor 2019eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne//===----------------------------------------------------------------------===// 202aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// FunctionTemplateDecl Implementation 203aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 204aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 2050054531488928a424666ac11fcdc6bcc5112de52Douglas Gregorvoid FunctionTemplateDecl::DeallocateCommon(void *Ptr) { 2060054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor static_cast<Common *>(Ptr)->~Common(); 2070054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor} 2080054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor 209aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorFunctionTemplateDecl *FunctionTemplateDecl::Create(ASTContext &C, 210aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor DeclContext *DC, 211aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor SourceLocation L, 212aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor DeclarationName Name, 213127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor TemplateParameterList *Params, 214aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor NamedDecl *Decl) { 215787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor AdoptTemplateParameterList(Params, cast<DeclContext>(Decl)); 216aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor return new (C) FunctionTemplateDecl(DC, L, Name, Params, Decl); 217aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor} 218aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 2191e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorFunctionTemplateDecl *FunctionTemplateDecl::CreateDeserialized(ASTContext &C, 2201e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor unsigned ID) { 2211e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor void *Mem = AllocateDeserializedDecl(C, ID, sizeof(FunctionTemplateDecl)); 2221e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor return new (Mem) FunctionTemplateDecl(0, SourceLocation(), DeclarationName(), 2231e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor 0, 0); 2249a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor} 2259a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor 2266b5415196327fa8ef00f028ba175fafef1738ae1Argyrios KyrtzidisRedeclarableTemplateDecl::CommonBase * 2276b5415196327fa8ef00f028ba175fafef1738ae1Argyrios KyrtzidisFunctionTemplateDecl::newCommon(ASTContext &C) { 2286b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis Common *CommonPtr = new (C) Common; 2296b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis C.AddDeallocation(DeallocateCommon, CommonPtr); 2309eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne return CommonPtr; 2319eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne} 2329eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne 2332c853e401ca406d417eb916e867226050e7be06bArgyrios KyrtzidisFunctionDecl * 2342c853e401ca406d417eb916e867226050e7be06bArgyrios KyrtzidisFunctionTemplateDecl::findSpecialization(const TemplateArgument *Args, 2352c853e401ca406d417eb916e867226050e7be06bArgyrios Kyrtzidis unsigned NumArgs, void *&InsertPos) { 2364048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne return findSpecializationImpl(getSpecializations(), Args, NumArgs, InsertPos); 2372c853e401ca406d417eb916e867226050e7be06bArgyrios Kyrtzidis} 2382c853e401ca406d417eb916e867226050e7be06bArgyrios Kyrtzidis 2395bbcdbf36f8cf79d99703ef20848c55960065e43Sebastian Redlvoid FunctionTemplateDecl::addSpecialization( 2405bbcdbf36f8cf79d99703ef20848c55960065e43Sebastian Redl FunctionTemplateSpecializationInfo *Info, void *InsertPos) { 2411e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor if (InsertPos) 2421e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor getSpecializations().InsertNode(Info, InsertPos); 2431e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor else 2441e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor getSpecializations().GetOrInsertNode(Info); 2455bbcdbf36f8cf79d99703ef20848c55960065e43Sebastian Redl if (ASTMutationListener *L = getASTMutationListener()) 2465bbcdbf36f8cf79d99703ef20848c55960065e43Sebastian Redl L->AddedCXXTemplateSpecialization(this, Info->Function); 2475bbcdbf36f8cf79d99703ef20848c55960065e43Sebastian Redl} 2485bbcdbf36f8cf79d99703ef20848c55960065e43Sebastian Redl 249c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregorstd::pair<const TemplateArgument *, unsigned> 250c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas GregorFunctionTemplateDecl::getInjectedTemplateArgs() { 251c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor TemplateParameterList *Params = getTemplateParameters(); 252c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor Common *CommonPtr = getCommonPtr(); 253c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor if (!CommonPtr->InjectedArgs) { 254c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor CommonPtr->InjectedArgs 255c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor = new (getASTContext()) TemplateArgument [Params->size()]; 256c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor GenerateInjectedTemplateArgs(getASTContext(), Params, 257c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor CommonPtr->InjectedArgs); 258c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor } 259c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor 260c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor return std::make_pair(CommonPtr->InjectedArgs, Params->size()); 261c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor} 262c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor 263aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 264aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// ClassTemplateDecl Implementation 265aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 266aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 2670054531488928a424666ac11fcdc6bcc5112de52Douglas Gregorvoid ClassTemplateDecl::DeallocateCommon(void *Ptr) { 2680054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor static_cast<Common *>(Ptr)->~Common(); 2690054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor} 2700054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor 2718731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios KyrtzidisClassTemplateDecl *ClassTemplateDecl::Create(ASTContext &C, 2728731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis DeclContext *DC, 2738731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis SourceLocation L, 2748731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis DeclarationName Name, 2758731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis TemplateParameterList *Params, 2768731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis NamedDecl *Decl, 2778731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis ClassTemplateDecl *PrevDecl) { 278787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor AdoptTemplateParameterList(Params, cast<DeclContext>(Decl)); 2798731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis ClassTemplateDecl *New = new (C) ClassTemplateDecl(DC, L, Name, Params, Decl); 2805bf1bdc2fedb0c29b5fcdb4abc852aa85b4fe26aArgyrios Kyrtzidis New->setPreviousDeclaration(PrevDecl); 2818731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis return New; 2825953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor} 2835953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor 2841e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorClassTemplateDecl *ClassTemplateDecl::CreateDeserialized(ASTContext &C, 2851e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor unsigned ID) { 2861e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor void *Mem = AllocateDeserializedDecl(C, ID, sizeof(ClassTemplateDecl)); 2871e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor return new (Mem) ClassTemplateDecl(EmptyShell()); 2889a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor} 2899a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor 290c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregorvoid ClassTemplateDecl::LoadLazySpecializations() { 291c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor Common *CommonPtr = getCommonPtr(); 292c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor if (CommonPtr->LazySpecializations) { 293c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor ASTContext &Context = getASTContext(); 294c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor uint32_t *Specs = CommonPtr->LazySpecializations; 295c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor CommonPtr->LazySpecializations = 0; 296c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor for (uint32_t I = 0, N = *Specs++; I != N; ++I) 297c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor (void)Context.getExternalSource()->GetExternalDecl(Specs[I]); 298c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor } 299c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor} 300c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor 301d964d6380945e0505b623050fe6a3f428008fc2aChandler Carruthllvm::FoldingSetVector<ClassTemplateSpecializationDecl> & 302c8e5cf8f725e111965debb7130ef7466c0c73884Douglas GregorClassTemplateDecl::getSpecializations() { 303c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor LoadLazySpecializations(); 304c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor return getCommonPtr()->Specializations; 305c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor} 306c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor 307d964d6380945e0505b623050fe6a3f428008fc2aChandler Carruthllvm::FoldingSetVector<ClassTemplatePartialSpecializationDecl> & 308c8e5cf8f725e111965debb7130ef7466c0c73884Douglas GregorClassTemplateDecl::getPartialSpecializations() { 309c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor LoadLazySpecializations(); 310c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor return getCommonPtr()->PartialSpecializations; 311c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor} 312c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor 3136b5415196327fa8ef00f028ba175fafef1738ae1Argyrios KyrtzidisRedeclarableTemplateDecl::CommonBase * 3146b5415196327fa8ef00f028ba175fafef1738ae1Argyrios KyrtzidisClassTemplateDecl::newCommon(ASTContext &C) { 3156b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis Common *CommonPtr = new (C) Common; 3166b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis C.AddDeallocation(DeallocateCommon, CommonPtr); 3179eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne return CommonPtr; 3189eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne} 3199eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne 320cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplateSpecializationDecl * 321cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplateDecl::findSpecialization(const TemplateArgument *Args, 322cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis unsigned NumArgs, void *&InsertPos) { 3234048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne return findSpecializationImpl(getSpecializations(), Args, NumArgs, InsertPos); 324cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis} 325cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis 326bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidisvoid ClassTemplateDecl::AddSpecialization(ClassTemplateSpecializationDecl *D, 327bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis void *InsertPos) { 3281e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor if (InsertPos) 3291e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor getSpecializations().InsertNode(D, InsertPos); 3301e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor else { 3311e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor ClassTemplateSpecializationDecl *Existing 3321e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor = getSpecializations().GetOrInsertNode(D); 3331e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor (void)Existing; 3341e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor assert(Existing->isCanonicalDecl() && "Non-canonical specialization?"); 3351e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor } 336bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis if (ASTMutationListener *L = getASTMutationListener()) 337bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis L->AddedCXXTemplateSpecialization(this, D); 338bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis} 339bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis 340cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplatePartialSpecializationDecl * 341cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplateDecl::findPartialSpecialization(const TemplateArgument *Args, 342cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis unsigned NumArgs, 343cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis void *&InsertPos) { 3444048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne return findSpecializationImpl(getPartialSpecializations(), Args, NumArgs, 3454048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne InsertPos); 346cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis} 347cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis 348bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidisvoid ClassTemplateDecl::AddPartialSpecialization( 349bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis ClassTemplatePartialSpecializationDecl *D, 350bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis void *InsertPos) { 3511e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor if (InsertPos) 3521e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor getPartialSpecializations().InsertNode(D, InsertPos); 3531e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor else { 3541e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor ClassTemplatePartialSpecializationDecl *Existing 3551e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor = getPartialSpecializations().GetOrInsertNode(D); 3561e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor (void)Existing; 3571e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor assert(Existing->isCanonicalDecl() && "Non-canonical specialization?"); 3581e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor } 3591e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor 360bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis if (ASTMutationListener *L = getASTMutationListener()) 361bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis L->AddedCXXTemplateSpecialization(this, D); 362bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis} 363bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis 364dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregorvoid ClassTemplateDecl::getPartialSpecializations( 3655f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVectorImpl<ClassTemplatePartialSpecializationDecl *> &PS) { 366d964d6380945e0505b623050fe6a3f428008fc2aChandler Carruth llvm::FoldingSetVector<ClassTemplatePartialSpecializationDecl> &PartialSpecs 3675bf1bdc2fedb0c29b5fcdb4abc852aa85b4fe26aArgyrios Kyrtzidis = getPartialSpecializations(); 368dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor PS.clear(); 369dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor PS.resize(PartialSpecs.size()); 370d964d6380945e0505b623050fe6a3f428008fc2aChandler Carruth for (llvm::FoldingSetVector<ClassTemplatePartialSpecializationDecl>::iterator 371dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor P = PartialSpecs.begin(), PEnd = PartialSpecs.end(); 372dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor P != PEnd; ++P) { 373dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor assert(!PS[P->getSequenceNumber()]); 374ef96ee0be5f100789f451641542a69cd719144d2Douglas Gregor PS[P->getSequenceNumber()] = P->getMostRecentDecl(); 375dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor } 376dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor} 377dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor 378b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas GregorClassTemplatePartialSpecializationDecl * 379b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas GregorClassTemplateDecl::findPartialSpecialization(QualType T) { 380b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor ASTContext &Context = getASTContext(); 381d964d6380945e0505b623050fe6a3f428008fc2aChandler Carruth using llvm::FoldingSetVector; 382d964d6380945e0505b623050fe6a3f428008fc2aChandler Carruth typedef FoldingSetVector<ClassTemplatePartialSpecializationDecl>::iterator 383b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor partial_spec_iterator; 384b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor for (partial_spec_iterator P = getPartialSpecializations().begin(), 385b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor PEnd = getPartialSpecializations().end(); 386b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor P != PEnd; ++P) { 38731f17ecbef57b5679c017c375db330546b7b5145John McCall if (Context.hasSameType(P->getInjectedSpecializationType(), T)) 388ef96ee0be5f100789f451641542a69cd719144d2Douglas Gregor return P->getMostRecentDecl(); 389cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis } 390cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis 391cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis return 0; 392cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis} 393cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis 394cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplatePartialSpecializationDecl * 395cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplateDecl::findPartialSpecInstantiatedFromMember( 396cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis ClassTemplatePartialSpecializationDecl *D) { 397cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis Decl *DCanon = D->getCanonicalDecl(); 398d964d6380945e0505b623050fe6a3f428008fc2aChandler Carruth for (llvm::FoldingSetVector<ClassTemplatePartialSpecializationDecl>::iterator 399cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis P = getPartialSpecializations().begin(), 400cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis PEnd = getPartialSpecializations().end(); 401cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis P != PEnd; ++P) { 402cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis if (P->getInstantiatedFromMember()->getCanonicalDecl() == DCanon) 403ef96ee0be5f100789f451641542a69cd719144d2Douglas Gregor return P->getMostRecentDecl(); 404b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor } 4051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 406b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor return 0; 407b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor} 408b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor 4093cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCallQualType 41024bae92f08ae098cc50a602d8cf1273b423e14daDouglas GregorClassTemplateDecl::getInjectedClassNameSpecialization() { 4115bf1bdc2fedb0c29b5fcdb4abc852aa85b4fe26aArgyrios Kyrtzidis Common *CommonPtr = getCommonPtr(); 4127da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor if (!CommonPtr->InjectedClassNameType.isNull()) 4137da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor return CommonPtr->InjectedClassNameType; 4147da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor 415b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor // C++0x [temp.dep.type]p2: 416b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor // The template argument list of a primary template is a template argument 417b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor // list in which the nth template argument has the value of the nth template 418b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor // parameter of the class template. If the nth template parameter is a 419b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor // template parameter pack (14.5.3), the nth template argument is a pack 420b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor // expansion (14.5.3) whose pattern is the name of the template parameter 421b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor // pack. 42224bae92f08ae098cc50a602d8cf1273b423e14daDouglas Gregor ASTContext &Context = getASTContext(); 4237da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor TemplateParameterList *Params = getTemplateParameters(); 4245f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<TemplateArgument, 16> TemplateArgs; 425c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor TemplateArgs.resize(Params->size()); 426c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor GenerateInjectedTemplateArgs(getASTContext(), Params, TemplateArgs.data()); 4277da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor CommonPtr->InjectedClassNameType 4281275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor = Context.getTemplateSpecializationType(TemplateName(this), 4297da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor &TemplateArgs[0], 4301275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor TemplateArgs.size()); 4317da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor return CommonPtr->InjectedClassNameType; 4327da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor} 4337da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor 434aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 435aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// TemplateTypeParm Allocation/Deallocation Method Implementations 436aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 437aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 438aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorTemplateTypeParmDecl * 4394ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadTemplateTypeParmDecl::Create(const ASTContext &C, DeclContext *DC, 440344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara SourceLocation KeyLoc, SourceLocation NameLoc, 441344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara unsigned D, unsigned P, IdentifierInfo *Id, 442344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara bool Typename, bool ParameterPack) { 4434fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth TemplateTypeParmDecl *TTPDecl = 4444fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth new (C) TemplateTypeParmDecl(DC, KeyLoc, NameLoc, Id, Typename); 4454fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth QualType TTPType = C.getTemplateTypeParmType(D, P, ParameterPack, TTPDecl); 4464fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth TTPDecl->TypeForDecl = TTPType.getTypePtr(); 4474fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth return TTPDecl; 448aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor} 449aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 450b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios KyrtzidisTemplateTypeParmDecl * 4511e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorTemplateTypeParmDecl::CreateDeserialized(const ASTContext &C, unsigned ID) { 4521e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor void *Mem = AllocateDeserializedDecl(C, ID, sizeof(TemplateTypeParmDecl)); 4531e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor return new (Mem) TemplateTypeParmDecl(0, SourceLocation(), SourceLocation(), 4541e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor 0, false); 455b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios Kyrtzidis} 456b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios Kyrtzidis 457833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallSourceLocation TemplateTypeParmDecl::getDefaultArgumentLoc() const { 45877d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara return hasDefaultArgument() 45977d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara ? DefaultArgument->getTypeLoc().getBeginLoc() 46077d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara : SourceLocation(); 46177d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara} 46277d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara 46377d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo BagnaraSourceRange TemplateTypeParmDecl::getSourceRange() const { 46477d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara if (hasDefaultArgument() && !defaultArgumentWasInherited()) 465344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara return SourceRange(getLocStart(), 46677d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara DefaultArgument->getTypeLoc().getEndLoc()); 46777d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara else 468344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara return TypeDecl::getSourceRange(); 469833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall} 470833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 471ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregorunsigned TemplateTypeParmDecl::getDepth() const { 472ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor return TypeForDecl->getAs<TemplateTypeParmType>()->getDepth(); 473ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor} 474ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor 475ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregorunsigned TemplateTypeParmDecl::getIndex() const { 476ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor return TypeForDecl->getAs<TemplateTypeParmType>()->getIndex(); 477ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor} 478ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor 4794fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruthbool TemplateTypeParmDecl::isParameterPack() const { 4804fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth return TypeForDecl->getAs<TemplateTypeParmType>()->isParameterPack(); 4814fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth} 4824fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth 483aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 484aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// NonTypeTemplateParmDecl Method Implementations 485aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 486aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 4876952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas GregorNonTypeTemplateParmDecl::NonTypeTemplateParmDecl(DeclContext *DC, 488ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara SourceLocation StartLoc, 489ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara SourceLocation IdLoc, 490ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara unsigned D, unsigned P, 491ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara IdentifierInfo *Id, 4926952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor QualType T, 4936952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor TypeSourceInfo *TInfo, 4946952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor const QualType *ExpandedTypes, 4956952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor unsigned NumExpandedTypes, 4966952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor TypeSourceInfo **ExpandedTInfos) 497ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara : DeclaratorDecl(NonTypeTemplateParm, DC, IdLoc, Id, T, TInfo, StartLoc), 4986952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor TemplateParmPosition(D, P), DefaultArgumentAndInherited(0, false), 4996952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor ParameterPack(true), ExpandedParameterPack(true), 5006952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor NumExpandedTypes(NumExpandedTypes) 5016952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor{ 5026952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor if (ExpandedTypes && ExpandedTInfos) { 5036952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor void **TypesAndInfos = reinterpret_cast<void **>(this + 1); 5046952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor for (unsigned I = 0; I != NumExpandedTypes; ++I) { 5056952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor TypesAndInfos[2*I] = ExpandedTypes[I].getAsOpaquePtr(); 5066952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor TypesAndInfos[2*I + 1] = ExpandedTInfos[I]; 5076952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor } 5086952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor } 5096952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor} 5106952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor 511aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorNonTypeTemplateParmDecl * 5124ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadNonTypeTemplateParmDecl::Create(const ASTContext &C, DeclContext *DC, 513ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara SourceLocation StartLoc, SourceLocation IdLoc, 514ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara unsigned D, unsigned P, IdentifierInfo *Id, 515ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara QualType T, bool ParameterPack, 516ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara TypeSourceInfo *TInfo) { 517ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara return new (C) NonTypeTemplateParmDecl(DC, StartLoc, IdLoc, D, P, Id, 518ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara T, ParameterPack, TInfo); 519aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor} 520aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 5216952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas GregorNonTypeTemplateParmDecl * 5226952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas GregorNonTypeTemplateParmDecl::Create(const ASTContext &C, DeclContext *DC, 523ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara SourceLocation StartLoc, SourceLocation IdLoc, 524ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara unsigned D, unsigned P, 5256952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor IdentifierInfo *Id, QualType T, 5266952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor TypeSourceInfo *TInfo, 5276952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor const QualType *ExpandedTypes, 5286952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor unsigned NumExpandedTypes, 5296952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor TypeSourceInfo **ExpandedTInfos) { 5306952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor unsigned Size = sizeof(NonTypeTemplateParmDecl) 5316952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor + NumExpandedTypes * 2 * sizeof(void*); 5326952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor void *Mem = C.Allocate(Size); 533ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara return new (Mem) NonTypeTemplateParmDecl(DC, StartLoc, IdLoc, 534ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara D, P, Id, T, TInfo, 5356952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor ExpandedTypes, NumExpandedTypes, 5366952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor ExpandedTInfos); 5376952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor} 5386952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor 5391e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorNonTypeTemplateParmDecl * 5401e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorNonTypeTemplateParmDecl::CreateDeserialized(ASTContext &C, unsigned ID) { 5411e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor void *Mem = AllocateDeserializedDecl(C, ID, sizeof(NonTypeTemplateParmDecl)); 5421e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor return new (Mem) NonTypeTemplateParmDecl(0, SourceLocation(), 5431e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor SourceLocation(), 0, 0, 0, 5441e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor QualType(), false, 0); 5451e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor} 5461e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor 5471e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorNonTypeTemplateParmDecl * 5481e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorNonTypeTemplateParmDecl::CreateDeserialized(ASTContext &C, unsigned ID, 5491e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor unsigned NumExpandedTypes) { 5501e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor unsigned Size = sizeof(NonTypeTemplateParmDecl) 5511e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor + NumExpandedTypes * 2 * sizeof(void*); 5521e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor 5531e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor void *Mem = AllocateDeserializedDecl(C, ID, Size); 5541e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor return new (Mem) NonTypeTemplateParmDecl(0, SourceLocation(), 5551e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor SourceLocation(), 0, 0, 0, 5561e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor QualType(), 0, 0, NumExpandedTypes, 5571e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor 0); 5581e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor} 5591e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor 56076a40219ee5624d78aba167dce02bdbaa930955fJohn McCallSourceRange NonTypeTemplateParmDecl::getSourceRange() const { 561ee4bfd412db491c489fc2ee74916edd73f9c618aAbramo Bagnara if (hasDefaultArgument() && !defaultArgumentWasInherited()) 562a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara return SourceRange(getOuterLocStart(), 563a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara getDefaultArgument()->getSourceRange().getEnd()); 564a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara return DeclaratorDecl::getSourceRange(); 56576a40219ee5624d78aba167dce02bdbaa930955fJohn McCall} 56676a40219ee5624d78aba167dce02bdbaa930955fJohn McCall 567d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas GregorSourceLocation NonTypeTemplateParmDecl::getDefaultArgumentLoc() const { 568d92f7a297c0ed3f7d0ebcbb557e1d4c1925b8c72Abramo Bagnara return hasDefaultArgument() 569d92f7a297c0ed3f7d0ebcbb557e1d4c1925b8c72Abramo Bagnara ? getDefaultArgument()->getSourceRange().getBegin() 570d92f7a297c0ed3f7d0ebcbb557e1d4c1925b8c72Abramo Bagnara : SourceLocation(); 571d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas Gregor} 572d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas Gregor 573aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 574aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// TemplateTemplateParmDecl Method Implementations 575aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 576aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 57799ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid TemplateTemplateParmDecl::anchor() { } 57899ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie 579aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorTemplateTemplateParmDecl * 5804ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadTemplateTemplateParmDecl::Create(const ASTContext &C, DeclContext *DC, 581aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor SourceLocation L, unsigned D, unsigned P, 58261c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor bool ParameterPack, IdentifierInfo *Id, 583aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor TemplateParameterList *Params) { 58461c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor return new (C) TemplateTemplateParmDecl(DC, L, D, P, ParameterPack, Id, 58561c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor Params); 586aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor} 587aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 5881e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorTemplateTemplateParmDecl * 5891e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorTemplateTemplateParmDecl::CreateDeserialized(ASTContext &C, unsigned ID) { 5901e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor void *Mem = AllocateDeserializedDecl(C, ID, sizeof(TemplateTemplateParmDecl)); 5911e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor return new (Mem) TemplateTemplateParmDecl(0, SourceLocation(), 0, 0, false, 5921e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor 0, 0); 5931e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor} 5941e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor 5953e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor//===----------------------------------------------------------------------===// 5967e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor// TemplateArgumentList Implementation 5977e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor//===----------------------------------------------------------------------===// 598910f8008fea79120489a53593fe971b0b8a4a740Douglas GregorTemplateArgumentList * 599910f8008fea79120489a53593fe971b0b8a4a740Douglas GregorTemplateArgumentList::CreateCopy(ASTContext &Context, 600910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor const TemplateArgument *Args, 601910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor unsigned NumArgs) { 602910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor std::size_t Size = sizeof(TemplateArgumentList) 603910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor + NumArgs * sizeof(TemplateArgument); 604910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor void *Mem = Context.Allocate(Size); 605910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor TemplateArgument *StoredArgs 606910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor = reinterpret_cast<TemplateArgument *>( 607910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor static_cast<TemplateArgumentList *>(Mem) + 1); 608910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor std::uninitialized_copy(Args, Args + NumArgs, StoredArgs); 609910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor return new (Mem) TemplateArgumentList(StoredArgs, NumArgs, true); 61094d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis} 61194d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis 61271a7605977113c795edd44fcbd2302ad49506653Argyrios KyrtzidisFunctionTemplateSpecializationInfo * 61371a7605977113c795edd44fcbd2302ad49506653Argyrios KyrtzidisFunctionTemplateSpecializationInfo::Create(ASTContext &C, FunctionDecl *FD, 61471a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis FunctionTemplateDecl *Template, 61571a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis TemplateSpecializationKind TSK, 61671a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis const TemplateArgumentList *TemplateArgs, 61771a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis const TemplateArgumentListInfo *TemplateArgsAsWritten, 61871a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis SourceLocation POI) { 61971a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis const ASTTemplateArgumentListInfo *ArgsAsWritten = 0; 62071a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis if (TemplateArgsAsWritten) 62171a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis ArgsAsWritten = ASTTemplateArgumentListInfo::Create(C, 62271a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis *TemplateArgsAsWritten); 62371a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis 62471a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis return new (C) FunctionTemplateSpecializationInfo(FD, Template, TSK, 62571a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis TemplateArgs, 62671a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis ArgsAsWritten, 62771a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis POI); 62871a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis} 62971a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis 6307e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor//===----------------------------------------------------------------------===// 63199ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie// TemplateDecl Implementation 63299ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie//===----------------------------------------------------------------------===// 63399ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie 63499ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid TemplateDecl::anchor() { } 63599ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie 63699ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie//===----------------------------------------------------------------------===// 6373e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor// ClassTemplateSpecializationDecl Implementation 6383e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor//===----------------------------------------------------------------------===// 6393e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas GregorClassTemplateSpecializationDecl:: 64013c8577201e4fc0ddac5f09d05fd1778832137d1Douglas GregorClassTemplateSpecializationDecl(ASTContext &Context, Kind DK, TagKind TK, 641ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara DeclContext *DC, SourceLocation StartLoc, 642ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara SourceLocation IdLoc, 6433e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor ClassTemplateDecl *SpecializedTemplate, 644910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor const TemplateArgument *Args, 645910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor unsigned NumArgs, 6468e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor ClassTemplateSpecializationDecl *PrevDecl) 647ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara : CXXRecordDecl(DK, TK, DC, StartLoc, IdLoc, 6488e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor SpecializedTemplate->getIdentifier(), 6498e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor PrevDecl), 6503e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor SpecializedTemplate(SpecializedTemplate), 651c98971d5c994caed9452aeadd0122c855e0f4de1Abramo Bagnara ExplicitInfo(0), 652910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor TemplateArgs(TemplateArgumentList::CreateCopy(Context, Args, NumArgs)), 6537e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor SpecializationKind(TSK_Undeclared) { 6543e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor} 6551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 65694d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios KyrtzidisClassTemplateSpecializationDecl::ClassTemplateSpecializationDecl(Kind DK) 657ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara : CXXRecordDecl(DK, TTK_Struct, 0, SourceLocation(), SourceLocation(), 0, 0), 65894d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis ExplicitInfo(0), 65994d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis SpecializationKind(TSK_Undeclared) { 66094d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis} 66194d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis 6623e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas GregorClassTemplateSpecializationDecl * 66313c8577201e4fc0ddac5f09d05fd1778832137d1Douglas GregorClassTemplateSpecializationDecl::Create(ASTContext &Context, TagKind TK, 664ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara DeclContext *DC, 665ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara SourceLocation StartLoc, 666ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara SourceLocation IdLoc, 6673e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor ClassTemplateDecl *SpecializedTemplate, 668910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor const TemplateArgument *Args, 669910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor unsigned NumArgs, 670cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor ClassTemplateSpecializationDecl *PrevDecl) { 671cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor ClassTemplateSpecializationDecl *Result 6721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump = new (Context)ClassTemplateSpecializationDecl(Context, 673c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor ClassTemplateSpecialization, 674ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara TK, DC, StartLoc, IdLoc, 6757e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor SpecializedTemplate, 676910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor Args, NumArgs, 6778e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor PrevDecl); 678cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor Context.getTypeDeclType(Result, PrevDecl); 679cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor return Result; 6803e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor} 681c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor 68294d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios KyrtzidisClassTemplateSpecializationDecl * 6831e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorClassTemplateSpecializationDecl::CreateDeserialized(ASTContext &C, 6841e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor unsigned ID) { 6851e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor void *Mem = AllocateDeserializedDecl(C, ID, 6861e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor sizeof(ClassTemplateSpecializationDecl)); 6871e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor return new (Mem) ClassTemplateSpecializationDecl(ClassTemplateSpecialization); 68894d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis} 68994d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis 690da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregorvoid 691da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas GregorClassTemplateSpecializationDecl::getNameForDiagnostic(std::string &S, 692da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor const PrintingPolicy &Policy, 693da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor bool Qualified) const { 694da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor NamedDecl::getNameForDiagnostic(S, Policy, Qualified); 695da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor 696da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor const TemplateArgumentList &TemplateArgs = getTemplateArgs(); 697da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor S += TemplateSpecializationType::PrintTemplateArgumentList( 698da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor TemplateArgs.data(), 699da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor TemplateArgs.size(), 700da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor Policy); 701da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor} 702da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor 70337d93e9252026d4fb836d9c05d0122a2d46e56beDouglas GregorClassTemplateDecl * 7041eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpClassTemplateSpecializationDecl::getSpecializedTemplate() const { 7051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (SpecializedPartialSpecialization *PartialSpec 70637d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor = SpecializedTemplate.dyn_cast<SpecializedPartialSpecialization*>()) 70737d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor return PartialSpec->PartialSpecialization->getSpecializedTemplate(); 70837d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor return SpecializedTemplate.get<ClassTemplateDecl*>(); 70937d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor} 71037d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor 7114a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo BagnaraSourceRange 7124a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo BagnaraClassTemplateSpecializationDecl::getSourceRange() const { 71309d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara if (ExplicitInfo) { 71409d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara SourceLocation Begin = getExternLoc(); 71509d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara if (Begin.isInvalid()) 71609d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara Begin = getTemplateKeywordLoc(); 71709d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara SourceLocation End = getRBraceLoc(); 71809d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara if (End.isInvalid()) 71909d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara End = getTypeAsWritten()->getTypeLoc().getEndLoc(); 72009d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara return SourceRange(Begin, End); 72109d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara } 72209d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara else { 72309d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara // No explicit info available. 72409d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara llvm::PointerUnion<ClassTemplateDecl *, 72509d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara ClassTemplatePartialSpecializationDecl *> 72609d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara inst_from = getInstantiatedFrom(); 72709d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara if (inst_from.isNull()) 72809d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara return getSpecializedTemplate()->getSourceRange(); 72909d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara if (ClassTemplateDecl *ctd = inst_from.dyn_cast<ClassTemplateDecl*>()) 73009d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara return ctd->getSourceRange(); 73109d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara return inst_from.get<ClassTemplatePartialSpecializationDecl*>() 73209d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara ->getSourceRange(); 73309d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara } 7344a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo Bagnara} 7354a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo Bagnara 736c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor//===----------------------------------------------------------------------===// 737c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor// ClassTemplatePartialSpecializationDecl Implementation 738c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor//===----------------------------------------------------------------------===// 73999ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid ClassTemplatePartialSpecializationDecl::anchor() { } 74099ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie 7419a299e0575ce235f491014627c7267e2d2cd73deDouglas GregorClassTemplatePartialSpecializationDecl:: 7429a299e0575ce235f491014627c7267e2d2cd73deDouglas GregorClassTemplatePartialSpecializationDecl(ASTContext &Context, TagKind TK, 743ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara DeclContext *DC, 744ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara SourceLocation StartLoc, 745ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara SourceLocation IdLoc, 7469a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor TemplateParameterList *Params, 7479a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor ClassTemplateDecl *SpecializedTemplate, 7489a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor const TemplateArgument *Args, 7499a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor unsigned NumArgs, 7509a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor TemplateArgumentLoc *ArgInfos, 7519a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor unsigned NumArgInfos, 7529a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor ClassTemplatePartialSpecializationDecl *PrevDecl, 7539a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor unsigned SequenceNumber) 7549a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor : ClassTemplateSpecializationDecl(Context, 7559a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor ClassTemplatePartialSpecialization, 756ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara TK, DC, StartLoc, IdLoc, 757ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara SpecializedTemplate, 7589a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor Args, NumArgs, PrevDecl), 7599a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor TemplateParams(Params), ArgsAsWritten(ArgInfos), 7609a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor NumArgsAsWritten(NumArgInfos), SequenceNumber(SequenceNumber), 7619a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor InstantiatedFromMember(0, false) 7629a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor{ 763787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor AdoptTemplateParameterList(Params, this); 7649a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor} 7659a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor 766c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas GregorClassTemplatePartialSpecializationDecl * 767c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas GregorClassTemplatePartialSpecializationDecl:: 768ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo BagnaraCreate(ASTContext &Context, TagKind TK,DeclContext *DC, 769ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara SourceLocation StartLoc, SourceLocation IdLoc, 770c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor TemplateParameterList *Params, 771c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor ClassTemplateDecl *SpecializedTemplate, 772910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor const TemplateArgument *Args, 773910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor unsigned NumArgs, 774d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall const TemplateArgumentListInfo &ArgInfos, 7753cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall QualType CanonInjectedType, 776dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor ClassTemplatePartialSpecializationDecl *PrevDecl, 777dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor unsigned SequenceNumber) { 778d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall unsigned N = ArgInfos.size(); 779833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateArgumentLoc *ClonedArgs = new (Context) TemplateArgumentLoc[N]; 780833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall for (unsigned I = 0; I != N; ++I) 781833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall ClonedArgs[I] = ArgInfos[I]; 782833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 783c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor ClassTemplatePartialSpecializationDecl *Result 784ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara = new (Context)ClassTemplatePartialSpecializationDecl(Context, TK, DC, 785ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara StartLoc, IdLoc, 786ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara Params, 787c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor SpecializedTemplate, 788910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor Args, NumArgs, 789833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall ClonedArgs, N, 790dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor PrevDecl, 791dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor SequenceNumber); 792c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor Result->setSpecializationKind(TSK_ExplicitSpecialization); 7933cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall 7943cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall Context.getInjectedClassNameType(Result, CanonInjectedType); 795c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor return Result; 796c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor} 797dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall 79894d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios KyrtzidisClassTemplatePartialSpecializationDecl * 7991e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorClassTemplatePartialSpecializationDecl::CreateDeserialized(ASTContext &C, 8001e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor unsigned ID) { 8011e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor void *Mem = AllocateDeserializedDecl(C, ID, 8021e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor sizeof(ClassTemplatePartialSpecializationDecl)); 8031e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor return new (Mem) ClassTemplatePartialSpecializationDecl(); 80494d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis} 80594d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis 806dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall//===----------------------------------------------------------------------===// 807dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall// FriendTemplateDecl Implementation 808dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall//===----------------------------------------------------------------------===// 809dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall 81099ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid FriendTemplateDecl::anchor() { } 81199ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie 812dd4a3b0065b9a7e7b00073df415a798886c090f3John McCallFriendTemplateDecl *FriendTemplateDecl::Create(ASTContext &Context, 813dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall DeclContext *DC, 814dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall SourceLocation L, 815dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall unsigned NParams, 816dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall TemplateParameterList **Params, 817dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall FriendUnion Friend, 818dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall SourceLocation FLoc) { 819dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall FriendTemplateDecl *Result 820dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall = new (Context) FriendTemplateDecl(DC, L, NParams, Params, Friend, FLoc); 821dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall return Result; 822dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall} 823554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis 8241e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorFriendTemplateDecl *FriendTemplateDecl::CreateDeserialized(ASTContext &C, 8251e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor unsigned ID) { 8261e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor void *Mem = AllocateDeserializedDecl(C, ID, sizeof(FriendTemplateDecl)); 8271e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor return new (Mem) FriendTemplateDecl(EmptyShell()); 828554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis} 8293e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith 8303e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith//===----------------------------------------------------------------------===// 8313e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith// TypeAliasTemplateDecl Implementation 8323e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith//===----------------------------------------------------------------------===// 8333e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith 8343e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard SmithTypeAliasTemplateDecl *TypeAliasTemplateDecl::Create(ASTContext &C, 8353e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith DeclContext *DC, 8363e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith SourceLocation L, 8373e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith DeclarationName Name, 8383e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith TemplateParameterList *Params, 8393e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith NamedDecl *Decl) { 8403e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith AdoptTemplateParameterList(Params, DC); 8413e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith return new (C) TypeAliasTemplateDecl(DC, L, Name, Params, Decl); 8423e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith} 8433e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith 8441e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorTypeAliasTemplateDecl *TypeAliasTemplateDecl::CreateDeserialized(ASTContext &C, 8451e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor unsigned ID) { 8461e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor void *Mem = AllocateDeserializedDecl(C, ID, sizeof(TypeAliasTemplateDecl)); 8471e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor return new (Mem) TypeAliasTemplateDecl(0, SourceLocation(), DeclarationName(), 8481e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor 0, 0); 8493e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith} 8503e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith 8513e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smithvoid TypeAliasTemplateDecl::DeallocateCommon(void *Ptr) { 8523e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith static_cast<Common *>(Ptr)->~Common(); 8533e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith} 8543e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard SmithRedeclarableTemplateDecl::CommonBase * 8553e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard SmithTypeAliasTemplateDecl::newCommon(ASTContext &C) { 8563e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith Common *CommonPtr = new (C) Common; 8573e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith C.AddDeallocation(DeallocateCommon, CommonPtr); 8583e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith return CommonPtr; 8593e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith} 8603e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith 86199ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie//===----------------------------------------------------------------------===// 86299ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie// ClassScopeFunctionSpecializationDecl Implementation 86399ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie//===----------------------------------------------------------------------===// 86499ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie 86599ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid ClassScopeFunctionSpecializationDecl::anchor() { } 8661e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor 8671e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorClassScopeFunctionSpecializationDecl * 8681e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorClassScopeFunctionSpecializationDecl::CreateDeserialized(ASTContext &C, 8691e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor unsigned ID) { 8701e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor void *Mem = AllocateDeserializedDecl(C, ID, 8711e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor sizeof(ClassScopeFunctionSpecializationDecl)); 8726b02009359a462ffe633696a4441313b462e6566Nico Weber return new (Mem) ClassScopeFunctionSpecializationDecl(0, SourceLocation(), 0, 8736b02009359a462ffe633696a4441313b462e6566Nico Weber false, TemplateArgumentListInfo()); 8741e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor} 875