DeclTemplate.cpp revision 0054531488928a424666ac11fcdc6bcc5112de52
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" 17aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor#include "clang/AST/ASTContext.h" 18833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall#include "clang/AST/TypeLoc.h" 19aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor#include "clang/Basic/IdentifierTable.h" 20aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor#include "llvm/ADT/STLExtras.h" 21aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregorusing namespace clang; 22aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 23aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 24aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// TemplateParameterList Implementation 25aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 26aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 27ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas GregorTemplateParameterList::TemplateParameterList(SourceLocation TemplateLoc, 28ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas Gregor SourceLocation LAngleLoc, 29bf4ea56cdc376cef5a12abf6bf18dc34805c2226Douglas Gregor NamedDecl **Params, unsigned NumParams, 30ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas Gregor SourceLocation RAngleLoc) 31ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas Gregor : TemplateLoc(TemplateLoc), LAngleLoc(LAngleLoc), RAngleLoc(RAngleLoc), 32ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas Gregor NumParams(NumParams) { 33aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor for (unsigned Idx = 0; Idx < NumParams; ++Idx) 34aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor begin()[Idx] = Params[Idx]; 35aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor} 36aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 37aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorTemplateParameterList * 38ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas GregorTemplateParameterList::Create(ASTContext &C, SourceLocation TemplateLoc, 39bf4ea56cdc376cef5a12abf6bf18dc34805c2226Douglas Gregor SourceLocation LAngleLoc, NamedDecl **Params, 40ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas Gregor unsigned NumParams, SourceLocation RAngleLoc) { 41bf4ea56cdc376cef5a12abf6bf18dc34805c2226Douglas Gregor unsigned Size = sizeof(TemplateParameterList) 42bf4ea56cdc376cef5a12abf6bf18dc34805c2226Douglas Gregor + sizeof(NamedDecl *) * NumParams; 43aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor unsigned Align = llvm::AlignOf<TemplateParameterList>::Alignment; 44aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor void *Mem = C.Allocate(Size, Align); 451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return new (Mem) TemplateParameterList(TemplateLoc, LAngleLoc, Params, 46ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas Gregor NumParams, RAngleLoc); 47aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor} 48aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 4962cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregorunsigned TemplateParameterList::getMinRequiredArguments() const { 5062cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor unsigned NumRequiredArgs = size(); 511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump iterator Param = const_cast<TemplateParameterList *>(this)->end(), 5262cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor ParamBegin = const_cast<TemplateParameterList *>(this)->begin(); 5362cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor while (Param != ParamBegin) { 5462cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor --Param; 551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 560ceffb51b28b09db67404058c642dcb1f877f6e8Anders Carlsson if (!(*Param)->isTemplateParameterPack() && 571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump !(isa<TemplateTypeParmDecl>(*Param) && 5862cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor cast<TemplateTypeParmDecl>(*Param)->hasDefaultArgument()) && 5962cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor !(isa<NonTypeTemplateParmDecl>(*Param) && 6062cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor cast<NonTypeTemplateParmDecl>(*Param)->hasDefaultArgument()) && 6162cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor !(isa<TemplateTemplateParmDecl>(*Param) && 6262cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor cast<TemplateTemplateParmDecl>(*Param)->hasDefaultArgument())) 6362cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor break; 641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6562cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor --NumRequiredArgs; 6662cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor } 6762cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor 6862cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor return NumRequiredArgs; 6962cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor} 7062cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor 71ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregorunsigned TemplateParameterList::getDepth() const { 72ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor if (size() == 0) 73ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor return 0; 74ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor 75ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor const NamedDecl *FirstParm = getParam(0); 76ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor if (const TemplateTypeParmDecl *TTP 77ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor = dyn_cast<TemplateTypeParmDecl>(FirstParm)) 78ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor return TTP->getDepth(); 79ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor else if (const NonTypeTemplateParmDecl *NTTP 80ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor = dyn_cast<NonTypeTemplateParmDecl>(FirstParm)) 81ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor return NTTP->getDepth(); 82ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor else 83ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor return cast<TemplateTemplateParmDecl>(FirstParm)->getDepth(); 84ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor} 85ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor 86aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 87aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// TemplateDecl Implementation 88aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 89aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 90aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorTemplateDecl::~TemplateDecl() { 91aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor} 92aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 93aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 94aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// FunctionTemplateDecl Implementation 95aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 96aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 970054531488928a424666ac11fcdc6bcc5112de52Douglas Gregorvoid FunctionTemplateDecl::DeallocateCommon(void *Ptr) { 980054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor static_cast<Common *>(Ptr)->~Common(); 990054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor} 1000054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor 101aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorFunctionTemplateDecl *FunctionTemplateDecl::Create(ASTContext &C, 102aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor DeclContext *DC, 103aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor SourceLocation L, 104aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor DeclarationName Name, 105127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor TemplateParameterList *Params, 106aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor NamedDecl *Decl) { 107aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor return new (C) FunctionTemplateDecl(DC, L, Name, Params, Decl); 108aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor} 109aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 110127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregorvoid FunctionTemplateDecl::Destroy(ASTContext &C) { 111127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor if (Common *CommonPtr = CommonOrPrev.dyn_cast<Common*>()) { 112127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor for (llvm::FoldingSet<FunctionTemplateSpecializationInfo>::iterator 113127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor Spec = CommonPtr->Specializations.begin(), 114127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor SpecEnd = CommonPtr->Specializations.end(); 115127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor Spec != SpecEnd; ++Spec) 116127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor C.Deallocate(&*Spec); 117127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor } 1181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 119127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor Decl::Destroy(C); 120127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor} 121127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor 122b57a4fe73b8227c0dba651818b8495dfca61e530Argyrios KyrtzidisFunctionTemplateDecl *FunctionTemplateDecl::getCanonicalDecl() { 123b57a4fe73b8227c0dba651818b8495dfca61e530Argyrios Kyrtzidis FunctionTemplateDecl *FunTmpl = this; 124b57a4fe73b8227c0dba651818b8495dfca61e530Argyrios Kyrtzidis while (FunTmpl->getPreviousDeclaration()) 125b57a4fe73b8227c0dba651818b8495dfca61e530Argyrios Kyrtzidis FunTmpl = FunTmpl->getPreviousDeclaration(); 126b57a4fe73b8227c0dba651818b8495dfca61e530Argyrios Kyrtzidis return FunTmpl; 127b57a4fe73b8227c0dba651818b8495dfca61e530Argyrios Kyrtzidis} 128b57a4fe73b8227c0dba651818b8495dfca61e530Argyrios Kyrtzidis 129127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas GregorFunctionTemplateDecl::Common *FunctionTemplateDecl::getCommonPtr() { 130127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor // Find the first declaration of this function template. 131127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor FunctionTemplateDecl *First = this; 132127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor while (First->getPreviousDeclaration()) 133127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor First = First->getPreviousDeclaration(); 1341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 135127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor if (First->CommonOrPrev.isNull()) { 1360054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor Common *CommonPtr = new (getASTContext()) Common; 1370054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor getASTContext().AddDeallocation(DeallocateCommon, CommonPtr); 1380054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor First->CommonOrPrev = CommonPtr; 139127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor } 140127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor return First->CommonOrPrev.get<Common*>(); 141127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor} 142127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor 143aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 144aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// ClassTemplateDecl Implementation 145aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 146aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 1470054531488928a424666ac11fcdc6bcc5112de52Douglas Gregorvoid ClassTemplateDecl::DeallocateCommon(void *Ptr) { 1480054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor static_cast<Common *>(Ptr)->~Common(); 1490054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor} 1500054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor 151b57a4fe73b8227c0dba651818b8495dfca61e530Argyrios KyrtzidisClassTemplateDecl *ClassTemplateDecl::getCanonicalDecl() { 152b57a4fe73b8227c0dba651818b8495dfca61e530Argyrios Kyrtzidis ClassTemplateDecl *Template = this; 153b57a4fe73b8227c0dba651818b8495dfca61e530Argyrios Kyrtzidis while (Template->getPreviousDeclaration()) 154b57a4fe73b8227c0dba651818b8495dfca61e530Argyrios Kyrtzidis Template = Template->getPreviousDeclaration(); 155b57a4fe73b8227c0dba651818b8495dfca61e530Argyrios Kyrtzidis return Template; 156b57a4fe73b8227c0dba651818b8495dfca61e530Argyrios Kyrtzidis} 157b57a4fe73b8227c0dba651818b8495dfca61e530Argyrios Kyrtzidis 158aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorClassTemplateDecl *ClassTemplateDecl::Create(ASTContext &C, 159aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor DeclContext *DC, 160aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor SourceLocation L, 161aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor DeclarationName Name, 162aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor TemplateParameterList *Params, 1635953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor NamedDecl *Decl, 1645953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor ClassTemplateDecl *PrevDecl) { 1655953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor Common *CommonPtr; 1665953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor if (PrevDecl) 1675953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor CommonPtr = PrevDecl->CommonPtr; 1680054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor else { 1695953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor CommonPtr = new (C) Common; 1700054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor C.AddDeallocation(DeallocateCommon, CommonPtr); 1710054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor } 1725953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor 1731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return new (C) ClassTemplateDecl(DC, L, Name, Params, Decl, PrevDecl, 1745953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor CommonPtr); 1755953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor} 1765953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor 1775953d8b37f92f0cf548941f617c9b0a7703df33bDouglas GregorClassTemplateDecl::~ClassTemplateDecl() { 1785953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor assert(CommonPtr == 0 && "ClassTemplateDecl must be explicitly destroyed"); 1795953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor} 1805953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor 1815953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregorvoid ClassTemplateDecl::Destroy(ASTContext& C) { 1825953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor if (!PreviousDeclaration) { 1835953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor CommonPtr->~Common(); 1845953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor C.Deallocate((void*)CommonPtr); 1855953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor } 1865953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor CommonPtr = 0; 1875953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor 1885953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor this->~ClassTemplateDecl(); 1895953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor C.Deallocate((void*)this); 190aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor} 191aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 192dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregorvoid ClassTemplateDecl::getPartialSpecializations( 193dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor llvm::SmallVectorImpl<ClassTemplatePartialSpecializationDecl *> &PS) { 194dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor llvm::FoldingSet<ClassTemplatePartialSpecializationDecl> &PartialSpecs 195dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor = CommonPtr->PartialSpecializations; 196dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor PS.clear(); 197dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor PS.resize(PartialSpecs.size()); 198dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor for (llvm::FoldingSet<ClassTemplatePartialSpecializationDecl>::iterator 199dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor P = PartialSpecs.begin(), PEnd = PartialSpecs.end(); 200dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor P != PEnd; ++P) { 201dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor assert(!PS[P->getSequenceNumber()]); 202dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor PS[P->getSequenceNumber()] = &*P; 203dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor } 204dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor} 205dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor 206b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas GregorClassTemplatePartialSpecializationDecl * 207b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas GregorClassTemplateDecl::findPartialSpecialization(QualType T) { 208b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor ASTContext &Context = getASTContext(); 209b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor typedef llvm::FoldingSet<ClassTemplatePartialSpecializationDecl>::iterator 210b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor partial_spec_iterator; 211b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor for (partial_spec_iterator P = getPartialSpecializations().begin(), 212b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor PEnd = getPartialSpecializations().end(); 213b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor P != PEnd; ++P) { 21431f17ecbef57b5679c017c375db330546b7b5145John McCall if (Context.hasSameType(P->getInjectedSpecializationType(), T)) 215b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor return &*P; 216b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor } 2171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 218b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor return 0; 219b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor} 220b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor 2213cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCallQualType 2223cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCallClassTemplateDecl::getInjectedClassNameSpecialization(ASTContext &Context) { 2237da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor if (!CommonPtr->InjectedClassNameType.isNull()) 2247da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor return CommonPtr->InjectedClassNameType; 2257da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor 2267da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor // FIXME: n2800 14.6.1p1 should say how the template arguments 2277da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor // corresponding to template parameter packs should be pack 2287da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor // expansions. We already say that in 14.6.2.1p2, so it would be 2297da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor // better to fix that redundancy. 2307da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor 2317da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor TemplateParameterList *Params = getTemplateParameters(); 2327da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor llvm::SmallVector<TemplateArgument, 16> TemplateArgs; 2337da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor TemplateArgs.reserve(Params->size()); 2341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump for (TemplateParameterList::iterator Param = Params->begin(), 2351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump ParamEnd = Params->end(); 2367da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor Param != ParamEnd; ++Param) { 2377da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor if (isa<TemplateTypeParmDecl>(*Param)) { 2387da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor QualType ParamType = Context.getTypeDeclType(cast<TypeDecl>(*Param)); 239833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateArgs.push_back(TemplateArgument(ParamType)); 2401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } else if (NonTypeTemplateParmDecl *NTTP = 2417da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor dyn_cast<NonTypeTemplateParmDecl>(*Param)) { 242b7de181d912690958e82c01f1b3d752d3d4ab43bChandler Carruth Expr *E = new (Context) DeclRefExpr(NTTP, 243b7de181d912690958e82c01f1b3d752d3d4ab43bChandler Carruth NTTP->getType().getNonReferenceType(), 2440da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor NTTP->getLocation()); 2457da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor TemplateArgs.push_back(TemplateArgument(E)); 2461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } else { 2477da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor TemplateTemplateParmDecl *TTP = cast<TemplateTemplateParmDecl>(*Param); 248788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor TemplateArgs.push_back(TemplateArgument(TemplateName(TTP))); 2497da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor } 2507da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor } 2517da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor 2527da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor CommonPtr->InjectedClassNameType 2531275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor = Context.getTemplateSpecializationType(TemplateName(this), 2547da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor &TemplateArgs[0], 2551275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor TemplateArgs.size()); 2567da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor return CommonPtr->InjectedClassNameType; 2577da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor} 2587da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor 259aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 260aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// TemplateTypeParm Allocation/Deallocation Method Implementations 261aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 262aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 263aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorTemplateTypeParmDecl * 264aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorTemplateTypeParmDecl::Create(ASTContext &C, DeclContext *DC, 265aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor SourceLocation L, unsigned D, unsigned P, 2666d845ae1baf77691bca080e0762a1d45ee017f70Anders Carlsson IdentifierInfo *Id, bool Typename, 2676d845ae1baf77691bca080e0762a1d45ee017f70Anders Carlsson bool ParameterPack) { 26876e4ce42a30cee4dc40ce7c6014874fbc4f9baa7Anders Carlsson QualType Type = C.getTemplateTypeParmType(D, P, ParameterPack, Id); 2696d845ae1baf77691bca080e0762a1d45ee017f70Anders Carlsson return new (C) TemplateTypeParmDecl(DC, L, Id, Typename, Type, ParameterPack); 270aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor} 271aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 272833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallSourceLocation TemplateTypeParmDecl::getDefaultArgumentLoc() const { 273bd054dba8a3023821f2a0951b0fae05e3522a7c9Abramo Bagnara return DefaultArgument->getTypeLoc().getSourceRange().getBegin(); 274833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall} 275833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 276ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregorunsigned TemplateTypeParmDecl::getDepth() const { 277ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor return TypeForDecl->getAs<TemplateTypeParmType>()->getDepth(); 278ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor} 279ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor 280ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregorunsigned TemplateTypeParmDecl::getIndex() const { 281ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor return TypeForDecl->getAs<TemplateTypeParmType>()->getIndex(); 282ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor} 283ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor 284aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 285aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// NonTypeTemplateParmDecl Method Implementations 286aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 287aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 288aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorNonTypeTemplateParmDecl * 289aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorNonTypeTemplateParmDecl::Create(ASTContext &C, DeclContext *DC, 290aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor SourceLocation L, unsigned D, unsigned P, 291aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor IdentifierInfo *Id, QualType T, 292a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall TypeSourceInfo *TInfo) { 293a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall return new (C) NonTypeTemplateParmDecl(DC, L, D, P, Id, T, TInfo); 294aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor} 295aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 296d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas GregorSourceLocation NonTypeTemplateParmDecl::getDefaultArgumentLoc() const { 297d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas Gregor return DefaultArgument? DefaultArgument->getSourceRange().getBegin() 2981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump : SourceLocation(); 299d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas Gregor} 300d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas Gregor 301aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 302aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// TemplateTemplateParmDecl Method Implementations 303aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 304aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 305aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorTemplateTemplateParmDecl * 306aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorTemplateTemplateParmDecl::Create(ASTContext &C, DeclContext *DC, 307aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor SourceLocation L, unsigned D, unsigned P, 308aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor IdentifierInfo *Id, 309aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor TemplateParameterList *Params) { 310aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor return new (C) TemplateTemplateParmDecl(DC, L, D, P, Id, Params); 311aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor} 312aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 3133e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor//===----------------------------------------------------------------------===// 3149ba41645892da0000fe8a7832b80208f44dafedaAnders Carlsson// TemplateArgumentListBuilder Implementation 3159ba41645892da0000fe8a7832b80208f44dafedaAnders Carlsson//===----------------------------------------------------------------------===// 316fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson 31798d279ba8092186f606abaa8298f13a0816b9cf2Chris Lattnervoid TemplateArgumentListBuilder::Append(const TemplateArgument &Arg) { 31898d279ba8092186f606abaa8298f13a0816b9cf2Chris Lattner assert((Arg.getKind() != TemplateArgument::Type || 31998d279ba8092186f606abaa8298f13a0816b9cf2Chris Lattner Arg.getAsType().isCanonical()) && "Type must be canonical!"); 32098d279ba8092186f606abaa8298f13a0816b9cf2Chris Lattner assert(FlatArgs.size() < MaxFlatArgs && "Argument list builder is full!"); 3211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump assert(!StructuredArgs && 322fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson "Can't append arguments when an argument pack has been added!"); 3231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 32498d279ba8092186f606abaa8298f13a0816b9cf2Chris Lattner FlatArgs.push_back(Arg); 3259ba41645892da0000fe8a7832b80208f44dafedaAnders Carlsson} 3269ba41645892da0000fe8a7832b80208f44dafedaAnders Carlsson 327fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlssonvoid TemplateArgumentListBuilder::BeginPack() { 328fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson assert(!AddingToPack && "Already adding to pack!"); 329fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson assert(!StructuredArgs && "Argument list already contains a pack!"); 3301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 331fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson AddingToPack = true; 33298d279ba8092186f606abaa8298f13a0816b9cf2Chris Lattner PackBeginIndex = FlatArgs.size(); 33367e332009c6e349dc34700f539747afcff990336Anders Carlsson} 33467e332009c6e349dc34700f539747afcff990336Anders Carlsson 335fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlssonvoid TemplateArgumentListBuilder::EndPack() { 336fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson assert(AddingToPack && "Not adding to pack!"); 337fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson assert(!StructuredArgs && "Argument list already contains a pack!"); 3381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 339fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson AddingToPack = false; 3403b36b66a00b7d5bab71b486a54694f0ae397bddbAnders Carlsson 341304d0faa6cac3111074cc400c1c573a6e611872bChris Lattner // FIXME: This is a memory leak! 342fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson StructuredArgs = new TemplateArgument[MaxStructuredArgs]; 3431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 344fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson // First copy the flat entries over to the list (if any) 345fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson for (unsigned I = 0; I != PackBeginIndex; ++I) { 346fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson NumStructuredArgs++; 347fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson StructuredArgs[I] = FlatArgs[I]; 348fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson } 3491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 350fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson // Next, set the pack. 351fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson TemplateArgument *PackArgs = 0; 352fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson unsigned NumPackArgs = NumFlatArgs - PackBeginIndex; 35398d279ba8092186f606abaa8298f13a0816b9cf2Chris Lattner // FIXME: NumPackArgs shouldn't be negative here??? 354fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson if (NumPackArgs) 35598d279ba8092186f606abaa8298f13a0816b9cf2Chris Lattner PackArgs = FlatArgs.data()+PackBeginIndex; 3561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump StructuredArgs[NumStructuredArgs++].setArgumentPack(PackArgs, NumPackArgs, 358fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson /*CopyArgs=*/false); 359fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson} 360fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson 3619ba41645892da0000fe8a7832b80208f44dafedaAnders Carlsson//===----------------------------------------------------------------------===// 3627e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor// TemplateArgumentList Implementation 3637e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor//===----------------------------------------------------------------------===// 3647e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas GregorTemplateArgumentList::TemplateArgumentList(ASTContext &Context, 365e9c904b082ac3299831704a69066b86ab0f78becAnders Carlsson TemplateArgumentListBuilder &Builder, 366fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson bool TakeArgs) 3671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump : FlatArguments(Builder.getFlatArguments(), TakeArgs), 3681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump NumFlatArguments(Builder.flatSize()), 369fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson StructuredArguments(Builder.getStructuredArguments(), TakeArgs), 370fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson NumStructuredArguments(Builder.structuredSize()) { 3711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 372fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson if (!TakeArgs) 373fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson return; 3741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 37556ef550c5eeea0714c635782776389df2a177584Chris Lattner // If this does take ownership of the arguments, then we have to new them 37656ef550c5eeea0714c635782776389df2a177584Chris Lattner // and copy over. 37756ef550c5eeea0714c635782776389df2a177584Chris Lattner TemplateArgument *NewArgs = new TemplateArgument[Builder.flatSize()]; 37856ef550c5eeea0714c635782776389df2a177584Chris Lattner std::copy(Builder.getFlatArguments(), 37956ef550c5eeea0714c635782776389df2a177584Chris Lattner Builder.getFlatArguments()+Builder.flatSize(), NewArgs); 38056ef550c5eeea0714c635782776389df2a177584Chris Lattner FlatArguments.setPointer(NewArgs); 38156ef550c5eeea0714c635782776389df2a177584Chris Lattner 38256ef550c5eeea0714c635782776389df2a177584Chris Lattner // Just reuse the structured and flat arguments array if possible. 38356ef550c5eeea0714c635782776389df2a177584Chris Lattner if (Builder.getStructuredArguments() == Builder.getFlatArguments()) { 38456ef550c5eeea0714c635782776389df2a177584Chris Lattner StructuredArguments.setPointer(NewArgs); 385fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson StructuredArguments.setInt(0); 38656ef550c5eeea0714c635782776389df2a177584Chris Lattner } else { 38756ef550c5eeea0714c635782776389df2a177584Chris Lattner TemplateArgument *NewSArgs = new TemplateArgument[Builder.flatSize()]; 38856ef550c5eeea0714c635782776389df2a177584Chris Lattner std::copy(Builder.getFlatArguments(), 38956ef550c5eeea0714c635782776389df2a177584Chris Lattner Builder.getFlatArguments()+Builder.flatSize(), NewSArgs); 39056ef550c5eeea0714c635782776389df2a177584Chris Lattner StructuredArguments.setPointer(NewSArgs); 39156ef550c5eeea0714c635782776389df2a177584Chris Lattner } 3927e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor} 3937e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor 394885989109ade7cb4dc493e25da41456c64b3cf6aChris Lattner/// Produces a shallow copy of the given template argument list. This 395885989109ade7cb4dc493e25da41456c64b3cf6aChris Lattner/// assumes that the input argument list outlives it. This takes the list as 396885989109ade7cb4dc493e25da41456c64b3cf6aChris Lattner/// a pointer to avoid looking like a copy constructor, since this really 397885989109ade7cb4dc493e25da41456c64b3cf6aChris Lattner/// really isn't safe to use that way. 398885989109ade7cb4dc493e25da41456c64b3cf6aChris LattnerTemplateArgumentList::TemplateArgumentList(const TemplateArgumentList *Other) 399885989109ade7cb4dc493e25da41456c64b3cf6aChris Lattner : FlatArguments(Other->FlatArguments.getPointer(), false), 400885989109ade7cb4dc493e25da41456c64b3cf6aChris Lattner NumFlatArguments(Other->flat_size()), 401885989109ade7cb4dc493e25da41456c64b3cf6aChris Lattner StructuredArguments(Other->StructuredArguments.getPointer(), false), 402885989109ade7cb4dc493e25da41456c64b3cf6aChris Lattner NumStructuredArguments(Other->NumStructuredArguments) { } 403b9aa6b214c8fbc3e081dde575eef1f0913d48bdcDouglas Gregor 4047e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas GregorTemplateArgumentList::~TemplateArgumentList() { 40556ef550c5eeea0714c635782776389df2a177584Chris Lattner if (FlatArguments.getInt()) 40656ef550c5eeea0714c635782776389df2a177584Chris Lattner delete [] FlatArguments.getPointer(); 40756ef550c5eeea0714c635782776389df2a177584Chris Lattner if (StructuredArguments.getInt()) 40856ef550c5eeea0714c635782776389df2a177584Chris Lattner delete [] StructuredArguments.getPointer(); 4097e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor} 4107e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor 4117e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor//===----------------------------------------------------------------------===// 4123e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor// ClassTemplateSpecializationDecl Implementation 4133e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor//===----------------------------------------------------------------------===// 4143e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas GregorClassTemplateSpecializationDecl:: 41513c8577201e4fc0ddac5f09d05fd1778832137d1Douglas GregorClassTemplateSpecializationDecl(ASTContext &Context, Kind DK, TagKind TK, 4167e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor DeclContext *DC, SourceLocation L, 4173e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor ClassTemplateDecl *SpecializedTemplate, 4188e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor TemplateArgumentListBuilder &Builder, 4198e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor ClassTemplateSpecializationDecl *PrevDecl) 42013c8577201e4fc0ddac5f09d05fd1778832137d1Douglas Gregor : CXXRecordDecl(DK, TK, DC, L, 4218e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor SpecializedTemplate->getIdentifier(), 4228e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor PrevDecl), 4233e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor SpecializedTemplate(SpecializedTemplate), 4243cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall TypeAsWritten(0), 425fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson TemplateArgs(Context, Builder, /*TakeArgs=*/true), 4267e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor SpecializationKind(TSK_Undeclared) { 4273e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor} 4281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4293e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas GregorClassTemplateSpecializationDecl * 43013c8577201e4fc0ddac5f09d05fd1778832137d1Douglas GregorClassTemplateSpecializationDecl::Create(ASTContext &Context, TagKind TK, 4313e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor DeclContext *DC, SourceLocation L, 4323e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor ClassTemplateDecl *SpecializedTemplate, 43391fdf6f576b91f023c3bebb0d3786aab555cb3c5Anders Carlsson TemplateArgumentListBuilder &Builder, 434cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor ClassTemplateSpecializationDecl *PrevDecl) { 435cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor ClassTemplateSpecializationDecl *Result 4361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump = new (Context)ClassTemplateSpecializationDecl(Context, 437c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor ClassTemplateSpecialization, 43813c8577201e4fc0ddac5f09d05fd1778832137d1Douglas Gregor TK, DC, L, 4397e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor SpecializedTemplate, 4408e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor Builder, 4418e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor PrevDecl); 442cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor Context.getTypeDeclType(Result, PrevDecl); 443cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor return Result; 4443e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor} 445c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor 44637d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregorvoid ClassTemplateSpecializationDecl::Destroy(ASTContext &C) { 4471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (SpecializedPartialSpecialization *PartialSpec 44837d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor = SpecializedTemplate.dyn_cast<SpecializedPartialSpecialization*>()) 44937d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor C.Deallocate(PartialSpec); 4501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 45137d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor CXXRecordDecl::Destroy(C); 45237d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor} 45337d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor 454136a6988960ac3aeb96f298da7a1a182db7217cdJohn McCallvoid 455136a6988960ac3aeb96f298da7a1a182db7217cdJohn McCallClassTemplateSpecializationDecl::getNameForDiagnostic(std::string &S, 456136a6988960ac3aeb96f298da7a1a182db7217cdJohn McCall const PrintingPolicy &Policy, 457136a6988960ac3aeb96f298da7a1a182db7217cdJohn McCall bool Qualified) const { 458136a6988960ac3aeb96f298da7a1a182db7217cdJohn McCall NamedDecl::getNameForDiagnostic(S, Policy, Qualified); 459136a6988960ac3aeb96f298da7a1a182db7217cdJohn McCall 460136a6988960ac3aeb96f298da7a1a182db7217cdJohn McCall const TemplateArgumentList &TemplateArgs = getTemplateArgs(); 461136a6988960ac3aeb96f298da7a1a182db7217cdJohn McCall S += TemplateSpecializationType::PrintTemplateArgumentList( 462136a6988960ac3aeb96f298da7a1a182db7217cdJohn McCall TemplateArgs.getFlatArgumentList(), 463136a6988960ac3aeb96f298da7a1a182db7217cdJohn McCall TemplateArgs.flat_size(), 464136a6988960ac3aeb96f298da7a1a182db7217cdJohn McCall Policy); 465136a6988960ac3aeb96f298da7a1a182db7217cdJohn McCall} 466136a6988960ac3aeb96f298da7a1a182db7217cdJohn McCall 46737d93e9252026d4fb836d9c05d0122a2d46e56beDouglas GregorClassTemplateDecl * 4681eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpClassTemplateSpecializationDecl::getSpecializedTemplate() const { 4691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (SpecializedPartialSpecialization *PartialSpec 47037d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor = SpecializedTemplate.dyn_cast<SpecializedPartialSpecialization*>()) 47137d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor return PartialSpec->PartialSpecialization->getSpecializedTemplate(); 47237d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor return SpecializedTemplate.get<ClassTemplateDecl*>(); 47337d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor} 47437d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor 475c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor//===----------------------------------------------------------------------===// 476c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor// ClassTemplatePartialSpecializationDecl Implementation 477c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor//===----------------------------------------------------------------------===// 478c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas GregorClassTemplatePartialSpecializationDecl * 479c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas GregorClassTemplatePartialSpecializationDecl:: 48013c8577201e4fc0ddac5f09d05fd1778832137d1Douglas GregorCreate(ASTContext &Context, TagKind TK,DeclContext *DC, SourceLocation L, 481c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor TemplateParameterList *Params, 482c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor ClassTemplateDecl *SpecializedTemplate, 48391fdf6f576b91f023c3bebb0d3786aab555cb3c5Anders Carlsson TemplateArgumentListBuilder &Builder, 484d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall const TemplateArgumentListInfo &ArgInfos, 4853cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall QualType CanonInjectedType, 486dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor ClassTemplatePartialSpecializationDecl *PrevDecl, 487dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor unsigned SequenceNumber) { 488d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall unsigned N = ArgInfos.size(); 489833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateArgumentLoc *ClonedArgs = new (Context) TemplateArgumentLoc[N]; 490833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall for (unsigned I = 0; I != N; ++I) 491833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall ClonedArgs[I] = ArgInfos[I]; 492833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 493c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor ClassTemplatePartialSpecializationDecl *Result 49413c8577201e4fc0ddac5f09d05fd1778832137d1Douglas Gregor = new (Context)ClassTemplatePartialSpecializationDecl(Context, TK, 495c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor DC, L, Params, 496c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor SpecializedTemplate, 497833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall Builder, 498833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall ClonedArgs, N, 499dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor PrevDecl, 500dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor SequenceNumber); 501c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor Result->setSpecializationKind(TSK_ExplicitSpecialization); 5023cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall 5033cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall Context.getInjectedClassNameType(Result, CanonInjectedType); 504c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor return Result; 505c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor} 506dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall 507dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall//===----------------------------------------------------------------------===// 508dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall// FriendTemplateDecl Implementation 509dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall//===----------------------------------------------------------------------===// 510dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall 511dd4a3b0065b9a7e7b00073df415a798886c090f3John McCallFriendTemplateDecl *FriendTemplateDecl::Create(ASTContext &Context, 512dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall DeclContext *DC, 513dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall SourceLocation L, 514dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall unsigned NParams, 515dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall TemplateParameterList **Params, 516dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall FriendUnion Friend, 517dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall SourceLocation FLoc) { 518dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall FriendTemplateDecl *Result 519dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall = new (Context) FriendTemplateDecl(DC, L, NParams, Params, Friend, FLoc); 520dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall return Result; 521dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall} 522