DeclTemplate.cpp revision 9eabebafc165a67812eacc184806e7bf34c5f0a5
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//===----------------------------------------------------------------------===// 879eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne// RedeclarableTemplateDecl Implementation 889eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne//===----------------------------------------------------------------------===// 899eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne 909eabebafc165a67812eacc184806e7bf34c5f0a5Peter CollingbourneRedeclarableTemplateDecl::CommonBase *RedeclarableTemplateDecl::getCommonPtr() { 919eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne // Find the first declaration of this function template. 929eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne RedeclarableTemplateDecl *First = getCanonicalDecl(); 939eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne 949eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne if (First->CommonOrPrev.isNull()) { 959eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne CommonBase *CommonPtr = First->newCommon(); 969eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne First->CommonOrPrev = CommonPtr; 979eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne } 989eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne return First->CommonOrPrev.get<CommonBase*>(); 999eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne} 1009eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne 1019eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne 1029eabebafc165a67812eacc184806e7bf34c5f0a5Peter CollingbourneRedeclarableTemplateDecl *RedeclarableTemplateDecl::getCanonicalDeclImpl() { 1039eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne RedeclarableTemplateDecl *Tmpl = this; 1049eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne while (Tmpl->getPreviousDeclaration()) 1059eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne Tmpl = Tmpl->getPreviousDeclaration(); 1069eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne return Tmpl; 1079eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne} 1089eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne 1099eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne//===----------------------------------------------------------------------===// 110aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// FunctionTemplateDecl Implementation 111aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 112aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 1130054531488928a424666ac11fcdc6bcc5112de52Douglas Gregorvoid FunctionTemplateDecl::DeallocateCommon(void *Ptr) { 1140054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor static_cast<Common *>(Ptr)->~Common(); 1150054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor} 1160054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor 117aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorFunctionTemplateDecl *FunctionTemplateDecl::Create(ASTContext &C, 118aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor DeclContext *DC, 119aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor SourceLocation L, 120aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor DeclarationName Name, 121127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor TemplateParameterList *Params, 122aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor NamedDecl *Decl) { 123aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor return new (C) FunctionTemplateDecl(DC, L, Name, Params, Decl); 124aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor} 125aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 1269eabebafc165a67812eacc184806e7bf34c5f0a5Peter CollingbourneRedeclarableTemplateDecl::CommonBase *FunctionTemplateDecl::newCommon() { 1279eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne Common *CommonPtr = new (getASTContext()) Common; 1289eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne getASTContext().AddDeallocation(DeallocateCommon, CommonPtr); 1299eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne return CommonPtr; 1309eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne} 1319eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne 1322c853e401ca406d417eb916e867226050e7be06bArgyrios KyrtzidisFunctionDecl * 1332c853e401ca406d417eb916e867226050e7be06bArgyrios KyrtzidisFunctionTemplateDecl::findSpecialization(const TemplateArgument *Args, 1342c853e401ca406d417eb916e867226050e7be06bArgyrios Kyrtzidis unsigned NumArgs, void *&InsertPos) { 1352c853e401ca406d417eb916e867226050e7be06bArgyrios Kyrtzidis llvm::FoldingSetNodeID ID; 1362c853e401ca406d417eb916e867226050e7be06bArgyrios Kyrtzidis FunctionTemplateSpecializationInfo::Profile(ID,Args,NumArgs, getASTContext()); 1372c853e401ca406d417eb916e867226050e7be06bArgyrios Kyrtzidis FunctionTemplateSpecializationInfo *Info 1382c853e401ca406d417eb916e867226050e7be06bArgyrios Kyrtzidis = getSpecializations().FindNodeOrInsertPos(ID, InsertPos); 1392c853e401ca406d417eb916e867226050e7be06bArgyrios Kyrtzidis return Info ? Info->Function->getMostRecentDeclaration() : 0; 1402c853e401ca406d417eb916e867226050e7be06bArgyrios Kyrtzidis} 1412c853e401ca406d417eb916e867226050e7be06bArgyrios Kyrtzidis 142aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 143aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// ClassTemplateDecl Implementation 144aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 145aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 1460054531488928a424666ac11fcdc6bcc5112de52Douglas Gregorvoid ClassTemplateDecl::DeallocateCommon(void *Ptr) { 1470054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor static_cast<Common *>(Ptr)->~Common(); 1480054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor} 1490054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor 1508731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios KyrtzidisClassTemplateDecl *ClassTemplateDecl::Create(ASTContext &C, 1518731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis DeclContext *DC, 1528731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis SourceLocation L, 1538731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis DeclarationName Name, 1548731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis TemplateParameterList *Params, 1558731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis NamedDecl *Decl, 1568731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis ClassTemplateDecl *PrevDecl) { 1578731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis ClassTemplateDecl *New = new (C) ClassTemplateDecl(DC, L, Name, Params, Decl); 1585bf1bdc2fedb0c29b5fcdb4abc852aa85b4fe26aArgyrios Kyrtzidis New->setPreviousDeclaration(PrevDecl); 1598731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis return New; 1605953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor} 1615953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor 1629eabebafc165a67812eacc184806e7bf34c5f0a5Peter CollingbourneRedeclarableTemplateDecl::CommonBase *ClassTemplateDecl::newCommon() { 1639eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne Common *CommonPtr = new (getASTContext()) Common; 1649eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne getASTContext().AddDeallocation(DeallocateCommon, CommonPtr); 1659eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne return CommonPtr; 1669eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne} 1679eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne 168cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplateSpecializationDecl * 169cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplateDecl::findSpecialization(const TemplateArgument *Args, 170cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis unsigned NumArgs, void *&InsertPos) { 171cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis llvm::FoldingSetNodeID ID; 172cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis ClassTemplateSpecializationDecl::Profile(ID, Args, NumArgs, getASTContext()); 173cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis ClassTemplateSpecializationDecl *D 174cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis = getSpecializations().FindNodeOrInsertPos(ID, InsertPos); 175cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis return D ? D->getMostRecentDeclaration() : 0; 176cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis} 177cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis 178cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplatePartialSpecializationDecl * 179cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplateDecl::findPartialSpecialization(const TemplateArgument *Args, 180cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis unsigned NumArgs, 181cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis void *&InsertPos) { 182cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis llvm::FoldingSetNodeID ID; 183cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis ClassTemplatePartialSpecializationDecl::Profile(ID, Args, NumArgs, 184cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis getASTContext()); 185cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis ClassTemplatePartialSpecializationDecl *D 186cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis = getPartialSpecializations().FindNodeOrInsertPos(ID, InsertPos); 187cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis return D ? D->getMostRecentDeclaration() : 0; 188cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis} 189cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis 190dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregorvoid ClassTemplateDecl::getPartialSpecializations( 191dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor llvm::SmallVectorImpl<ClassTemplatePartialSpecializationDecl *> &PS) { 192dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor llvm::FoldingSet<ClassTemplatePartialSpecializationDecl> &PartialSpecs 1935bf1bdc2fedb0c29b5fcdb4abc852aa85b4fe26aArgyrios Kyrtzidis = getPartialSpecializations(); 194dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor PS.clear(); 195dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor PS.resize(PartialSpecs.size()); 196dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor for (llvm::FoldingSet<ClassTemplatePartialSpecializationDecl>::iterator 197dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor P = PartialSpecs.begin(), PEnd = PartialSpecs.end(); 198dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor P != PEnd; ++P) { 199dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor assert(!PS[P->getSequenceNumber()]); 200cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis PS[P->getSequenceNumber()] = P->getMostRecentDeclaration(); 201dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor } 202dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor} 203dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor 204b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas GregorClassTemplatePartialSpecializationDecl * 205b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas GregorClassTemplateDecl::findPartialSpecialization(QualType T) { 206b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor ASTContext &Context = getASTContext(); 207b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor typedef llvm::FoldingSet<ClassTemplatePartialSpecializationDecl>::iterator 208b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor partial_spec_iterator; 209b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor for (partial_spec_iterator P = getPartialSpecializations().begin(), 210b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor PEnd = getPartialSpecializations().end(); 211b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor P != PEnd; ++P) { 21231f17ecbef57b5679c017c375db330546b7b5145John McCall if (Context.hasSameType(P->getInjectedSpecializationType(), T)) 213cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis return P->getMostRecentDeclaration(); 214cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis } 215cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis 216cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis return 0; 217cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis} 218cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis 219cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplatePartialSpecializationDecl * 220cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplateDecl::findPartialSpecInstantiatedFromMember( 221cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis ClassTemplatePartialSpecializationDecl *D) { 222cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis Decl *DCanon = D->getCanonicalDecl(); 223cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis for (llvm::FoldingSet<ClassTemplatePartialSpecializationDecl>::iterator 224cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis P = getPartialSpecializations().begin(), 225cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis PEnd = getPartialSpecializations().end(); 226cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis P != PEnd; ++P) { 227cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis if (P->getInstantiatedFromMember()->getCanonicalDecl() == DCanon) 228cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis return P->getMostRecentDeclaration(); 229b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor } 2301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 231b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor return 0; 232b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor} 233b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor 2343cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCallQualType 23524bae92f08ae098cc50a602d8cf1273b423e14daDouglas GregorClassTemplateDecl::getInjectedClassNameSpecialization() { 2365bf1bdc2fedb0c29b5fcdb4abc852aa85b4fe26aArgyrios Kyrtzidis Common *CommonPtr = getCommonPtr(); 2377da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor if (!CommonPtr->InjectedClassNameType.isNull()) 2387da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor return CommonPtr->InjectedClassNameType; 2397da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor 2407da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor // FIXME: n2800 14.6.1p1 should say how the template arguments 2417da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor // corresponding to template parameter packs should be pack 2427da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor // expansions. We already say that in 14.6.2.1p2, so it would be 2437da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor // better to fix that redundancy. 24424bae92f08ae098cc50a602d8cf1273b423e14daDouglas Gregor ASTContext &Context = getASTContext(); 2457da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor TemplateParameterList *Params = getTemplateParameters(); 2467da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor llvm::SmallVector<TemplateArgument, 16> TemplateArgs; 2477da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor TemplateArgs.reserve(Params->size()); 2481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump for (TemplateParameterList::iterator Param = Params->begin(), 2491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump ParamEnd = Params->end(); 2507da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor Param != ParamEnd; ++Param) { 2517da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor if (isa<TemplateTypeParmDecl>(*Param)) { 2527da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor QualType ParamType = Context.getTypeDeclType(cast<TypeDecl>(*Param)); 253833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateArgs.push_back(TemplateArgument(ParamType)); 2541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } else if (NonTypeTemplateParmDecl *NTTP = 2557da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor dyn_cast<NonTypeTemplateParmDecl>(*Param)) { 256b7de181d912690958e82c01f1b3d752d3d4ab43bChandler Carruth Expr *E = new (Context) DeclRefExpr(NTTP, 2576398235d7890a81b785ea5af3b6e66d86bf184ccDouglas Gregor NTTP->getType().getNonLValueExprType(Context), 2580da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor NTTP->getLocation()); 2597da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor TemplateArgs.push_back(TemplateArgument(E)); 2601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } else { 2617da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor TemplateTemplateParmDecl *TTP = cast<TemplateTemplateParmDecl>(*Param); 262788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor TemplateArgs.push_back(TemplateArgument(TemplateName(TTP))); 2637da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor } 2647da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor } 2657da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor 2667da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor CommonPtr->InjectedClassNameType 2671275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor = Context.getTemplateSpecializationType(TemplateName(this), 2687da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor &TemplateArgs[0], 2691275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor TemplateArgs.size()); 2707da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor return CommonPtr->InjectedClassNameType; 2717da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor} 2727da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor 273aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 274aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// TemplateTypeParm Allocation/Deallocation Method Implementations 275aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 276aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 277aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorTemplateTypeParmDecl * 278aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorTemplateTypeParmDecl::Create(ASTContext &C, DeclContext *DC, 279aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor SourceLocation L, unsigned D, unsigned P, 2806d845ae1baf77691bca080e0762a1d45ee017f70Anders Carlsson IdentifierInfo *Id, bool Typename, 2816d845ae1baf77691bca080e0762a1d45ee017f70Anders Carlsson bool ParameterPack) { 282efed5c832de630715dd42211dd3b2aab5dd97a1bDouglas Gregor QualType Type = C.getTemplateTypeParmType(D, P, ParameterPack, Id); 283efed5c832de630715dd42211dd3b2aab5dd97a1bDouglas Gregor return new (C) TemplateTypeParmDecl(DC, L, Id, Typename, Type, ParameterPack); 284aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor} 285aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 286b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios KyrtzidisTemplateTypeParmDecl * 287b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios KyrtzidisTemplateTypeParmDecl::Create(ASTContext &C, EmptyShell Empty) { 288b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios Kyrtzidis return new (C) TemplateTypeParmDecl(0, SourceLocation(), 0, false, 289b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios Kyrtzidis QualType(), false); 290b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios Kyrtzidis} 291b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios Kyrtzidis 292833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallSourceLocation TemplateTypeParmDecl::getDefaultArgumentLoc() const { 293bd054dba8a3023821f2a0951b0fae05e3522a7c9Abramo Bagnara return DefaultArgument->getTypeLoc().getSourceRange().getBegin(); 294833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall} 295833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 296ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregorunsigned TemplateTypeParmDecl::getDepth() const { 297ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor return TypeForDecl->getAs<TemplateTypeParmType>()->getDepth(); 298ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor} 299ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor 300ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregorunsigned TemplateTypeParmDecl::getIndex() const { 301ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor return TypeForDecl->getAs<TemplateTypeParmType>()->getIndex(); 302ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor} 303ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor 304aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 305aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// NonTypeTemplateParmDecl Method Implementations 306aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 307aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 308aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorNonTypeTemplateParmDecl * 309aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorNonTypeTemplateParmDecl::Create(ASTContext &C, DeclContext *DC, 310aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor SourceLocation L, unsigned D, unsigned P, 311aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor IdentifierInfo *Id, QualType T, 312a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall TypeSourceInfo *TInfo) { 313a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall return new (C) NonTypeTemplateParmDecl(DC, L, D, P, Id, T, TInfo); 314aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor} 315aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 316d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas GregorSourceLocation NonTypeTemplateParmDecl::getDefaultArgumentLoc() const { 317d92f7a297c0ed3f7d0ebcbb557e1d4c1925b8c72Abramo Bagnara return hasDefaultArgument() 318d92f7a297c0ed3f7d0ebcbb557e1d4c1925b8c72Abramo Bagnara ? getDefaultArgument()->getSourceRange().getBegin() 319d92f7a297c0ed3f7d0ebcbb557e1d4c1925b8c72Abramo Bagnara : SourceLocation(); 320d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas Gregor} 321d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas Gregor 322aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 323aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// TemplateTemplateParmDecl Method Implementations 324aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 325aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 326aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorTemplateTemplateParmDecl * 327aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorTemplateTemplateParmDecl::Create(ASTContext &C, DeclContext *DC, 328aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor SourceLocation L, unsigned D, unsigned P, 329aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor IdentifierInfo *Id, 330aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor TemplateParameterList *Params) { 331aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor return new (C) TemplateTemplateParmDecl(DC, L, D, P, Id, Params); 332aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor} 333aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 3343e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor//===----------------------------------------------------------------------===// 3359ba41645892da0000fe8a7832b80208f44dafedaAnders Carlsson// TemplateArgumentListBuilder Implementation 3369ba41645892da0000fe8a7832b80208f44dafedaAnders Carlsson//===----------------------------------------------------------------------===// 337fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson 33898d279ba8092186f606abaa8298f13a0816b9cf2Chris Lattnervoid TemplateArgumentListBuilder::Append(const TemplateArgument &Arg) { 33998d279ba8092186f606abaa8298f13a0816b9cf2Chris Lattner assert((Arg.getKind() != TemplateArgument::Type || 34098d279ba8092186f606abaa8298f13a0816b9cf2Chris Lattner Arg.getAsType().isCanonical()) && "Type must be canonical!"); 34198d279ba8092186f606abaa8298f13a0816b9cf2Chris Lattner assert(FlatArgs.size() < MaxFlatArgs && "Argument list builder is full!"); 3421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump assert(!StructuredArgs && 343fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson "Can't append arguments when an argument pack has been added!"); 3441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 34598d279ba8092186f606abaa8298f13a0816b9cf2Chris Lattner FlatArgs.push_back(Arg); 3469ba41645892da0000fe8a7832b80208f44dafedaAnders Carlsson} 3479ba41645892da0000fe8a7832b80208f44dafedaAnders Carlsson 348fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlssonvoid TemplateArgumentListBuilder::BeginPack() { 349fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson assert(!AddingToPack && "Already adding to pack!"); 350fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson assert(!StructuredArgs && "Argument list already contains a pack!"); 3511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 352fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson AddingToPack = true; 35398d279ba8092186f606abaa8298f13a0816b9cf2Chris Lattner PackBeginIndex = FlatArgs.size(); 35467e332009c6e349dc34700f539747afcff990336Anders Carlsson} 35567e332009c6e349dc34700f539747afcff990336Anders Carlsson 356fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlssonvoid TemplateArgumentListBuilder::EndPack() { 357fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson assert(AddingToPack && "Not adding to pack!"); 358fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson assert(!StructuredArgs && "Argument list already contains a pack!"); 3591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 360fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson AddingToPack = false; 3613b36b66a00b7d5bab71b486a54694f0ae397bddbAnders Carlsson 362304d0faa6cac3111074cc400c1c573a6e611872bChris Lattner // FIXME: This is a memory leak! 363fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson StructuredArgs = new TemplateArgument[MaxStructuredArgs]; 3641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 365fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson // First copy the flat entries over to the list (if any) 366fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson for (unsigned I = 0; I != PackBeginIndex; ++I) { 367fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson NumStructuredArgs++; 368fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson StructuredArgs[I] = FlatArgs[I]; 369fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson } 3701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 371fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson // Next, set the pack. 372fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson TemplateArgument *PackArgs = 0; 373fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson unsigned NumPackArgs = NumFlatArgs - PackBeginIndex; 37498d279ba8092186f606abaa8298f13a0816b9cf2Chris Lattner // FIXME: NumPackArgs shouldn't be negative here??? 375fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson if (NumPackArgs) 37698d279ba8092186f606abaa8298f13a0816b9cf2Chris Lattner PackArgs = FlatArgs.data()+PackBeginIndex; 3771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump StructuredArgs[NumStructuredArgs++].setArgumentPack(PackArgs, NumPackArgs, 379fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson /*CopyArgs=*/false); 380fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson} 381fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson 3829ba41645892da0000fe8a7832b80208f44dafedaAnders Carlsson//===----------------------------------------------------------------------===// 3837e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor// TemplateArgumentList Implementation 3847e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor//===----------------------------------------------------------------------===// 3857e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas GregorTemplateArgumentList::TemplateArgumentList(ASTContext &Context, 386e9c904b082ac3299831704a69066b86ab0f78becAnders Carlsson TemplateArgumentListBuilder &Builder, 387fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson bool TakeArgs) 3881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump : FlatArguments(Builder.getFlatArguments(), TakeArgs), 3891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump NumFlatArguments(Builder.flatSize()), 390fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson StructuredArguments(Builder.getStructuredArguments(), TakeArgs), 391fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson NumStructuredArguments(Builder.structuredSize()) { 3921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 393fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson if (!TakeArgs) 394fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson return; 3951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 39656ef550c5eeea0714c635782776389df2a177584Chris Lattner // If this does take ownership of the arguments, then we have to new them 39756ef550c5eeea0714c635782776389df2a177584Chris Lattner // and copy over. 3983458d43b68cc2fd1cb2b2304614e1dc3419820d8Ted Kremenek TemplateArgument *NewArgs = 3993458d43b68cc2fd1cb2b2304614e1dc3419820d8Ted Kremenek new (Context) TemplateArgument[Builder.flatSize()]; 40056ef550c5eeea0714c635782776389df2a177584Chris Lattner std::copy(Builder.getFlatArguments(), 40156ef550c5eeea0714c635782776389df2a177584Chris Lattner Builder.getFlatArguments()+Builder.flatSize(), NewArgs); 40256ef550c5eeea0714c635782776389df2a177584Chris Lattner FlatArguments.setPointer(NewArgs); 40356ef550c5eeea0714c635782776389df2a177584Chris Lattner 40456ef550c5eeea0714c635782776389df2a177584Chris Lattner // Just reuse the structured and flat arguments array if possible. 40556ef550c5eeea0714c635782776389df2a177584Chris Lattner if (Builder.getStructuredArguments() == Builder.getFlatArguments()) { 40656ef550c5eeea0714c635782776389df2a177584Chris Lattner StructuredArguments.setPointer(NewArgs); 407fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson StructuredArguments.setInt(0); 40856ef550c5eeea0714c635782776389df2a177584Chris Lattner } else { 4093458d43b68cc2fd1cb2b2304614e1dc3419820d8Ted Kremenek TemplateArgument *NewSArgs = 4103458d43b68cc2fd1cb2b2304614e1dc3419820d8Ted Kremenek new (Context) TemplateArgument[Builder.flatSize()]; 41156ef550c5eeea0714c635782776389df2a177584Chris Lattner std::copy(Builder.getFlatArguments(), 41256ef550c5eeea0714c635782776389df2a177584Chris Lattner Builder.getFlatArguments()+Builder.flatSize(), NewSArgs); 41356ef550c5eeea0714c635782776389df2a177584Chris Lattner StructuredArguments.setPointer(NewSArgs); 41456ef550c5eeea0714c635782776389df2a177584Chris Lattner } 4157e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor} 4167e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor 417d0913557c800c8a712fb554032a833619f23bc56Argyrios KyrtzidisTemplateArgumentList::TemplateArgumentList(ASTContext &Context, 41894d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis const TemplateArgument *Args, 419dc767e368471288bef8716d19b0e929647246bfcArgyrios Kyrtzidis unsigned NumArgs) 420dc767e368471288bef8716d19b0e929647246bfcArgyrios Kyrtzidis : NumFlatArguments(0), NumStructuredArguments(0) { 42194d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis init(Context, Args, NumArgs); 422d0913557c800c8a712fb554032a833619f23bc56Argyrios Kyrtzidis} 423d0913557c800c8a712fb554032a833619f23bc56Argyrios Kyrtzidis 424885989109ade7cb4dc493e25da41456c64b3cf6aChris Lattner/// Produces a shallow copy of the given template argument list. This 425885989109ade7cb4dc493e25da41456c64b3cf6aChris Lattner/// assumes that the input argument list outlives it. This takes the list as 426885989109ade7cb4dc493e25da41456c64b3cf6aChris Lattner/// a pointer to avoid looking like a copy constructor, since this really 427885989109ade7cb4dc493e25da41456c64b3cf6aChris Lattner/// really isn't safe to use that way. 428885989109ade7cb4dc493e25da41456c64b3cf6aChris LattnerTemplateArgumentList::TemplateArgumentList(const TemplateArgumentList *Other) 429885989109ade7cb4dc493e25da41456c64b3cf6aChris Lattner : FlatArguments(Other->FlatArguments.getPointer(), false), 430885989109ade7cb4dc493e25da41456c64b3cf6aChris Lattner NumFlatArguments(Other->flat_size()), 431885989109ade7cb4dc493e25da41456c64b3cf6aChris Lattner StructuredArguments(Other->StructuredArguments.getPointer(), false), 432885989109ade7cb4dc493e25da41456c64b3cf6aChris Lattner NumStructuredArguments(Other->NumStructuredArguments) { } 433b9aa6b214c8fbc3e081dde575eef1f0913d48bdcDouglas Gregor 43494d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidisvoid TemplateArgumentList::init(ASTContext &Context, 43594d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis const TemplateArgument *Args, 43694d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis unsigned NumArgs) { 43794d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidisassert(NumFlatArguments == 0 && NumStructuredArguments == 0 && 43894d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis "Already initialized!"); 43994d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis 44094d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios KyrtzidisNumFlatArguments = NumStructuredArguments = NumArgs; 44194d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios KyrtzidisTemplateArgument *NewArgs = new (Context) TemplateArgument[NumArgs]; 44294d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidisstd::copy(Args, Args+NumArgs, NewArgs); 44394d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios KyrtzidisFlatArguments.setPointer(NewArgs); 44494d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios KyrtzidisFlatArguments.setInt(1); // Owns the pointer. 44594d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis 44694d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis// Just reuse the flat arguments array. 44794d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios KyrtzidisStructuredArguments.setPointer(NewArgs); 44894d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios KyrtzidisStructuredArguments.setInt(0); // Doesn't own the pointer. 44994d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis} 45094d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis 4517e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor//===----------------------------------------------------------------------===// 4523e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor// ClassTemplateSpecializationDecl Implementation 4533e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor//===----------------------------------------------------------------------===// 4543e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas GregorClassTemplateSpecializationDecl:: 45513c8577201e4fc0ddac5f09d05fd1778832137d1Douglas GregorClassTemplateSpecializationDecl(ASTContext &Context, Kind DK, TagKind TK, 4567e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor DeclContext *DC, SourceLocation L, 4573e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor ClassTemplateDecl *SpecializedTemplate, 4588e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor TemplateArgumentListBuilder &Builder, 4598e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor ClassTemplateSpecializationDecl *PrevDecl) 46013c8577201e4fc0ddac5f09d05fd1778832137d1Douglas Gregor : CXXRecordDecl(DK, TK, DC, L, 4618e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor SpecializedTemplate->getIdentifier(), 4628e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor PrevDecl), 4633e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor SpecializedTemplate(SpecializedTemplate), 464c98971d5c994caed9452aeadd0122c855e0f4de1Abramo Bagnara ExplicitInfo(0), 465fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson TemplateArgs(Context, Builder, /*TakeArgs=*/true), 4667e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor SpecializationKind(TSK_Undeclared) { 4673e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor} 4681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 46994d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios KyrtzidisClassTemplateSpecializationDecl::ClassTemplateSpecializationDecl(Kind DK) 47094d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis : CXXRecordDecl(DK, TTK_Struct, 0, SourceLocation(), 0, 0), 47194d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis ExplicitInfo(0), 47294d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis SpecializationKind(TSK_Undeclared) { 47394d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis} 47494d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis 4753e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas GregorClassTemplateSpecializationDecl * 47613c8577201e4fc0ddac5f09d05fd1778832137d1Douglas GregorClassTemplateSpecializationDecl::Create(ASTContext &Context, TagKind TK, 4773e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor DeclContext *DC, SourceLocation L, 4783e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor ClassTemplateDecl *SpecializedTemplate, 47991fdf6f576b91f023c3bebb0d3786aab555cb3c5Anders Carlsson TemplateArgumentListBuilder &Builder, 480cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor ClassTemplateSpecializationDecl *PrevDecl) { 481cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor ClassTemplateSpecializationDecl *Result 4821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump = new (Context)ClassTemplateSpecializationDecl(Context, 483c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor ClassTemplateSpecialization, 48413c8577201e4fc0ddac5f09d05fd1778832137d1Douglas Gregor TK, DC, L, 4857e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor SpecializedTemplate, 4868e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor Builder, 4878e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor PrevDecl); 488cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor Context.getTypeDeclType(Result, PrevDecl); 489cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor return Result; 4903e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor} 491c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor 49294d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios KyrtzidisClassTemplateSpecializationDecl * 493b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios KyrtzidisClassTemplateSpecializationDecl::Create(ASTContext &Context, EmptyShell Empty) { 49494d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis return 49594d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis new (Context)ClassTemplateSpecializationDecl(ClassTemplateSpecialization); 49694d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis} 49794d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis 498136a6988960ac3aeb96f298da7a1a182db7217cdJohn McCallvoid 499136a6988960ac3aeb96f298da7a1a182db7217cdJohn McCallClassTemplateSpecializationDecl::getNameForDiagnostic(std::string &S, 500136a6988960ac3aeb96f298da7a1a182db7217cdJohn McCall const PrintingPolicy &Policy, 501136a6988960ac3aeb96f298da7a1a182db7217cdJohn McCall bool Qualified) const { 502136a6988960ac3aeb96f298da7a1a182db7217cdJohn McCall NamedDecl::getNameForDiagnostic(S, Policy, Qualified); 503136a6988960ac3aeb96f298da7a1a182db7217cdJohn McCall 504136a6988960ac3aeb96f298da7a1a182db7217cdJohn McCall const TemplateArgumentList &TemplateArgs = getTemplateArgs(); 505136a6988960ac3aeb96f298da7a1a182db7217cdJohn McCall S += TemplateSpecializationType::PrintTemplateArgumentList( 506136a6988960ac3aeb96f298da7a1a182db7217cdJohn McCall TemplateArgs.getFlatArgumentList(), 507136a6988960ac3aeb96f298da7a1a182db7217cdJohn McCall TemplateArgs.flat_size(), 508136a6988960ac3aeb96f298da7a1a182db7217cdJohn McCall Policy); 509136a6988960ac3aeb96f298da7a1a182db7217cdJohn McCall} 510136a6988960ac3aeb96f298da7a1a182db7217cdJohn McCall 51137d93e9252026d4fb836d9c05d0122a2d46e56beDouglas GregorClassTemplateDecl * 5121eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpClassTemplateSpecializationDecl::getSpecializedTemplate() const { 5131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (SpecializedPartialSpecialization *PartialSpec 51437d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor = SpecializedTemplate.dyn_cast<SpecializedPartialSpecialization*>()) 51537d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor return PartialSpec->PartialSpecialization->getSpecializedTemplate(); 51637d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor return SpecializedTemplate.get<ClassTemplateDecl*>(); 51737d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor} 51837d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor 519c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor//===----------------------------------------------------------------------===// 520c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor// ClassTemplatePartialSpecializationDecl Implementation 521c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor//===----------------------------------------------------------------------===// 522c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas GregorClassTemplatePartialSpecializationDecl * 523c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas GregorClassTemplatePartialSpecializationDecl:: 52413c8577201e4fc0ddac5f09d05fd1778832137d1Douglas GregorCreate(ASTContext &Context, TagKind TK,DeclContext *DC, SourceLocation L, 525c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor TemplateParameterList *Params, 526c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor ClassTemplateDecl *SpecializedTemplate, 52791fdf6f576b91f023c3bebb0d3786aab555cb3c5Anders Carlsson TemplateArgumentListBuilder &Builder, 528d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall const TemplateArgumentListInfo &ArgInfos, 5293cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall QualType CanonInjectedType, 530dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor ClassTemplatePartialSpecializationDecl *PrevDecl, 531dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor unsigned SequenceNumber) { 532d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall unsigned N = ArgInfos.size(); 533833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateArgumentLoc *ClonedArgs = new (Context) TemplateArgumentLoc[N]; 534833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall for (unsigned I = 0; I != N; ++I) 535833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall ClonedArgs[I] = ArgInfos[I]; 536833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 537c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor ClassTemplatePartialSpecializationDecl *Result 53813c8577201e4fc0ddac5f09d05fd1778832137d1Douglas Gregor = new (Context)ClassTemplatePartialSpecializationDecl(Context, TK, 539c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor DC, L, Params, 540c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor SpecializedTemplate, 541833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall Builder, 542833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall ClonedArgs, N, 543dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor PrevDecl, 544dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor SequenceNumber); 545c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor Result->setSpecializationKind(TSK_ExplicitSpecialization); 5463cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall 5473cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall Context.getInjectedClassNameType(Result, CanonInjectedType); 548c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor return Result; 549c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor} 550dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall 55194d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios KyrtzidisClassTemplatePartialSpecializationDecl * 552b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios KyrtzidisClassTemplatePartialSpecializationDecl::Create(ASTContext &Context, 553b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios Kyrtzidis EmptyShell Empty) { 55494d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis return new (Context)ClassTemplatePartialSpecializationDecl(); 55594d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis} 55694d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis 55794d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidisvoid ClassTemplatePartialSpecializationDecl:: 55894d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios KyrtzidisinitTemplateArgsAsWritten(const TemplateArgumentListInfo &ArgInfos) { 55994d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis assert(ArgsAsWritten == 0 && "ArgsAsWritten already set"); 56094d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis unsigned N = ArgInfos.size(); 56194d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis TemplateArgumentLoc *ClonedArgs 56294d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis = new (getASTContext()) TemplateArgumentLoc[N]; 56394d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis for (unsigned I = 0; I != N; ++I) 56494d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis ClonedArgs[I] = ArgInfos[I]; 56594d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis 56694d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis ArgsAsWritten = ClonedArgs; 56794d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis NumArgsAsWritten = N; 56894d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis} 56994d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis 570dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall//===----------------------------------------------------------------------===// 571dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall// FriendTemplateDecl Implementation 572dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall//===----------------------------------------------------------------------===// 573dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall 574dd4a3b0065b9a7e7b00073df415a798886c090f3John McCallFriendTemplateDecl *FriendTemplateDecl::Create(ASTContext &Context, 575dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall DeclContext *DC, 576dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall SourceLocation L, 577dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall unsigned NParams, 578dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall TemplateParameterList **Params, 579dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall FriendUnion Friend, 580dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall SourceLocation FLoc) { 581dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall FriendTemplateDecl *Result 582dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall = new (Context) FriendTemplateDecl(DC, L, NParams, Params, Friend, FLoc); 583dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall return Result; 584dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall} 585554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis 586554e6aa2da082575514607c3639c246c04b3232aArgyrios KyrtzidisFriendTemplateDecl *FriendTemplateDecl::Create(ASTContext &Context, 587554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis EmptyShell Empty) { 588554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis return new (Context) FriendTemplateDecl(Empty); 589554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis} 590