DeclTemplate.cpp revision 344577e6b58f42d18dc8118c8903b49a85dc005e
106a59bb8260ce3d52de761865dee90f90054a5ccSebastian Redl//===--- DeclTemplate.cpp - Template Declaration AST Node Implementation --===// 2aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// 3aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// The LLVM Compiler Infrastructure 4aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// 5aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// This file is distributed under the University of Illinois Open Source 6aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// License. See LICENSE.TXT for details. 7aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// 8aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 9aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// 10aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// This file implements the C++ related Decl classes for templates. 11aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// 12aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 13aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 14aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor#include "clang/AST/DeclCXX.h" 15aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor#include "clang/AST/DeclTemplate.h" 1655f6b14230c94272efbbcdd89a92224c8db9f225Douglas Gregor#include "clang/AST/Expr.h" 17b95cc97b2023d00cd3fbae8455bc9d728eab5e5dDouglas Gregor#include "clang/AST/ExprCXX.h" 18aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor#include "clang/AST/ASTContext.h" 19833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall#include "clang/AST/TypeLoc.h" 20bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis#include "clang/AST/ASTMutationListener.h" 21aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor#include "clang/Basic/IdentifierTable.h" 22aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor#include "llvm/ADT/STLExtras.h" 23910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor#include <memory> 24aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregorusing namespace clang; 25aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 26aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 27aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// TemplateParameterList Implementation 28aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 29aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 30ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas GregorTemplateParameterList::TemplateParameterList(SourceLocation TemplateLoc, 31ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas Gregor SourceLocation LAngleLoc, 32bf4ea56cdc376cef5a12abf6bf18dc34805c2226Douglas Gregor NamedDecl **Params, unsigned NumParams, 33ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas Gregor SourceLocation RAngleLoc) 34ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas Gregor : TemplateLoc(TemplateLoc), LAngleLoc(LAngleLoc), RAngleLoc(RAngleLoc), 35ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas Gregor NumParams(NumParams) { 36aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor for (unsigned Idx = 0; Idx < NumParams; ++Idx) 37aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor begin()[Idx] = Params[Idx]; 38aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor} 39aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 40aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorTemplateParameterList * 414ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadTemplateParameterList::Create(const ASTContext &C, SourceLocation TemplateLoc, 42bf4ea56cdc376cef5a12abf6bf18dc34805c2226Douglas Gregor SourceLocation LAngleLoc, NamedDecl **Params, 43ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas Gregor unsigned NumParams, SourceLocation RAngleLoc) { 44bf4ea56cdc376cef5a12abf6bf18dc34805c2226Douglas Gregor unsigned Size = sizeof(TemplateParameterList) 45bf4ea56cdc376cef5a12abf6bf18dc34805c2226Douglas Gregor + sizeof(NamedDecl *) * NumParams; 46aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor unsigned Align = llvm::AlignOf<TemplateParameterList>::Alignment; 47aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor void *Mem = C.Allocate(Size, Align); 481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return new (Mem) TemplateParameterList(TemplateLoc, LAngleLoc, Params, 49ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas Gregor NumParams, RAngleLoc); 50aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor} 51aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 5262cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregorunsigned TemplateParameterList::getMinRequiredArguments() const { 536952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor unsigned NumRequiredArgs = 0; 546952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor for (iterator P = const_cast<TemplateParameterList *>(this)->begin(), 556952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor PEnd = const_cast<TemplateParameterList *>(this)->end(); 566952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor P != PEnd; ++P) { 576952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor if ((*P)->isTemplateParameterPack()) { 586952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor if (NonTypeTemplateParmDecl *NTTP = dyn_cast<NonTypeTemplateParmDecl>(*P)) 596952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor if (NTTP->isExpandedParameterPack()) { 606952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor NumRequiredArgs += NTTP->getNumExpansionTypes(); 616952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor continue; 626952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor } 636952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor 6462cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor break; 656952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor } 666952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor 676952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(*P)) { 686952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor if (TTP->hasDefaultArgument()) 696952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor break; 706952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor } else if (NonTypeTemplateParmDecl *NTTP 716952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor = dyn_cast<NonTypeTemplateParmDecl>(*P)) { 726952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor if (NTTP->hasDefaultArgument()) 736952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor break; 746952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor } else if (cast<TemplateTemplateParmDecl>(*P)->hasDefaultArgument()) 756952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor break; 766952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor 776952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor ++NumRequiredArgs; 7862cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor } 796952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor 8062cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor return NumRequiredArgs; 8162cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor} 8262cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor 83ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregorunsigned TemplateParameterList::getDepth() const { 84ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor if (size() == 0) 85ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor return 0; 86ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor 87ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor const NamedDecl *FirstParm = getParam(0); 88ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor if (const TemplateTypeParmDecl *TTP 89ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor = dyn_cast<TemplateTypeParmDecl>(FirstParm)) 90ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor return TTP->getDepth(); 91ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor else if (const NonTypeTemplateParmDecl *NTTP 92ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor = dyn_cast<NonTypeTemplateParmDecl>(FirstParm)) 93ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor return NTTP->getDepth(); 94ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor else 95ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor return cast<TemplateTemplateParmDecl>(FirstParm)->getDepth(); 96ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor} 97ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor 98787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregorstatic void AdoptTemplateParameterList(TemplateParameterList *Params, 99787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor DeclContext *Owner) { 100787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor for (TemplateParameterList::iterator P = Params->begin(), 101787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor PEnd = Params->end(); 102787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor P != PEnd; ++P) { 103787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor (*P)->setDeclContext(Owner); 104787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor 105787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor if (TemplateTemplateParmDecl *TTP = dyn_cast<TemplateTemplateParmDecl>(*P)) 106787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor AdoptTemplateParameterList(TTP->getTemplateParameters(), Owner); 107787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor } 108787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor} 109787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor 110aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 1119eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne// RedeclarableTemplateDecl Implementation 1129eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne//===----------------------------------------------------------------------===// 1139eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne 1149eabebafc165a67812eacc184806e7bf34c5f0a5Peter CollingbourneRedeclarableTemplateDecl::CommonBase *RedeclarableTemplateDecl::getCommonPtr() { 1159eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne // Find the first declaration of this function template. 1169eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne RedeclarableTemplateDecl *First = getCanonicalDecl(); 1179eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne 1189eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne if (First->CommonOrPrev.isNull()) { 1196b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis CommonBase *CommonPtr = First->newCommon(getASTContext()); 1209eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne First->CommonOrPrev = CommonPtr; 1218a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne CommonPtr->Latest = First; 1229eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne } 1239eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne return First->CommonOrPrev.get<CommonBase*>(); 1249eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne} 1259eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne 1269eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne 1279eabebafc165a67812eacc184806e7bf34c5f0a5Peter CollingbourneRedeclarableTemplateDecl *RedeclarableTemplateDecl::getCanonicalDeclImpl() { 1289eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne RedeclarableTemplateDecl *Tmpl = this; 1299eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne while (Tmpl->getPreviousDeclaration()) 1309eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne Tmpl = Tmpl->getPreviousDeclaration(); 1319eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne return Tmpl; 1329eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne} 1339eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne 1348a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbournevoid RedeclarableTemplateDecl::setPreviousDeclarationImpl( 1358a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne RedeclarableTemplateDecl *Prev) { 1368a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne if (Prev) { 1378a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne CommonBase *Common = Prev->getCommonPtr(); 1388a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne Prev = Common->Latest; 1398a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne Common->Latest = this; 1408a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne CommonOrPrev = Prev; 1418a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne } else { 1428a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne assert(CommonOrPrev.is<CommonBase*>() && "Cannot reset TemplateDecl Prev"); 1438a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne } 1448a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne} 1458a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne 146f88718ea0ca0d64b7fd31d109f1d9ec769a9c45fPeter CollingbourneRedeclarableTemplateDecl *RedeclarableTemplateDecl::getNextRedeclaration() { 147f88718ea0ca0d64b7fd31d109f1d9ec769a9c45fPeter Collingbourne if (CommonOrPrev.is<RedeclarableTemplateDecl*>()) 148f88718ea0ca0d64b7fd31d109f1d9ec769a9c45fPeter Collingbourne return CommonOrPrev.get<RedeclarableTemplateDecl*>(); 149f88718ea0ca0d64b7fd31d109f1d9ec769a9c45fPeter Collingbourne CommonBase *Common = CommonOrPrev.get<CommonBase*>(); 150f88718ea0ca0d64b7fd31d109f1d9ec769a9c45fPeter Collingbourne return Common ? Common->Latest : this; 151f88718ea0ca0d64b7fd31d109f1d9ec769a9c45fPeter Collingbourne} 152f88718ea0ca0d64b7fd31d109f1d9ec769a9c45fPeter Collingbourne 1534048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbournetemplate <class EntryType> 1544048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbournetypename RedeclarableTemplateDecl::SpecEntryTraits<EntryType>::DeclType* 1554048590d5774fd4b08661b5cf59b6f90b62f283aPeter CollingbourneRedeclarableTemplateDecl::findSpecializationImpl( 1564048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne llvm::FoldingSet<EntryType> &Specs, 1574048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne const TemplateArgument *Args, unsigned NumArgs, 1584048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne void *&InsertPos) { 1594048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne typedef SpecEntryTraits<EntryType> SETraits; 1604048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne llvm::FoldingSetNodeID ID; 1614048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne EntryType::Profile(ID,Args,NumArgs, getASTContext()); 1624048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne EntryType *Entry = Specs.FindNodeOrInsertPos(ID, InsertPos); 1634048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne return Entry ? SETraits::getMostRecentDeclaration(Entry) : 0; 1644048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne} 1654048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne 166c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor/// \brief Generate the injected template arguments for the given template 167c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor/// parameter list, e.g., for the injected-class-name of a class template. 168c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregorstatic void GenerateInjectedTemplateArgs(ASTContext &Context, 169c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor TemplateParameterList *Params, 170c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor TemplateArgument *Args) { 171c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor for (TemplateParameterList::iterator Param = Params->begin(), 172c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor ParamEnd = Params->end(); 173c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor Param != ParamEnd; ++Param) { 174c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor TemplateArgument Arg; 175c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(*Param)) { 176c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor QualType ArgType = Context.getTypeDeclType(TTP); 177c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor if (TTP->isParameterPack()) 178c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor ArgType = Context.getPackExpansionType(ArgType, 179c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor llvm::Optional<unsigned>()); 180c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor 181c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor Arg = TemplateArgument(ArgType); 182c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor } else if (NonTypeTemplateParmDecl *NTTP = 183c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor dyn_cast<NonTypeTemplateParmDecl>(*Param)) { 184c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor Expr *E = new (Context) DeclRefExpr(NTTP, 185c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor NTTP->getType().getNonLValueExprType(Context), 186c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor Expr::getValueKindForType(NTTP->getType()), 187c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor NTTP->getLocation()); 188c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor 189c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor if (NTTP->isParameterPack()) 190c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor E = new (Context) PackExpansionExpr(Context.DependentTy, E, 191c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor NTTP->getLocation(), 192c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor llvm::Optional<unsigned>()); 193c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor Arg = TemplateArgument(E); 194c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor } else { 195c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor TemplateTemplateParmDecl *TTP = cast<TemplateTemplateParmDecl>(*Param); 196c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor if (TTP->isParameterPack()) 197c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor Arg = TemplateArgument(TemplateName(TTP), llvm::Optional<unsigned>()); 198c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor else 199c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor Arg = TemplateArgument(TemplateName(TTP)); 200c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor } 201c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor 202c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor if ((*Param)->isTemplateParameterPack()) 203c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor Arg = TemplateArgument::CreatePackCopy(Context, &Arg, 1); 204c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor 205c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor *Args++ = Arg; 206c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor } 207c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor} 208c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor 2099eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne//===----------------------------------------------------------------------===// 210aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// FunctionTemplateDecl Implementation 211aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 212aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 2130054531488928a424666ac11fcdc6bcc5112de52Douglas Gregorvoid FunctionTemplateDecl::DeallocateCommon(void *Ptr) { 2140054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor static_cast<Common *>(Ptr)->~Common(); 2150054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor} 2160054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor 217aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorFunctionTemplateDecl *FunctionTemplateDecl::Create(ASTContext &C, 218aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor DeclContext *DC, 219aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor SourceLocation L, 220aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor DeclarationName Name, 221127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor TemplateParameterList *Params, 222aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor NamedDecl *Decl) { 223787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor AdoptTemplateParameterList(Params, cast<DeclContext>(Decl)); 224aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor return new (C) FunctionTemplateDecl(DC, L, Name, Params, Decl); 225aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor} 226aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 2279a299e0575ce235f491014627c7267e2d2cd73deDouglas GregorFunctionTemplateDecl *FunctionTemplateDecl::Create(ASTContext &C, EmptyShell) { 2289a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor return new (C) FunctionTemplateDecl(0, SourceLocation(), DeclarationName(), 2299a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor 0, 0); 2309a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor} 2319a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor 2326b5415196327fa8ef00f028ba175fafef1738ae1Argyrios KyrtzidisRedeclarableTemplateDecl::CommonBase * 2336b5415196327fa8ef00f028ba175fafef1738ae1Argyrios KyrtzidisFunctionTemplateDecl::newCommon(ASTContext &C) { 2346b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis Common *CommonPtr = new (C) Common; 2356b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis C.AddDeallocation(DeallocateCommon, CommonPtr); 2369eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne return CommonPtr; 2379eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne} 2389eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne 2392c853e401ca406d417eb916e867226050e7be06bArgyrios KyrtzidisFunctionDecl * 2402c853e401ca406d417eb916e867226050e7be06bArgyrios KyrtzidisFunctionTemplateDecl::findSpecialization(const TemplateArgument *Args, 2412c853e401ca406d417eb916e867226050e7be06bArgyrios Kyrtzidis unsigned NumArgs, void *&InsertPos) { 2424048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne return findSpecializationImpl(getSpecializations(), Args, NumArgs, InsertPos); 2432c853e401ca406d417eb916e867226050e7be06bArgyrios Kyrtzidis} 2442c853e401ca406d417eb916e867226050e7be06bArgyrios Kyrtzidis 245c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregorstd::pair<const TemplateArgument *, unsigned> 246c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas GregorFunctionTemplateDecl::getInjectedTemplateArgs() { 247c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor TemplateParameterList *Params = getTemplateParameters(); 248c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor Common *CommonPtr = getCommonPtr(); 249c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor if (!CommonPtr->InjectedArgs) { 250c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor CommonPtr->InjectedArgs 251c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor = new (getASTContext()) TemplateArgument [Params->size()]; 252c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor GenerateInjectedTemplateArgs(getASTContext(), Params, 253c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor CommonPtr->InjectedArgs); 254c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor } 255c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor 256c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor return std::make_pair(CommonPtr->InjectedArgs, Params->size()); 257c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor} 258c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor 259aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 260aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// ClassTemplateDecl Implementation 261aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 262aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 2630054531488928a424666ac11fcdc6bcc5112de52Douglas Gregorvoid ClassTemplateDecl::DeallocateCommon(void *Ptr) { 2640054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor static_cast<Common *>(Ptr)->~Common(); 2650054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor} 2660054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor 2678731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios KyrtzidisClassTemplateDecl *ClassTemplateDecl::Create(ASTContext &C, 2688731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis DeclContext *DC, 2698731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis SourceLocation L, 2708731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis DeclarationName Name, 2718731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis TemplateParameterList *Params, 2728731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis NamedDecl *Decl, 2738731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis ClassTemplateDecl *PrevDecl) { 274787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor AdoptTemplateParameterList(Params, cast<DeclContext>(Decl)); 2758731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis ClassTemplateDecl *New = new (C) ClassTemplateDecl(DC, L, Name, Params, Decl); 2765bf1bdc2fedb0c29b5fcdb4abc852aa85b4fe26aArgyrios Kyrtzidis New->setPreviousDeclaration(PrevDecl); 2778731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis return New; 2785953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor} 2795953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor 2809a299e0575ce235f491014627c7267e2d2cd73deDouglas GregorClassTemplateDecl *ClassTemplateDecl::Create(ASTContext &C, EmptyShell Empty) { 2819a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor return new (C) ClassTemplateDecl(Empty); 2829a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor} 2839a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor 284c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregorvoid ClassTemplateDecl::LoadLazySpecializations() { 285c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor Common *CommonPtr = getCommonPtr(); 286c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor if (CommonPtr->LazySpecializations) { 287c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor ASTContext &Context = getASTContext(); 288c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor uint32_t *Specs = CommonPtr->LazySpecializations; 289c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor CommonPtr->LazySpecializations = 0; 290c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor for (uint32_t I = 0, N = *Specs++; I != N; ++I) 291c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor (void)Context.getExternalSource()->GetExternalDecl(Specs[I]); 292c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor } 293c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor} 294c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor 295c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregorllvm::FoldingSet<ClassTemplateSpecializationDecl> & 296c8e5cf8f725e111965debb7130ef7466c0c73884Douglas GregorClassTemplateDecl::getSpecializations() { 297c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor LoadLazySpecializations(); 298c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor return getCommonPtr()->Specializations; 299c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor} 300c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor 301c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregorllvm::FoldingSet<ClassTemplatePartialSpecializationDecl> & 302c8e5cf8f725e111965debb7130ef7466c0c73884Douglas GregorClassTemplateDecl::getPartialSpecializations() { 303c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor LoadLazySpecializations(); 304c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor return getCommonPtr()->PartialSpecializations; 305c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor} 306c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor 3076b5415196327fa8ef00f028ba175fafef1738ae1Argyrios KyrtzidisRedeclarableTemplateDecl::CommonBase * 3086b5415196327fa8ef00f028ba175fafef1738ae1Argyrios KyrtzidisClassTemplateDecl::newCommon(ASTContext &C) { 3096b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis Common *CommonPtr = new (C) Common; 3106b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis C.AddDeallocation(DeallocateCommon, CommonPtr); 3119eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne return CommonPtr; 3129eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne} 3139eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne 314cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplateSpecializationDecl * 315cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplateDecl::findSpecialization(const TemplateArgument *Args, 316cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis unsigned NumArgs, void *&InsertPos) { 3174048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne return findSpecializationImpl(getSpecializations(), Args, NumArgs, InsertPos); 318cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis} 319cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis 320bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidisvoid ClassTemplateDecl::AddSpecialization(ClassTemplateSpecializationDecl *D, 321bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis void *InsertPos) { 322bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis getSpecializations().InsertNode(D, InsertPos); 323bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis if (ASTMutationListener *L = getASTMutationListener()) 324bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis L->AddedCXXTemplateSpecialization(this, D); 325bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis} 326bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis 327cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplatePartialSpecializationDecl * 328cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplateDecl::findPartialSpecialization(const TemplateArgument *Args, 329cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis unsigned NumArgs, 330cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis void *&InsertPos) { 3314048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne return findSpecializationImpl(getPartialSpecializations(), Args, NumArgs, 3324048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne InsertPos); 333cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis} 334cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis 335bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidisvoid ClassTemplateDecl::AddPartialSpecialization( 336bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis ClassTemplatePartialSpecializationDecl *D, 337bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis void *InsertPos) { 338bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis getPartialSpecializations().InsertNode(D, InsertPos); 339bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis if (ASTMutationListener *L = getASTMutationListener()) 340bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis L->AddedCXXTemplateSpecialization(this, D); 341bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis} 342bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis 343dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregorvoid ClassTemplateDecl::getPartialSpecializations( 344dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor llvm::SmallVectorImpl<ClassTemplatePartialSpecializationDecl *> &PS) { 345dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor llvm::FoldingSet<ClassTemplatePartialSpecializationDecl> &PartialSpecs 3465bf1bdc2fedb0c29b5fcdb4abc852aa85b4fe26aArgyrios Kyrtzidis = getPartialSpecializations(); 347dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor PS.clear(); 348dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor PS.resize(PartialSpecs.size()); 349dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor for (llvm::FoldingSet<ClassTemplatePartialSpecializationDecl>::iterator 350dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor P = PartialSpecs.begin(), PEnd = PartialSpecs.end(); 351dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor P != PEnd; ++P) { 352dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor assert(!PS[P->getSequenceNumber()]); 353cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis PS[P->getSequenceNumber()] = P->getMostRecentDeclaration(); 354dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor } 355dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor} 356dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor 357b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas GregorClassTemplatePartialSpecializationDecl * 358b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas GregorClassTemplateDecl::findPartialSpecialization(QualType T) { 359b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor ASTContext &Context = getASTContext(); 360b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor typedef llvm::FoldingSet<ClassTemplatePartialSpecializationDecl>::iterator 361b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor partial_spec_iterator; 362b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor for (partial_spec_iterator P = getPartialSpecializations().begin(), 363b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor PEnd = getPartialSpecializations().end(); 364b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor P != PEnd; ++P) { 36531f17ecbef57b5679c017c375db330546b7b5145John McCall if (Context.hasSameType(P->getInjectedSpecializationType(), T)) 366cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis return P->getMostRecentDeclaration(); 367cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis } 368cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis 369cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis return 0; 370cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis} 371cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis 372cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplatePartialSpecializationDecl * 373cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplateDecl::findPartialSpecInstantiatedFromMember( 374cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis ClassTemplatePartialSpecializationDecl *D) { 375cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis Decl *DCanon = D->getCanonicalDecl(); 376cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis for (llvm::FoldingSet<ClassTemplatePartialSpecializationDecl>::iterator 377cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis P = getPartialSpecializations().begin(), 378cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis PEnd = getPartialSpecializations().end(); 379cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis P != PEnd; ++P) { 380cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis if (P->getInstantiatedFromMember()->getCanonicalDecl() == DCanon) 381cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis return P->getMostRecentDeclaration(); 382b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor } 3831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 384b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor return 0; 385b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor} 386b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor 3873cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCallQualType 38824bae92f08ae098cc50a602d8cf1273b423e14daDouglas GregorClassTemplateDecl::getInjectedClassNameSpecialization() { 3895bf1bdc2fedb0c29b5fcdb4abc852aa85b4fe26aArgyrios Kyrtzidis Common *CommonPtr = getCommonPtr(); 3907da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor if (!CommonPtr->InjectedClassNameType.isNull()) 3917da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor return CommonPtr->InjectedClassNameType; 3927da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor 393b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor // C++0x [temp.dep.type]p2: 394b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor // The template argument list of a primary template is a template argument 395b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor // list in which the nth template argument has the value of the nth template 396b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor // parameter of the class template. If the nth template parameter is a 397b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor // template parameter pack (14.5.3), the nth template argument is a pack 398b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor // expansion (14.5.3) whose pattern is the name of the template parameter 399b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor // pack. 40024bae92f08ae098cc50a602d8cf1273b423e14daDouglas Gregor ASTContext &Context = getASTContext(); 4017da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor TemplateParameterList *Params = getTemplateParameters(); 4027da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor llvm::SmallVector<TemplateArgument, 16> TemplateArgs; 403c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor TemplateArgs.resize(Params->size()); 404c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor GenerateInjectedTemplateArgs(getASTContext(), Params, TemplateArgs.data()); 4057da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor CommonPtr->InjectedClassNameType 4061275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor = Context.getTemplateSpecializationType(TemplateName(this), 4077da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor &TemplateArgs[0], 4081275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor TemplateArgs.size()); 4097da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor return CommonPtr->InjectedClassNameType; 4107da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor} 4117da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor 412aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 413aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// TemplateTypeParm Allocation/Deallocation Method Implementations 414aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 415aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 416aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorTemplateTypeParmDecl * 4174ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadTemplateTypeParmDecl::Create(const ASTContext &C, DeclContext *DC, 418344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara SourceLocation KeyLoc, SourceLocation NameLoc, 419344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara unsigned D, unsigned P, IdentifierInfo *Id, 420344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara bool Typename, bool ParameterPack) { 421efed5c832de630715dd42211dd3b2aab5dd97a1bDouglas Gregor QualType Type = C.getTemplateTypeParmType(D, P, ParameterPack, Id); 422344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara return new (C) TemplateTypeParmDecl(DC, KeyLoc, NameLoc, Id, Typename, 423344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara Type, ParameterPack); 424aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor} 425aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 426b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios KyrtzidisTemplateTypeParmDecl * 4274ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadTemplateTypeParmDecl::Create(const ASTContext &C, EmptyShell Empty) { 428344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara return new (C) TemplateTypeParmDecl(0, SourceLocation(), SourceLocation(), 429344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara 0, false, QualType(), false); 430b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios Kyrtzidis} 431b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios Kyrtzidis 432833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallSourceLocation TemplateTypeParmDecl::getDefaultArgumentLoc() const { 43377d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara return hasDefaultArgument() 43477d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara ? DefaultArgument->getTypeLoc().getBeginLoc() 43577d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara : SourceLocation(); 43677d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara} 43777d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara 43877d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo BagnaraSourceRange TemplateTypeParmDecl::getSourceRange() const { 43977d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara if (hasDefaultArgument() && !defaultArgumentWasInherited()) 440344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara return SourceRange(getLocStart(), 44177d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara DefaultArgument->getTypeLoc().getEndLoc()); 44277d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara else 443344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara return TypeDecl::getSourceRange(); 444833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall} 445833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 446ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregorunsigned TemplateTypeParmDecl::getDepth() const { 447ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor return TypeForDecl->getAs<TemplateTypeParmType>()->getDepth(); 448ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor} 449ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor 450ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregorunsigned TemplateTypeParmDecl::getIndex() const { 451ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor return TypeForDecl->getAs<TemplateTypeParmType>()->getIndex(); 452ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor} 453ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor 454aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 455aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// NonTypeTemplateParmDecl Method Implementations 456aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 457aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 4586952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas GregorNonTypeTemplateParmDecl::NonTypeTemplateParmDecl(DeclContext *DC, 4596952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor SourceLocation L, unsigned D, 4606952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor unsigned P, IdentifierInfo *Id, 4616952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor QualType T, 4626952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor TypeSourceInfo *TInfo, 4636952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor const QualType *ExpandedTypes, 4646952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor unsigned NumExpandedTypes, 4656952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor TypeSourceInfo **ExpandedTInfos) 46676a40219ee5624d78aba167dce02bdbaa930955fJohn McCall : DeclaratorDecl(NonTypeTemplateParm, DC, L, Id, T, TInfo), 4676952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor TemplateParmPosition(D, P), DefaultArgumentAndInherited(0, false), 4686952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor ParameterPack(true), ExpandedParameterPack(true), 4696952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor NumExpandedTypes(NumExpandedTypes) 4706952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor{ 4716952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor if (ExpandedTypes && ExpandedTInfos) { 4726952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor void **TypesAndInfos = reinterpret_cast<void **>(this + 1); 4736952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor for (unsigned I = 0; I != NumExpandedTypes; ++I) { 4746952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor TypesAndInfos[2*I] = ExpandedTypes[I].getAsOpaquePtr(); 4756952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor TypesAndInfos[2*I + 1] = ExpandedTInfos[I]; 4766952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor } 4776952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor } 4786952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor} 4796952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor 480aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorNonTypeTemplateParmDecl * 4814ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadNonTypeTemplateParmDecl::Create(const ASTContext &C, DeclContext *DC, 482aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor SourceLocation L, unsigned D, unsigned P, 483aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor IdentifierInfo *Id, QualType T, 48410738d36b150aa65206890c1c845cdba076e4200Douglas Gregor bool ParameterPack, TypeSourceInfo *TInfo) { 48510738d36b150aa65206890c1c845cdba076e4200Douglas Gregor return new (C) NonTypeTemplateParmDecl(DC, L, D, P, Id, T, ParameterPack, 48610738d36b150aa65206890c1c845cdba076e4200Douglas Gregor TInfo); 487aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor} 488aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 4896952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas GregorNonTypeTemplateParmDecl * 4906952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas GregorNonTypeTemplateParmDecl::Create(const ASTContext &C, DeclContext *DC, 4916952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor SourceLocation L, unsigned D, unsigned P, 4926952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor IdentifierInfo *Id, QualType T, 4936952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor TypeSourceInfo *TInfo, 4946952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor const QualType *ExpandedTypes, 4956952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor unsigned NumExpandedTypes, 4966952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor TypeSourceInfo **ExpandedTInfos) { 4976952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor unsigned Size = sizeof(NonTypeTemplateParmDecl) 4986952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor + NumExpandedTypes * 2 * sizeof(void*); 4996952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor void *Mem = C.Allocate(Size); 5006952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor return new (Mem) NonTypeTemplateParmDecl(DC, L, D, P, Id, T, TInfo, 5016952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor ExpandedTypes, NumExpandedTypes, 5026952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor ExpandedTInfos); 5036952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor} 5046952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor 505da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas GregorSourceLocation NonTypeTemplateParmDecl::getInnerLocStart() const { 506da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor SourceLocation Start = getTypeSpecStartLoc(); 507da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor if (Start.isInvalid()) 508da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor Start = getLocation(); 509da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor return Start; 510da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor} 511da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor 51276a40219ee5624d78aba167dce02bdbaa930955fJohn McCallSourceRange NonTypeTemplateParmDecl::getSourceRange() const { 513ee4bfd412db491c489fc2ee74916edd73f9c618aAbramo Bagnara SourceLocation End = getLocation(); 514ee4bfd412db491c489fc2ee74916edd73f9c618aAbramo Bagnara if (hasDefaultArgument() && !defaultArgumentWasInherited()) 515ee4bfd412db491c489fc2ee74916edd73f9c618aAbramo Bagnara End = getDefaultArgument()->getSourceRange().getEnd(); 516ee4bfd412db491c489fc2ee74916edd73f9c618aAbramo Bagnara return SourceRange(getOuterLocStart(), End); 51776a40219ee5624d78aba167dce02bdbaa930955fJohn McCall} 51876a40219ee5624d78aba167dce02bdbaa930955fJohn McCall 519d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas GregorSourceLocation NonTypeTemplateParmDecl::getDefaultArgumentLoc() const { 520d92f7a297c0ed3f7d0ebcbb557e1d4c1925b8c72Abramo Bagnara return hasDefaultArgument() 521d92f7a297c0ed3f7d0ebcbb557e1d4c1925b8c72Abramo Bagnara ? getDefaultArgument()->getSourceRange().getBegin() 522d92f7a297c0ed3f7d0ebcbb557e1d4c1925b8c72Abramo Bagnara : SourceLocation(); 523d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas Gregor} 524d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas Gregor 525aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 526aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// TemplateTemplateParmDecl Method Implementations 527aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 528aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 529aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorTemplateTemplateParmDecl * 5304ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadTemplateTemplateParmDecl::Create(const ASTContext &C, DeclContext *DC, 531aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor SourceLocation L, unsigned D, unsigned P, 53261c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor bool ParameterPack, IdentifierInfo *Id, 533aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor TemplateParameterList *Params) { 53461c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor return new (C) TemplateTemplateParmDecl(DC, L, D, P, ParameterPack, Id, 53561c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor Params); 536aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor} 537aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 5383e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor//===----------------------------------------------------------------------===// 5397e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor// TemplateArgumentList Implementation 5407e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor//===----------------------------------------------------------------------===// 541910f8008fea79120489a53593fe971b0b8a4a740Douglas GregorTemplateArgumentList * 542910f8008fea79120489a53593fe971b0b8a4a740Douglas GregorTemplateArgumentList::CreateCopy(ASTContext &Context, 543910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor const TemplateArgument *Args, 544910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor unsigned NumArgs) { 545910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor std::size_t Size = sizeof(TemplateArgumentList) 546910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor + NumArgs * sizeof(TemplateArgument); 547910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor void *Mem = Context.Allocate(Size); 548910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor TemplateArgument *StoredArgs 549910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor = reinterpret_cast<TemplateArgument *>( 550910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor static_cast<TemplateArgumentList *>(Mem) + 1); 551910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor std::uninitialized_copy(Args, Args + NumArgs, StoredArgs); 552910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor return new (Mem) TemplateArgumentList(StoredArgs, NumArgs, true); 55394d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis} 55494d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis 5557e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor//===----------------------------------------------------------------------===// 5563e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor// ClassTemplateSpecializationDecl Implementation 5573e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor//===----------------------------------------------------------------------===// 5583e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas GregorClassTemplateSpecializationDecl:: 55913c8577201e4fc0ddac5f09d05fd1778832137d1Douglas GregorClassTemplateSpecializationDecl(ASTContext &Context, Kind DK, TagKind TK, 5607e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor DeclContext *DC, SourceLocation L, 5613e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor ClassTemplateDecl *SpecializedTemplate, 562910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor const TemplateArgument *Args, 563910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor unsigned NumArgs, 5648e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor ClassTemplateSpecializationDecl *PrevDecl) 56513c8577201e4fc0ddac5f09d05fd1778832137d1Douglas Gregor : CXXRecordDecl(DK, TK, DC, L, 5668e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor SpecializedTemplate->getIdentifier(), 5678e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor PrevDecl), 5683e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor SpecializedTemplate(SpecializedTemplate), 569c98971d5c994caed9452aeadd0122c855e0f4de1Abramo Bagnara ExplicitInfo(0), 570910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor TemplateArgs(TemplateArgumentList::CreateCopy(Context, Args, NumArgs)), 5717e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor SpecializationKind(TSK_Undeclared) { 5723e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor} 5731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 57494d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios KyrtzidisClassTemplateSpecializationDecl::ClassTemplateSpecializationDecl(Kind DK) 57594d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis : CXXRecordDecl(DK, TTK_Struct, 0, SourceLocation(), 0, 0), 57694d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis ExplicitInfo(0), 57794d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis SpecializationKind(TSK_Undeclared) { 57894d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis} 57994d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis 5803e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas GregorClassTemplateSpecializationDecl * 58113c8577201e4fc0ddac5f09d05fd1778832137d1Douglas GregorClassTemplateSpecializationDecl::Create(ASTContext &Context, TagKind TK, 5823e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor DeclContext *DC, SourceLocation L, 5833e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor ClassTemplateDecl *SpecializedTemplate, 584910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor const TemplateArgument *Args, 585910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor unsigned NumArgs, 586cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor ClassTemplateSpecializationDecl *PrevDecl) { 587cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor ClassTemplateSpecializationDecl *Result 5881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump = new (Context)ClassTemplateSpecializationDecl(Context, 589c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor ClassTemplateSpecialization, 59013c8577201e4fc0ddac5f09d05fd1778832137d1Douglas Gregor TK, DC, L, 5917e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor SpecializedTemplate, 592910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor Args, NumArgs, 5938e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor PrevDecl); 594cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor Context.getTypeDeclType(Result, PrevDecl); 595cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor return Result; 5963e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor} 597c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor 59894d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios KyrtzidisClassTemplateSpecializationDecl * 599b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios KyrtzidisClassTemplateSpecializationDecl::Create(ASTContext &Context, EmptyShell Empty) { 60094d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis return 60194d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis new (Context)ClassTemplateSpecializationDecl(ClassTemplateSpecialization); 60294d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis} 60394d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis 604da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregorvoid 605da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas GregorClassTemplateSpecializationDecl::getNameForDiagnostic(std::string &S, 606da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor const PrintingPolicy &Policy, 607da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor bool Qualified) const { 608da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor NamedDecl::getNameForDiagnostic(S, Policy, Qualified); 609da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor 610da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor const TemplateArgumentList &TemplateArgs = getTemplateArgs(); 611da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor S += TemplateSpecializationType::PrintTemplateArgumentList( 612da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor TemplateArgs.data(), 613da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor TemplateArgs.size(), 614da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor Policy); 615da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor} 616da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor 61737d93e9252026d4fb836d9c05d0122a2d46e56beDouglas GregorClassTemplateDecl * 6181eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpClassTemplateSpecializationDecl::getSpecializedTemplate() const { 6191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (SpecializedPartialSpecialization *PartialSpec 62037d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor = SpecializedTemplate.dyn_cast<SpecializedPartialSpecialization*>()) 62137d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor return PartialSpec->PartialSpecialization->getSpecializedTemplate(); 62237d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor return SpecializedTemplate.get<ClassTemplateDecl*>(); 62337d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor} 62437d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor 6254a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo BagnaraSourceRange 6264a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo BagnaraClassTemplateSpecializationDecl::getSourceRange() const { 6274a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo Bagnara if (!ExplicitInfo) 6284a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo Bagnara return SourceRange(); 6294a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo Bagnara SourceLocation Begin = getExternLoc(); 6304a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo Bagnara if (Begin.isInvalid()) 6314a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo Bagnara Begin = getTemplateKeywordLoc(); 6324a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo Bagnara SourceLocation End = getRBraceLoc(); 6334a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo Bagnara if (End.isInvalid()) 6344a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo Bagnara End = getTypeAsWritten()->getTypeLoc().getEndLoc(); 6354a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo Bagnara return SourceRange(Begin, End); 6364a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo Bagnara} 6374a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo Bagnara 638c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor//===----------------------------------------------------------------------===// 639c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor// ClassTemplatePartialSpecializationDecl Implementation 640c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor//===----------------------------------------------------------------------===// 6419a299e0575ce235f491014627c7267e2d2cd73deDouglas GregorClassTemplatePartialSpecializationDecl:: 6429a299e0575ce235f491014627c7267e2d2cd73deDouglas GregorClassTemplatePartialSpecializationDecl(ASTContext &Context, TagKind TK, 6439a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor DeclContext *DC, SourceLocation L, 6449a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor TemplateParameterList *Params, 6459a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor ClassTemplateDecl *SpecializedTemplate, 6469a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor const TemplateArgument *Args, 6479a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor unsigned NumArgs, 6489a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor TemplateArgumentLoc *ArgInfos, 6499a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor unsigned NumArgInfos, 6509a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor ClassTemplatePartialSpecializationDecl *PrevDecl, 6519a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor unsigned SequenceNumber) 6529a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor : ClassTemplateSpecializationDecl(Context, 6539a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor ClassTemplatePartialSpecialization, 6549a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor TK, DC, L, SpecializedTemplate, 6559a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor Args, NumArgs, PrevDecl), 6569a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor TemplateParams(Params), ArgsAsWritten(ArgInfos), 6579a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor NumArgsAsWritten(NumArgInfos), SequenceNumber(SequenceNumber), 6589a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor InstantiatedFromMember(0, false) 6599a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor{ 660787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor AdoptTemplateParameterList(Params, this); 6619a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor} 6629a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor 663c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas GregorClassTemplatePartialSpecializationDecl * 664c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas GregorClassTemplatePartialSpecializationDecl:: 66513c8577201e4fc0ddac5f09d05fd1778832137d1Douglas GregorCreate(ASTContext &Context, TagKind TK,DeclContext *DC, SourceLocation L, 666c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor TemplateParameterList *Params, 667c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor ClassTemplateDecl *SpecializedTemplate, 668910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor const TemplateArgument *Args, 669910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor unsigned NumArgs, 670d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall const TemplateArgumentListInfo &ArgInfos, 6713cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall QualType CanonInjectedType, 672dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor ClassTemplatePartialSpecializationDecl *PrevDecl, 673dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor unsigned SequenceNumber) { 674d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall unsigned N = ArgInfos.size(); 675833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateArgumentLoc *ClonedArgs = new (Context) TemplateArgumentLoc[N]; 676833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall for (unsigned I = 0; I != N; ++I) 677833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall ClonedArgs[I] = ArgInfos[I]; 678833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 679c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor ClassTemplatePartialSpecializationDecl *Result 68013c8577201e4fc0ddac5f09d05fd1778832137d1Douglas Gregor = new (Context)ClassTemplatePartialSpecializationDecl(Context, TK, 681c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor DC, L, Params, 682c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor SpecializedTemplate, 683910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor Args, NumArgs, 684833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall ClonedArgs, N, 685dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor PrevDecl, 686dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor SequenceNumber); 687c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor Result->setSpecializationKind(TSK_ExplicitSpecialization); 6883cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall 6893cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall Context.getInjectedClassNameType(Result, CanonInjectedType); 690c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor return Result; 691c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor} 692dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall 69394d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios KyrtzidisClassTemplatePartialSpecializationDecl * 694b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios KyrtzidisClassTemplatePartialSpecializationDecl::Create(ASTContext &Context, 695b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios Kyrtzidis EmptyShell Empty) { 69694d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis return new (Context)ClassTemplatePartialSpecializationDecl(); 69794d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis} 69894d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis 699dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall//===----------------------------------------------------------------------===// 700dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall// FriendTemplateDecl Implementation 701dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall//===----------------------------------------------------------------------===// 702dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall 703dd4a3b0065b9a7e7b00073df415a798886c090f3John McCallFriendTemplateDecl *FriendTemplateDecl::Create(ASTContext &Context, 704dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall DeclContext *DC, 705dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall SourceLocation L, 706dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall unsigned NParams, 707dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall TemplateParameterList **Params, 708dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall FriendUnion Friend, 709dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall SourceLocation FLoc) { 710dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall FriendTemplateDecl *Result 711dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall = new (Context) FriendTemplateDecl(DC, L, NParams, Params, Friend, FLoc); 712dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall return Result; 713dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall} 714554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis 715554e6aa2da082575514607c3639c246c04b3232aArgyrios KyrtzidisFriendTemplateDecl *FriendTemplateDecl::Create(ASTContext &Context, 716554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis EmptyShell Empty) { 717554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis return new (Context) FriendTemplateDecl(Empty); 718554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis} 719