DeclTemplate.cpp revision 1a30edb995924b007044ca7abd97d7fbea22007f
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; 461a30edb995924b007044ca7abd97d7fbea22007fRichard Smith unsigned Align = std::max(llvm::alignOf<TemplateParameterList>(), 471a30edb995924b007044ca7abd97d7fbea22007fRichard Smith llvm::alignOf<NamedDecl*>()); 48aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor void *Mem = C.Allocate(Size, Align); 491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return new (Mem) TemplateParameterList(TemplateLoc, LAngleLoc, Params, 50ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas Gregor NumParams, RAngleLoc); 51aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor} 52aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 5362cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregorunsigned TemplateParameterList::getMinRequiredArguments() const { 546952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor unsigned NumRequiredArgs = 0; 556952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor for (iterator P = const_cast<TemplateParameterList *>(this)->begin(), 566952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor PEnd = const_cast<TemplateParameterList *>(this)->end(); 576952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor P != PEnd; ++P) { 586952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor if ((*P)->isTemplateParameterPack()) { 596952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor if (NonTypeTemplateParmDecl *NTTP = dyn_cast<NonTypeTemplateParmDecl>(*P)) 606952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor if (NTTP->isExpandedParameterPack()) { 616952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor NumRequiredArgs += NTTP->getNumExpansionTypes(); 626952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor continue; 636952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor } 646952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor 6562cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor break; 666952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor } 676952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor 686952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(*P)) { 696952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor if (TTP->hasDefaultArgument()) 706952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor break; 716952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor } else if (NonTypeTemplateParmDecl *NTTP 726952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor = dyn_cast<NonTypeTemplateParmDecl>(*P)) { 736952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor if (NTTP->hasDefaultArgument()) 746952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor break; 756952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor } else if (cast<TemplateTemplateParmDecl>(*P)->hasDefaultArgument()) 766952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor break; 776952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor 786952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor ++NumRequiredArgs; 7962cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor } 806952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor 8162cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor return NumRequiredArgs; 8262cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor} 8362cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor 84ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregorunsigned TemplateParameterList::getDepth() const { 85ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor if (size() == 0) 86ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor return 0; 87ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor 88ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor const NamedDecl *FirstParm = getParam(0); 89ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor if (const TemplateTypeParmDecl *TTP 90ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor = dyn_cast<TemplateTypeParmDecl>(FirstParm)) 91ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor return TTP->getDepth(); 92ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor else if (const NonTypeTemplateParmDecl *NTTP 93ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor = dyn_cast<NonTypeTemplateParmDecl>(FirstParm)) 94ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor return NTTP->getDepth(); 95ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor else 96ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor return cast<TemplateTemplateParmDecl>(FirstParm)->getDepth(); 97ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor} 98ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor 99787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregorstatic void AdoptTemplateParameterList(TemplateParameterList *Params, 100787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor DeclContext *Owner) { 101787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor for (TemplateParameterList::iterator P = Params->begin(), 102787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor PEnd = Params->end(); 103787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor P != PEnd; ++P) { 104787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor (*P)->setDeclContext(Owner); 105787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor 106787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor if (TemplateTemplateParmDecl *TTP = dyn_cast<TemplateTemplateParmDecl>(*P)) 107787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor AdoptTemplateParameterList(TTP->getTemplateParameters(), Owner); 108787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor } 109787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor} 110787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor 111aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 1129eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne// RedeclarableTemplateDecl Implementation 1139eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne//===----------------------------------------------------------------------===// 1149eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne 1159eabebafc165a67812eacc184806e7bf34c5f0a5Peter CollingbourneRedeclarableTemplateDecl::CommonBase *RedeclarableTemplateDecl::getCommonPtr() { 1167c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor if (!Common) { 1177c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor // Walk the previous-declaration chain until we either find a declaration 1187c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor // with a common pointer or we run out of previous declarations. 1197c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor llvm::SmallVector<RedeclarableTemplateDecl *, 2> PrevDecls; 120ef96ee0be5f100789f451641542a69cd719144d2Douglas Gregor for (RedeclarableTemplateDecl *Prev = getPreviousDecl(); Prev; 121ef96ee0be5f100789f451641542a69cd719144d2Douglas Gregor Prev = Prev->getPreviousDecl()) { 1227c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor if (Prev->Common) { 1237c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor Common = Prev->Common; 1247c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor break; 1257c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor } 1267c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor 1277c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor PrevDecls.push_back(Prev); 1287c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor } 1299eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne 1307c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor // If we never found a common pointer, allocate one now. 1318a8950b13e4d438f732d24f22f63ebe1a9e0075eDouglas Gregor if (!Common) { 1328a8950b13e4d438f732d24f22f63ebe1a9e0075eDouglas Gregor // FIXME: If any of the declarations is from an AST file, we probably 1338a8950b13e4d438f732d24f22f63ebe1a9e0075eDouglas Gregor // need an update record to add the common data. 1348a8950b13e4d438f732d24f22f63ebe1a9e0075eDouglas Gregor 1357c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor Common = newCommon(getASTContext()); 1368a8950b13e4d438f732d24f22f63ebe1a9e0075eDouglas Gregor } 1377c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor 1387c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor // Update any previous declarations we saw with the common pointer. 1397c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor for (unsigned I = 0, N = PrevDecls.size(); I != N; ++I) 1407c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor PrevDecls[I]->Common = Common; 1418a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne } 1428a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne 1437c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor return Common; 144f88718ea0ca0d64b7fd31d109f1d9ec769a9c45fPeter Collingbourne} 145f88718ea0ca0d64b7fd31d109f1d9ec769a9c45fPeter Collingbourne 1464048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbournetemplate <class EntryType> 1474048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbournetypename RedeclarableTemplateDecl::SpecEntryTraits<EntryType>::DeclType* 1484048590d5774fd4b08661b5cf59b6f90b62f283aPeter CollingbourneRedeclarableTemplateDecl::findSpecializationImpl( 149d964d6380945e0505b623050fe6a3f428008fc2aChandler Carruth llvm::FoldingSetVector<EntryType> &Specs, 1504048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne const TemplateArgument *Args, unsigned NumArgs, 1514048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne void *&InsertPos) { 1524048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne typedef SpecEntryTraits<EntryType> SETraits; 1534048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne llvm::FoldingSetNodeID ID; 1544048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne EntryType::Profile(ID,Args,NumArgs, getASTContext()); 1554048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne EntryType *Entry = Specs.FindNodeOrInsertPos(ID, InsertPos); 156ef96ee0be5f100789f451641542a69cd719144d2Douglas Gregor return Entry ? SETraits::getMostRecentDecl(Entry) : 0; 1574048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne} 1584048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne 159c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor/// \brief Generate the injected template arguments for the given template 160c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor/// parameter list, e.g., for the injected-class-name of a class template. 161c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregorstatic void GenerateInjectedTemplateArgs(ASTContext &Context, 162c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor TemplateParameterList *Params, 163c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor TemplateArgument *Args) { 164c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor for (TemplateParameterList::iterator Param = Params->begin(), 165c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor ParamEnd = Params->end(); 166c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor Param != ParamEnd; ++Param) { 167c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor TemplateArgument Arg; 168c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(*Param)) { 169c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor QualType ArgType = Context.getTypeDeclType(TTP); 170c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor if (TTP->isParameterPack()) 171c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor ArgType = Context.getPackExpansionType(ArgType, 172c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor llvm::Optional<unsigned>()); 173c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor 174c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor Arg = TemplateArgument(ArgType); 175c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor } else if (NonTypeTemplateParmDecl *NTTP = 176c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor dyn_cast<NonTypeTemplateParmDecl>(*Param)) { 177f4b88a45902af1802a1cb42ba48b1c474474f228John McCall Expr *E = new (Context) DeclRefExpr(NTTP, /*enclosing*/ false, 178c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor NTTP->getType().getNonLValueExprType(Context), 179c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor Expr::getValueKindForType(NTTP->getType()), 180c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor NTTP->getLocation()); 181c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor 182c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor if (NTTP->isParameterPack()) 183c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor E = new (Context) PackExpansionExpr(Context.DependentTy, E, 184c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor NTTP->getLocation(), 185c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor llvm::Optional<unsigned>()); 186c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor Arg = TemplateArgument(E); 187c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor } else { 188c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor TemplateTemplateParmDecl *TTP = cast<TemplateTemplateParmDecl>(*Param); 189c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor if (TTP->isParameterPack()) 190c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor Arg = TemplateArgument(TemplateName(TTP), llvm::Optional<unsigned>()); 191c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor else 192c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor Arg = TemplateArgument(TemplateName(TTP)); 193c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor } 194c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor 195c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor if ((*Param)->isTemplateParameterPack()) 196c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor Arg = TemplateArgument::CreatePackCopy(Context, &Arg, 1); 197c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor 198c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor *Args++ = Arg; 199c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor } 200c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor} 201c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor 2029eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne//===----------------------------------------------------------------------===// 203aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// FunctionTemplateDecl Implementation 204aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 205aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 2060054531488928a424666ac11fcdc6bcc5112de52Douglas Gregorvoid FunctionTemplateDecl::DeallocateCommon(void *Ptr) { 2070054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor static_cast<Common *>(Ptr)->~Common(); 2080054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor} 2090054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor 210aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorFunctionTemplateDecl *FunctionTemplateDecl::Create(ASTContext &C, 211aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor DeclContext *DC, 212aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor SourceLocation L, 213aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor DeclarationName Name, 214127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor TemplateParameterList *Params, 215aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor NamedDecl *Decl) { 216787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor AdoptTemplateParameterList(Params, cast<DeclContext>(Decl)); 217aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor return new (C) FunctionTemplateDecl(DC, L, Name, Params, Decl); 218aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor} 219aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 2201e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorFunctionTemplateDecl *FunctionTemplateDecl::CreateDeserialized(ASTContext &C, 2211e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor unsigned ID) { 2221e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor void *Mem = AllocateDeserializedDecl(C, ID, sizeof(FunctionTemplateDecl)); 2231e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor return new (Mem) FunctionTemplateDecl(0, SourceLocation(), DeclarationName(), 2241e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor 0, 0); 2259a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor} 2269a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor 2276b5415196327fa8ef00f028ba175fafef1738ae1Argyrios KyrtzidisRedeclarableTemplateDecl::CommonBase * 2286b5415196327fa8ef00f028ba175fafef1738ae1Argyrios KyrtzidisFunctionTemplateDecl::newCommon(ASTContext &C) { 2296b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis Common *CommonPtr = new (C) Common; 2306b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis C.AddDeallocation(DeallocateCommon, CommonPtr); 2319eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne return CommonPtr; 2329eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne} 2339eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne 2342c853e401ca406d417eb916e867226050e7be06bArgyrios KyrtzidisFunctionDecl * 2352c853e401ca406d417eb916e867226050e7be06bArgyrios KyrtzidisFunctionTemplateDecl::findSpecialization(const TemplateArgument *Args, 2362c853e401ca406d417eb916e867226050e7be06bArgyrios Kyrtzidis unsigned NumArgs, void *&InsertPos) { 2374048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne return findSpecializationImpl(getSpecializations(), Args, NumArgs, InsertPos); 2382c853e401ca406d417eb916e867226050e7be06bArgyrios Kyrtzidis} 2392c853e401ca406d417eb916e867226050e7be06bArgyrios Kyrtzidis 2405bbcdbf36f8cf79d99703ef20848c55960065e43Sebastian Redlvoid FunctionTemplateDecl::addSpecialization( 2415bbcdbf36f8cf79d99703ef20848c55960065e43Sebastian Redl FunctionTemplateSpecializationInfo *Info, void *InsertPos) { 2421e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor if (InsertPos) 2431e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor getSpecializations().InsertNode(Info, InsertPos); 2441e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor else 2451e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor getSpecializations().GetOrInsertNode(Info); 2465bbcdbf36f8cf79d99703ef20848c55960065e43Sebastian Redl if (ASTMutationListener *L = getASTMutationListener()) 2475bbcdbf36f8cf79d99703ef20848c55960065e43Sebastian Redl L->AddedCXXTemplateSpecialization(this, Info->Function); 2485bbcdbf36f8cf79d99703ef20848c55960065e43Sebastian Redl} 2495bbcdbf36f8cf79d99703ef20848c55960065e43Sebastian Redl 250c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregorstd::pair<const TemplateArgument *, unsigned> 251c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas GregorFunctionTemplateDecl::getInjectedTemplateArgs() { 252c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor TemplateParameterList *Params = getTemplateParameters(); 253c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor Common *CommonPtr = getCommonPtr(); 254c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor if (!CommonPtr->InjectedArgs) { 255c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor CommonPtr->InjectedArgs 256c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor = new (getASTContext()) TemplateArgument [Params->size()]; 257c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor GenerateInjectedTemplateArgs(getASTContext(), Params, 258c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor CommonPtr->InjectedArgs); 259c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor } 260c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor 261c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor return std::make_pair(CommonPtr->InjectedArgs, Params->size()); 262c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor} 263c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor 264aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 265aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// ClassTemplateDecl Implementation 266aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 267aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 2680054531488928a424666ac11fcdc6bcc5112de52Douglas Gregorvoid ClassTemplateDecl::DeallocateCommon(void *Ptr) { 2690054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor static_cast<Common *>(Ptr)->~Common(); 2700054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor} 2710054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor 2728731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios KyrtzidisClassTemplateDecl *ClassTemplateDecl::Create(ASTContext &C, 2738731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis DeclContext *DC, 2748731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis SourceLocation L, 2758731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis DeclarationName Name, 2768731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis TemplateParameterList *Params, 2778731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis NamedDecl *Decl, 2788731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis ClassTemplateDecl *PrevDecl) { 279787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor AdoptTemplateParameterList(Params, cast<DeclContext>(Decl)); 2808731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis ClassTemplateDecl *New = new (C) ClassTemplateDecl(DC, L, Name, Params, Decl); 2815bf1bdc2fedb0c29b5fcdb4abc852aa85b4fe26aArgyrios Kyrtzidis New->setPreviousDeclaration(PrevDecl); 2828731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis return New; 2835953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor} 2845953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor 2851e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorClassTemplateDecl *ClassTemplateDecl::CreateDeserialized(ASTContext &C, 2861e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor unsigned ID) { 2871e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor void *Mem = AllocateDeserializedDecl(C, ID, sizeof(ClassTemplateDecl)); 2881e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor return new (Mem) ClassTemplateDecl(EmptyShell()); 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 302d964d6380945e0505b623050fe6a3f428008fc2aChandler Carruthllvm::FoldingSetVector<ClassTemplateSpecializationDecl> & 303c8e5cf8f725e111965debb7130ef7466c0c73884Douglas GregorClassTemplateDecl::getSpecializations() { 304c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor LoadLazySpecializations(); 305c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor return getCommonPtr()->Specializations; 306c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor} 307c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor 308d964d6380945e0505b623050fe6a3f428008fc2aChandler Carruthllvm::FoldingSetVector<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) { 3291e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor if (InsertPos) 3301e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor getSpecializations().InsertNode(D, InsertPos); 3311e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor else { 3321e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor ClassTemplateSpecializationDecl *Existing 3331e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor = getSpecializations().GetOrInsertNode(D); 3341e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor (void)Existing; 3351e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor assert(Existing->isCanonicalDecl() && "Non-canonical specialization?"); 3361e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor } 337bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis if (ASTMutationListener *L = getASTMutationListener()) 338bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis L->AddedCXXTemplateSpecialization(this, D); 339bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis} 340bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis 341cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplatePartialSpecializationDecl * 342cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplateDecl::findPartialSpecialization(const TemplateArgument *Args, 343cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis unsigned NumArgs, 344cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis void *&InsertPos) { 3454048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne return findSpecializationImpl(getPartialSpecializations(), Args, NumArgs, 3464048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne InsertPos); 347cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis} 348cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis 349bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidisvoid ClassTemplateDecl::AddPartialSpecialization( 350bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis ClassTemplatePartialSpecializationDecl *D, 351bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis void *InsertPos) { 3521e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor if (InsertPos) 3531e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor getPartialSpecializations().InsertNode(D, InsertPos); 3541e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor else { 3551e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor ClassTemplatePartialSpecializationDecl *Existing 3561e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor = getPartialSpecializations().GetOrInsertNode(D); 3571e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor (void)Existing; 3581e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor assert(Existing->isCanonicalDecl() && "Non-canonical specialization?"); 3591e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor } 3601e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor 361bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis if (ASTMutationListener *L = getASTMutationListener()) 362bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis L->AddedCXXTemplateSpecialization(this, D); 363bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis} 364bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis 365dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregorvoid ClassTemplateDecl::getPartialSpecializations( 3665f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVectorImpl<ClassTemplatePartialSpecializationDecl *> &PS) { 367d964d6380945e0505b623050fe6a3f428008fc2aChandler Carruth llvm::FoldingSetVector<ClassTemplatePartialSpecializationDecl> &PartialSpecs 3685bf1bdc2fedb0c29b5fcdb4abc852aa85b4fe26aArgyrios Kyrtzidis = getPartialSpecializations(); 369dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor PS.clear(); 370dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor PS.resize(PartialSpecs.size()); 371d964d6380945e0505b623050fe6a3f428008fc2aChandler Carruth for (llvm::FoldingSetVector<ClassTemplatePartialSpecializationDecl>::iterator 372dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor P = PartialSpecs.begin(), PEnd = PartialSpecs.end(); 373dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor P != PEnd; ++P) { 374dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor assert(!PS[P->getSequenceNumber()]); 375ef96ee0be5f100789f451641542a69cd719144d2Douglas Gregor PS[P->getSequenceNumber()] = P->getMostRecentDecl(); 376dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor } 377dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor} 378dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor 379b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas GregorClassTemplatePartialSpecializationDecl * 380b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas GregorClassTemplateDecl::findPartialSpecialization(QualType T) { 381b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor ASTContext &Context = getASTContext(); 382d964d6380945e0505b623050fe6a3f428008fc2aChandler Carruth using llvm::FoldingSetVector; 383d964d6380945e0505b623050fe6a3f428008fc2aChandler Carruth typedef FoldingSetVector<ClassTemplatePartialSpecializationDecl>::iterator 384b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor partial_spec_iterator; 385b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor for (partial_spec_iterator P = getPartialSpecializations().begin(), 386b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor PEnd = getPartialSpecializations().end(); 387b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor P != PEnd; ++P) { 38831f17ecbef57b5679c017c375db330546b7b5145John McCall if (Context.hasSameType(P->getInjectedSpecializationType(), T)) 389ef96ee0be5f100789f451641542a69cd719144d2Douglas Gregor return P->getMostRecentDecl(); 390cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis } 391cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis 392cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis return 0; 393cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis} 394cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis 395cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplatePartialSpecializationDecl * 396cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplateDecl::findPartialSpecInstantiatedFromMember( 397cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis ClassTemplatePartialSpecializationDecl *D) { 398cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis Decl *DCanon = D->getCanonicalDecl(); 399d964d6380945e0505b623050fe6a3f428008fc2aChandler Carruth for (llvm::FoldingSetVector<ClassTemplatePartialSpecializationDecl>::iterator 400cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis P = getPartialSpecializations().begin(), 401cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis PEnd = getPartialSpecializations().end(); 402cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis P != PEnd; ++P) { 403cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis if (P->getInstantiatedFromMember()->getCanonicalDecl() == DCanon) 404ef96ee0be5f100789f451641542a69cd719144d2Douglas Gregor return P->getMostRecentDecl(); 405b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor } 4061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 407b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor return 0; 408b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor} 409b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor 4103cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCallQualType 41124bae92f08ae098cc50a602d8cf1273b423e14daDouglas GregorClassTemplateDecl::getInjectedClassNameSpecialization() { 4125bf1bdc2fedb0c29b5fcdb4abc852aa85b4fe26aArgyrios Kyrtzidis Common *CommonPtr = getCommonPtr(); 4137da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor if (!CommonPtr->InjectedClassNameType.isNull()) 4147da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor return CommonPtr->InjectedClassNameType; 4157da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor 416b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor // C++0x [temp.dep.type]p2: 417b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor // The template argument list of a primary template is a template argument 418b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor // list in which the nth template argument has the value of the nth template 419b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor // parameter of the class template. If the nth template parameter is a 420b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor // template parameter pack (14.5.3), the nth template argument is a pack 421b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor // expansion (14.5.3) whose pattern is the name of the template parameter 422b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor // pack. 42324bae92f08ae098cc50a602d8cf1273b423e14daDouglas Gregor ASTContext &Context = getASTContext(); 4247da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor TemplateParameterList *Params = getTemplateParameters(); 4255f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<TemplateArgument, 16> TemplateArgs; 426c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor TemplateArgs.resize(Params->size()); 427c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor GenerateInjectedTemplateArgs(getASTContext(), Params, TemplateArgs.data()); 4287da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor CommonPtr->InjectedClassNameType 4291275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor = Context.getTemplateSpecializationType(TemplateName(this), 4307da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor &TemplateArgs[0], 4311275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor TemplateArgs.size()); 4327da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor return CommonPtr->InjectedClassNameType; 4337da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor} 4347da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor 435aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 436aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// TemplateTypeParm Allocation/Deallocation Method Implementations 437aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 438aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 439aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorTemplateTypeParmDecl * 4404ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadTemplateTypeParmDecl::Create(const ASTContext &C, DeclContext *DC, 441344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara SourceLocation KeyLoc, SourceLocation NameLoc, 442344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara unsigned D, unsigned P, IdentifierInfo *Id, 443344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara bool Typename, bool ParameterPack) { 4444fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth TemplateTypeParmDecl *TTPDecl = 4454fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth new (C) TemplateTypeParmDecl(DC, KeyLoc, NameLoc, Id, Typename); 4464fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth QualType TTPType = C.getTemplateTypeParmType(D, P, ParameterPack, TTPDecl); 4474fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth TTPDecl->TypeForDecl = TTPType.getTypePtr(); 4484fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth return TTPDecl; 449aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor} 450aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 451b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios KyrtzidisTemplateTypeParmDecl * 4521e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorTemplateTypeParmDecl::CreateDeserialized(const ASTContext &C, unsigned ID) { 4531e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor void *Mem = AllocateDeserializedDecl(C, ID, sizeof(TemplateTypeParmDecl)); 4541e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor return new (Mem) TemplateTypeParmDecl(0, SourceLocation(), SourceLocation(), 4551e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor 0, false); 456b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios Kyrtzidis} 457b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios Kyrtzidis 458833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallSourceLocation TemplateTypeParmDecl::getDefaultArgumentLoc() const { 45977d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara return hasDefaultArgument() 46077d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara ? DefaultArgument->getTypeLoc().getBeginLoc() 46177d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara : SourceLocation(); 46277d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara} 46377d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara 46477d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo BagnaraSourceRange TemplateTypeParmDecl::getSourceRange() const { 46577d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara if (hasDefaultArgument() && !defaultArgumentWasInherited()) 466344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara return SourceRange(getLocStart(), 46777d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara DefaultArgument->getTypeLoc().getEndLoc()); 46877d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara else 469344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara return TypeDecl::getSourceRange(); 470833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall} 471833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 472ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregorunsigned TemplateTypeParmDecl::getDepth() const { 473ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor return TypeForDecl->getAs<TemplateTypeParmType>()->getDepth(); 474ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor} 475ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor 476ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregorunsigned TemplateTypeParmDecl::getIndex() const { 477ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor return TypeForDecl->getAs<TemplateTypeParmType>()->getIndex(); 478ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor} 479ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor 4804fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruthbool TemplateTypeParmDecl::isParameterPack() const { 4814fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth return TypeForDecl->getAs<TemplateTypeParmType>()->isParameterPack(); 4824fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth} 4834fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth 484aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 485aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// NonTypeTemplateParmDecl Method Implementations 486aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 487aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 4886952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas GregorNonTypeTemplateParmDecl::NonTypeTemplateParmDecl(DeclContext *DC, 489ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara SourceLocation StartLoc, 490ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara SourceLocation IdLoc, 491ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara unsigned D, unsigned P, 492ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara IdentifierInfo *Id, 4936952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor QualType T, 4946952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor TypeSourceInfo *TInfo, 4956952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor const QualType *ExpandedTypes, 4966952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor unsigned NumExpandedTypes, 4976952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor TypeSourceInfo **ExpandedTInfos) 498ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara : DeclaratorDecl(NonTypeTemplateParm, DC, IdLoc, Id, T, TInfo, StartLoc), 4996952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor TemplateParmPosition(D, P), DefaultArgumentAndInherited(0, false), 5006952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor ParameterPack(true), ExpandedParameterPack(true), 5016952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor NumExpandedTypes(NumExpandedTypes) 5026952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor{ 5036952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor if (ExpandedTypes && ExpandedTInfos) { 5046952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor void **TypesAndInfos = reinterpret_cast<void **>(this + 1); 5056952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor for (unsigned I = 0; I != NumExpandedTypes; ++I) { 5066952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor TypesAndInfos[2*I] = ExpandedTypes[I].getAsOpaquePtr(); 5076952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor TypesAndInfos[2*I + 1] = ExpandedTInfos[I]; 5086952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor } 5096952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor } 5106952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor} 5116952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor 512aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorNonTypeTemplateParmDecl * 5134ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadNonTypeTemplateParmDecl::Create(const ASTContext &C, DeclContext *DC, 514ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara SourceLocation StartLoc, SourceLocation IdLoc, 515ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara unsigned D, unsigned P, IdentifierInfo *Id, 516ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara QualType T, bool ParameterPack, 517ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara TypeSourceInfo *TInfo) { 518ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara return new (C) NonTypeTemplateParmDecl(DC, StartLoc, IdLoc, D, P, Id, 519ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara T, ParameterPack, TInfo); 520aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor} 521aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 5226952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas GregorNonTypeTemplateParmDecl * 5236952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas GregorNonTypeTemplateParmDecl::Create(const ASTContext &C, DeclContext *DC, 524ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara SourceLocation StartLoc, SourceLocation IdLoc, 525ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara unsigned D, unsigned P, 5266952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor IdentifierInfo *Id, QualType T, 5276952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor TypeSourceInfo *TInfo, 5286952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor const QualType *ExpandedTypes, 5296952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor unsigned NumExpandedTypes, 5306952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor TypeSourceInfo **ExpandedTInfos) { 5316952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor unsigned Size = sizeof(NonTypeTemplateParmDecl) 5326952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor + NumExpandedTypes * 2 * sizeof(void*); 5336952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor void *Mem = C.Allocate(Size); 534ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara return new (Mem) NonTypeTemplateParmDecl(DC, StartLoc, IdLoc, 535ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara D, P, Id, T, TInfo, 5366952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor ExpandedTypes, NumExpandedTypes, 5376952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor ExpandedTInfos); 5386952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor} 5396952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor 5401e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorNonTypeTemplateParmDecl * 5411e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorNonTypeTemplateParmDecl::CreateDeserialized(ASTContext &C, unsigned ID) { 5421e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor void *Mem = AllocateDeserializedDecl(C, ID, sizeof(NonTypeTemplateParmDecl)); 5431e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor return new (Mem) NonTypeTemplateParmDecl(0, SourceLocation(), 5441e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor SourceLocation(), 0, 0, 0, 5451e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor QualType(), false, 0); 5461e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor} 5471e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor 5481e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorNonTypeTemplateParmDecl * 5491e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorNonTypeTemplateParmDecl::CreateDeserialized(ASTContext &C, unsigned ID, 5501e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor unsigned NumExpandedTypes) { 5511e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor unsigned Size = sizeof(NonTypeTemplateParmDecl) 5521e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor + NumExpandedTypes * 2 * sizeof(void*); 5531e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor 5541e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor void *Mem = AllocateDeserializedDecl(C, ID, Size); 5551e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor return new (Mem) NonTypeTemplateParmDecl(0, SourceLocation(), 5561e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor SourceLocation(), 0, 0, 0, 5571e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor QualType(), 0, 0, NumExpandedTypes, 5581e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor 0); 5591e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor} 5601e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor 56176a40219ee5624d78aba167dce02bdbaa930955fJohn McCallSourceRange NonTypeTemplateParmDecl::getSourceRange() const { 562ee4bfd412db491c489fc2ee74916edd73f9c618aAbramo Bagnara if (hasDefaultArgument() && !defaultArgumentWasInherited()) 563a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara return SourceRange(getOuterLocStart(), 564a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara getDefaultArgument()->getSourceRange().getEnd()); 565a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara return DeclaratorDecl::getSourceRange(); 56676a40219ee5624d78aba167dce02bdbaa930955fJohn McCall} 56776a40219ee5624d78aba167dce02bdbaa930955fJohn McCall 568d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas GregorSourceLocation NonTypeTemplateParmDecl::getDefaultArgumentLoc() const { 569d92f7a297c0ed3f7d0ebcbb557e1d4c1925b8c72Abramo Bagnara return hasDefaultArgument() 570d92f7a297c0ed3f7d0ebcbb557e1d4c1925b8c72Abramo Bagnara ? getDefaultArgument()->getSourceRange().getBegin() 571d92f7a297c0ed3f7d0ebcbb557e1d4c1925b8c72Abramo Bagnara : SourceLocation(); 572d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas Gregor} 573d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas Gregor 574aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 575aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// TemplateTemplateParmDecl Method Implementations 576aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 577aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 57899ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid TemplateTemplateParmDecl::anchor() { } 57999ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie 580aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorTemplateTemplateParmDecl * 5814ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadTemplateTemplateParmDecl::Create(const ASTContext &C, DeclContext *DC, 582aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor SourceLocation L, unsigned D, unsigned P, 58361c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor bool ParameterPack, IdentifierInfo *Id, 584aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor TemplateParameterList *Params) { 58561c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor return new (C) TemplateTemplateParmDecl(DC, L, D, P, ParameterPack, Id, 58661c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor Params); 587aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor} 588aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 5891e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorTemplateTemplateParmDecl * 5901e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorTemplateTemplateParmDecl::CreateDeserialized(ASTContext &C, unsigned ID) { 5911e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor void *Mem = AllocateDeserializedDecl(C, ID, sizeof(TemplateTemplateParmDecl)); 5921e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor return new (Mem) TemplateTemplateParmDecl(0, SourceLocation(), 0, 0, false, 5931e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor 0, 0); 5941e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor} 5951e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor 5963e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor//===----------------------------------------------------------------------===// 5977e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor// TemplateArgumentList Implementation 5987e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor//===----------------------------------------------------------------------===// 599910f8008fea79120489a53593fe971b0b8a4a740Douglas GregorTemplateArgumentList * 600910f8008fea79120489a53593fe971b0b8a4a740Douglas GregorTemplateArgumentList::CreateCopy(ASTContext &Context, 601910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor const TemplateArgument *Args, 602910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor unsigned NumArgs) { 603910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor std::size_t Size = sizeof(TemplateArgumentList) 604910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor + NumArgs * sizeof(TemplateArgument); 605910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor void *Mem = Context.Allocate(Size); 606910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor TemplateArgument *StoredArgs 607910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor = reinterpret_cast<TemplateArgument *>( 608910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor static_cast<TemplateArgumentList *>(Mem) + 1); 609910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor std::uninitialized_copy(Args, Args + NumArgs, StoredArgs); 610910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor return new (Mem) TemplateArgumentList(StoredArgs, NumArgs, true); 61194d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis} 61294d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis 61371a7605977113c795edd44fcbd2302ad49506653Argyrios KyrtzidisFunctionTemplateSpecializationInfo * 61471a7605977113c795edd44fcbd2302ad49506653Argyrios KyrtzidisFunctionTemplateSpecializationInfo::Create(ASTContext &C, FunctionDecl *FD, 61571a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis FunctionTemplateDecl *Template, 61671a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis TemplateSpecializationKind TSK, 61771a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis const TemplateArgumentList *TemplateArgs, 61871a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis const TemplateArgumentListInfo *TemplateArgsAsWritten, 61971a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis SourceLocation POI) { 62071a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis const ASTTemplateArgumentListInfo *ArgsAsWritten = 0; 62171a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis if (TemplateArgsAsWritten) 62271a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis ArgsAsWritten = ASTTemplateArgumentListInfo::Create(C, 62371a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis *TemplateArgsAsWritten); 62471a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis 62571a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis return new (C) FunctionTemplateSpecializationInfo(FD, Template, TSK, 62671a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis TemplateArgs, 62771a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis ArgsAsWritten, 62871a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis POI); 62971a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis} 63071a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis 6317e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor//===----------------------------------------------------------------------===// 63299ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie// TemplateDecl Implementation 63399ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie//===----------------------------------------------------------------------===// 63499ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie 63599ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid TemplateDecl::anchor() { } 63699ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie 63799ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie//===----------------------------------------------------------------------===// 6383e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor// ClassTemplateSpecializationDecl Implementation 6393e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor//===----------------------------------------------------------------------===// 6403e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas GregorClassTemplateSpecializationDecl:: 64113c8577201e4fc0ddac5f09d05fd1778832137d1Douglas GregorClassTemplateSpecializationDecl(ASTContext &Context, Kind DK, TagKind TK, 642ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara DeclContext *DC, SourceLocation StartLoc, 643ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara SourceLocation IdLoc, 6443e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor ClassTemplateDecl *SpecializedTemplate, 645910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor const TemplateArgument *Args, 646910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor unsigned NumArgs, 6478e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor ClassTemplateSpecializationDecl *PrevDecl) 648ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara : CXXRecordDecl(DK, TK, DC, StartLoc, IdLoc, 6498e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor SpecializedTemplate->getIdentifier(), 6508e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor PrevDecl), 6513e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor SpecializedTemplate(SpecializedTemplate), 652c98971d5c994caed9452aeadd0122c855e0f4de1Abramo Bagnara ExplicitInfo(0), 653910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor TemplateArgs(TemplateArgumentList::CreateCopy(Context, Args, NumArgs)), 6547e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor SpecializationKind(TSK_Undeclared) { 6553e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor} 6561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 65794d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios KyrtzidisClassTemplateSpecializationDecl::ClassTemplateSpecializationDecl(Kind DK) 658ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara : CXXRecordDecl(DK, TTK_Struct, 0, SourceLocation(), SourceLocation(), 0, 0), 65994d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis ExplicitInfo(0), 66094d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis SpecializationKind(TSK_Undeclared) { 66194d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis} 66294d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis 6633e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas GregorClassTemplateSpecializationDecl * 66413c8577201e4fc0ddac5f09d05fd1778832137d1Douglas GregorClassTemplateSpecializationDecl::Create(ASTContext &Context, TagKind TK, 665ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara DeclContext *DC, 666ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara SourceLocation StartLoc, 667ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara SourceLocation IdLoc, 6683e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor ClassTemplateDecl *SpecializedTemplate, 669910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor const TemplateArgument *Args, 670910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor unsigned NumArgs, 671cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor ClassTemplateSpecializationDecl *PrevDecl) { 672cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor ClassTemplateSpecializationDecl *Result 6731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump = new (Context)ClassTemplateSpecializationDecl(Context, 674c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor ClassTemplateSpecialization, 675ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara TK, DC, StartLoc, IdLoc, 6767e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor SpecializedTemplate, 677910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor Args, NumArgs, 6788e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor PrevDecl); 679cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor Context.getTypeDeclType(Result, PrevDecl); 680cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor return Result; 6813e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor} 682c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor 68394d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios KyrtzidisClassTemplateSpecializationDecl * 6841e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorClassTemplateSpecializationDecl::CreateDeserialized(ASTContext &C, 6851e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor unsigned ID) { 6861e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor void *Mem = AllocateDeserializedDecl(C, ID, 6871e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor sizeof(ClassTemplateSpecializationDecl)); 6881e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor return new (Mem) ClassTemplateSpecializationDecl(ClassTemplateSpecialization); 68994d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis} 69094d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis 691da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregorvoid 692da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas GregorClassTemplateSpecializationDecl::getNameForDiagnostic(std::string &S, 693da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor const PrintingPolicy &Policy, 694da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor bool Qualified) const { 695da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor NamedDecl::getNameForDiagnostic(S, Policy, Qualified); 696da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor 697da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor const TemplateArgumentList &TemplateArgs = getTemplateArgs(); 698da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor S += TemplateSpecializationType::PrintTemplateArgumentList( 699da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor TemplateArgs.data(), 700da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor TemplateArgs.size(), 701da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor Policy); 702da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor} 703da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor 70437d93e9252026d4fb836d9c05d0122a2d46e56beDouglas GregorClassTemplateDecl * 7051eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpClassTemplateSpecializationDecl::getSpecializedTemplate() const { 7061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (SpecializedPartialSpecialization *PartialSpec 70737d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor = SpecializedTemplate.dyn_cast<SpecializedPartialSpecialization*>()) 70837d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor return PartialSpec->PartialSpecialization->getSpecializedTemplate(); 70937d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor return SpecializedTemplate.get<ClassTemplateDecl*>(); 71037d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor} 71137d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor 7124a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo BagnaraSourceRange 7134a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo BagnaraClassTemplateSpecializationDecl::getSourceRange() const { 71409d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara if (ExplicitInfo) { 71509d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara SourceLocation Begin = getExternLoc(); 71609d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara if (Begin.isInvalid()) 71709d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara Begin = getTemplateKeywordLoc(); 71809d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara SourceLocation End = getRBraceLoc(); 71909d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara if (End.isInvalid()) 72009d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara End = getTypeAsWritten()->getTypeLoc().getEndLoc(); 72109d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara return SourceRange(Begin, End); 72209d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara } 72309d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara else { 72409d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara // No explicit info available. 72509d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara llvm::PointerUnion<ClassTemplateDecl *, 72609d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara ClassTemplatePartialSpecializationDecl *> 72709d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara inst_from = getInstantiatedFrom(); 72809d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara if (inst_from.isNull()) 72909d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara return getSpecializedTemplate()->getSourceRange(); 73009d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara if (ClassTemplateDecl *ctd = inst_from.dyn_cast<ClassTemplateDecl*>()) 73109d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara return ctd->getSourceRange(); 73209d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara return inst_from.get<ClassTemplatePartialSpecializationDecl*>() 73309d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara ->getSourceRange(); 73409d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara } 7354a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo Bagnara} 7364a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo Bagnara 737c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor//===----------------------------------------------------------------------===// 738c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor// ClassTemplatePartialSpecializationDecl Implementation 739c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor//===----------------------------------------------------------------------===// 74099ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid ClassTemplatePartialSpecializationDecl::anchor() { } 74199ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie 7429a299e0575ce235f491014627c7267e2d2cd73deDouglas GregorClassTemplatePartialSpecializationDecl:: 7439a299e0575ce235f491014627c7267e2d2cd73deDouglas GregorClassTemplatePartialSpecializationDecl(ASTContext &Context, TagKind TK, 744ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara DeclContext *DC, 745ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara SourceLocation StartLoc, 746ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara SourceLocation IdLoc, 7479a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor TemplateParameterList *Params, 7489a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor ClassTemplateDecl *SpecializedTemplate, 7499a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor const TemplateArgument *Args, 7509a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor unsigned NumArgs, 7519a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor TemplateArgumentLoc *ArgInfos, 7529a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor unsigned NumArgInfos, 7539a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor ClassTemplatePartialSpecializationDecl *PrevDecl, 7549a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor unsigned SequenceNumber) 7559a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor : ClassTemplateSpecializationDecl(Context, 7569a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor ClassTemplatePartialSpecialization, 757ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara TK, DC, StartLoc, IdLoc, 758ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara SpecializedTemplate, 7599a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor Args, NumArgs, PrevDecl), 7609a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor TemplateParams(Params), ArgsAsWritten(ArgInfos), 7619a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor NumArgsAsWritten(NumArgInfos), SequenceNumber(SequenceNumber), 7629a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor InstantiatedFromMember(0, false) 7639a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor{ 764787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor AdoptTemplateParameterList(Params, this); 7659a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor} 7669a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor 767c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas GregorClassTemplatePartialSpecializationDecl * 768c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas GregorClassTemplatePartialSpecializationDecl:: 769ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo BagnaraCreate(ASTContext &Context, TagKind TK,DeclContext *DC, 770ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara SourceLocation StartLoc, SourceLocation IdLoc, 771c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor TemplateParameterList *Params, 772c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor ClassTemplateDecl *SpecializedTemplate, 773910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor const TemplateArgument *Args, 774910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor unsigned NumArgs, 775d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall const TemplateArgumentListInfo &ArgInfos, 7763cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall QualType CanonInjectedType, 777dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor ClassTemplatePartialSpecializationDecl *PrevDecl, 778dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor unsigned SequenceNumber) { 779d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall unsigned N = ArgInfos.size(); 780833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateArgumentLoc *ClonedArgs = new (Context) TemplateArgumentLoc[N]; 781833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall for (unsigned I = 0; I != N; ++I) 782833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall ClonedArgs[I] = ArgInfos[I]; 783833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 784c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor ClassTemplatePartialSpecializationDecl *Result 785ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara = new (Context)ClassTemplatePartialSpecializationDecl(Context, TK, DC, 786ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara StartLoc, IdLoc, 787ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara Params, 788c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor SpecializedTemplate, 789910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor Args, NumArgs, 790833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall ClonedArgs, N, 791dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor PrevDecl, 792dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor SequenceNumber); 793c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor Result->setSpecializationKind(TSK_ExplicitSpecialization); 7943cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall 7953cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall Context.getInjectedClassNameType(Result, CanonInjectedType); 796c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor return Result; 797c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor} 798dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall 79994d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios KyrtzidisClassTemplatePartialSpecializationDecl * 8001e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorClassTemplatePartialSpecializationDecl::CreateDeserialized(ASTContext &C, 8011e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor unsigned ID) { 8021e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor void *Mem = AllocateDeserializedDecl(C, ID, 8031e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor sizeof(ClassTemplatePartialSpecializationDecl)); 8041e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor return new (Mem) ClassTemplatePartialSpecializationDecl(); 80594d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis} 80694d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis 807dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall//===----------------------------------------------------------------------===// 808dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall// FriendTemplateDecl Implementation 809dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall//===----------------------------------------------------------------------===// 810dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall 81199ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid FriendTemplateDecl::anchor() { } 81299ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie 813dd4a3b0065b9a7e7b00073df415a798886c090f3John McCallFriendTemplateDecl *FriendTemplateDecl::Create(ASTContext &Context, 814dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall DeclContext *DC, 815dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall SourceLocation L, 816dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall unsigned NParams, 817dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall TemplateParameterList **Params, 818dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall FriendUnion Friend, 819dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall SourceLocation FLoc) { 820dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall FriendTemplateDecl *Result 821dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall = new (Context) FriendTemplateDecl(DC, L, NParams, Params, Friend, FLoc); 822dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall return Result; 823dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall} 824554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis 8251e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorFriendTemplateDecl *FriendTemplateDecl::CreateDeserialized(ASTContext &C, 8261e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor unsigned ID) { 8271e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor void *Mem = AllocateDeserializedDecl(C, ID, sizeof(FriendTemplateDecl)); 8281e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor return new (Mem) FriendTemplateDecl(EmptyShell()); 829554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis} 8303e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith 8313e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith//===----------------------------------------------------------------------===// 8323e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith// TypeAliasTemplateDecl Implementation 8333e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith//===----------------------------------------------------------------------===// 8343e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith 8353e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard SmithTypeAliasTemplateDecl *TypeAliasTemplateDecl::Create(ASTContext &C, 8363e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith DeclContext *DC, 8373e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith SourceLocation L, 8383e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith DeclarationName Name, 8393e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith TemplateParameterList *Params, 8403e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith NamedDecl *Decl) { 8413e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith AdoptTemplateParameterList(Params, DC); 8423e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith return new (C) TypeAliasTemplateDecl(DC, L, Name, Params, Decl); 8433e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith} 8443e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith 8451e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorTypeAliasTemplateDecl *TypeAliasTemplateDecl::CreateDeserialized(ASTContext &C, 8461e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor unsigned ID) { 8471e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor void *Mem = AllocateDeserializedDecl(C, ID, sizeof(TypeAliasTemplateDecl)); 8481e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor return new (Mem) TypeAliasTemplateDecl(0, SourceLocation(), DeclarationName(), 8491e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor 0, 0); 8503e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith} 8513e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith 8523e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smithvoid TypeAliasTemplateDecl::DeallocateCommon(void *Ptr) { 8533e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith static_cast<Common *>(Ptr)->~Common(); 8543e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith} 8553e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard SmithRedeclarableTemplateDecl::CommonBase * 8563e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard SmithTypeAliasTemplateDecl::newCommon(ASTContext &C) { 8573e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith Common *CommonPtr = new (C) Common; 8583e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith C.AddDeallocation(DeallocateCommon, CommonPtr); 8593e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith return CommonPtr; 8603e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith} 8613e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith 86299ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie//===----------------------------------------------------------------------===// 86399ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie// ClassScopeFunctionSpecializationDecl Implementation 86499ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie//===----------------------------------------------------------------------===// 86599ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie 86699ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid ClassScopeFunctionSpecializationDecl::anchor() { } 8671e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor 8681e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorClassScopeFunctionSpecializationDecl * 8691e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorClassScopeFunctionSpecializationDecl::CreateDeserialized(ASTContext &C, 8701e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor unsigned ID) { 8711e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor void *Mem = AllocateDeserializedDecl(C, ID, 8721e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor sizeof(ClassScopeFunctionSpecializationDecl)); 8736b02009359a462ffe633696a4441313b462e6566Nico Weber return new (Mem) ClassScopeFunctionSpecializationDecl(0, SourceLocation(), 0, 8746b02009359a462ffe633696a4441313b462e6566Nico Weber false, TemplateArgumentListInfo()); 8751e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor} 876