DeclTemplate.cpp revision 77d4ee2bfc90b77ec8b818de985cd4aceeef757b
106a59bb8260ce3d52de761865dee90f90054a5ccSebastian Redl//===--- DeclTemplate.cpp - Template Declaration AST Node Implementation --===// 2aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// 3aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// The LLVM Compiler Infrastructure 4aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// 5aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// This file is distributed under the University of Illinois Open Source 6aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// License. See LICENSE.TXT for details. 7aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// 8aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 9aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// 10aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// This file implements the C++ related Decl classes for templates. 11aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// 12aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 13aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 14aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor#include "clang/AST/DeclCXX.h" 15aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor#include "clang/AST/DeclTemplate.h" 1655f6b14230c94272efbbcdd89a92224c8db9f225Douglas Gregor#include "clang/AST/Expr.h" 17b95cc97b2023d00cd3fbae8455bc9d728eab5e5dDouglas Gregor#include "clang/AST/ExprCXX.h" 18aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor#include "clang/AST/ASTContext.h" 19833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall#include "clang/AST/TypeLoc.h" 20bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis#include "clang/AST/ASTMutationListener.h" 21aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor#include "clang/Basic/IdentifierTable.h" 22aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor#include "llvm/ADT/STLExtras.h" 23910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor#include <memory> 24aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregorusing namespace clang; 25aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 26aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 27aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// TemplateParameterList Implementation 28aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 29aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 30ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas GregorTemplateParameterList::TemplateParameterList(SourceLocation TemplateLoc, 31ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas Gregor SourceLocation LAngleLoc, 32bf4ea56cdc376cef5a12abf6bf18dc34805c2226Douglas Gregor NamedDecl **Params, unsigned NumParams, 33ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas Gregor SourceLocation RAngleLoc) 34ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas Gregor : TemplateLoc(TemplateLoc), LAngleLoc(LAngleLoc), RAngleLoc(RAngleLoc), 35ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas Gregor NumParams(NumParams) { 36aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor for (unsigned Idx = 0; Idx < NumParams; ++Idx) 37aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor begin()[Idx] = Params[Idx]; 38aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor} 39aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 40aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorTemplateParameterList * 414ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadTemplateParameterList::Create(const ASTContext &C, SourceLocation TemplateLoc, 42bf4ea56cdc376cef5a12abf6bf18dc34805c2226Douglas Gregor SourceLocation LAngleLoc, NamedDecl **Params, 43ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas Gregor unsigned NumParams, SourceLocation RAngleLoc) { 44bf4ea56cdc376cef5a12abf6bf18dc34805c2226Douglas Gregor unsigned Size = sizeof(TemplateParameterList) 45bf4ea56cdc376cef5a12abf6bf18dc34805c2226Douglas Gregor + sizeof(NamedDecl *) * NumParams; 46aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor unsigned Align = llvm::AlignOf<TemplateParameterList>::Alignment; 47aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor void *Mem = C.Allocate(Size, Align); 481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return new (Mem) TemplateParameterList(TemplateLoc, LAngleLoc, Params, 49ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas Gregor NumParams, RAngleLoc); 50aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor} 51aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 5262cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregorunsigned TemplateParameterList::getMinRequiredArguments() const { 536952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor unsigned NumRequiredArgs = 0; 546952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor for (iterator P = const_cast<TemplateParameterList *>(this)->begin(), 556952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor PEnd = const_cast<TemplateParameterList *>(this)->end(); 566952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor P != PEnd; ++P) { 576952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor if ((*P)->isTemplateParameterPack()) { 586952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor if (NonTypeTemplateParmDecl *NTTP = dyn_cast<NonTypeTemplateParmDecl>(*P)) 596952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor if (NTTP->isExpandedParameterPack()) { 606952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor NumRequiredArgs += NTTP->getNumExpansionTypes(); 616952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor continue; 626952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor } 636952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor 6462cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor break; 656952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor } 666952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor 676952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(*P)) { 686952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor if (TTP->hasDefaultArgument()) 696952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor break; 706952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor } else if (NonTypeTemplateParmDecl *NTTP 716952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor = dyn_cast<NonTypeTemplateParmDecl>(*P)) { 726952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor if (NTTP->hasDefaultArgument()) 736952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor break; 746952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor } else if (cast<TemplateTemplateParmDecl>(*P)->hasDefaultArgument()) 756952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor break; 766952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor 776952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor ++NumRequiredArgs; 7862cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor } 796952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor 8062cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor return NumRequiredArgs; 8162cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor} 8262cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor 83ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregorunsigned TemplateParameterList::getDepth() const { 84ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor if (size() == 0) 85ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor return 0; 86ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor 87ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor const NamedDecl *FirstParm = getParam(0); 88ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor if (const TemplateTypeParmDecl *TTP 89ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor = dyn_cast<TemplateTypeParmDecl>(FirstParm)) 90ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor return TTP->getDepth(); 91ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor else if (const NonTypeTemplateParmDecl *NTTP 92ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor = dyn_cast<NonTypeTemplateParmDecl>(FirstParm)) 93ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor return NTTP->getDepth(); 94ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor else 95ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor return cast<TemplateTemplateParmDecl>(FirstParm)->getDepth(); 96ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor} 97ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor 98aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 999eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne// RedeclarableTemplateDecl Implementation 1009eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne//===----------------------------------------------------------------------===// 1019eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne 1029eabebafc165a67812eacc184806e7bf34c5f0a5Peter CollingbourneRedeclarableTemplateDecl::CommonBase *RedeclarableTemplateDecl::getCommonPtr() { 1039eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne // Find the first declaration of this function template. 1049eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne RedeclarableTemplateDecl *First = getCanonicalDecl(); 1059eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne 1069eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne if (First->CommonOrPrev.isNull()) { 1076b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis CommonBase *CommonPtr = First->newCommon(getASTContext()); 1089eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne First->CommonOrPrev = CommonPtr; 1098a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne CommonPtr->Latest = First; 1109eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne } 1119eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne return First->CommonOrPrev.get<CommonBase*>(); 1129eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne} 1139eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne 1149eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne 1159eabebafc165a67812eacc184806e7bf34c5f0a5Peter CollingbourneRedeclarableTemplateDecl *RedeclarableTemplateDecl::getCanonicalDeclImpl() { 1169eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne RedeclarableTemplateDecl *Tmpl = this; 1179eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne while (Tmpl->getPreviousDeclaration()) 1189eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne Tmpl = Tmpl->getPreviousDeclaration(); 1199eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne return Tmpl; 1209eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne} 1219eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne 1228a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbournevoid RedeclarableTemplateDecl::setPreviousDeclarationImpl( 1238a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne RedeclarableTemplateDecl *Prev) { 1248a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne if (Prev) { 1258a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne CommonBase *Common = Prev->getCommonPtr(); 1268a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne Prev = Common->Latest; 1278a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne Common->Latest = this; 1288a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne CommonOrPrev = Prev; 1298a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne } else { 1308a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne assert(CommonOrPrev.is<CommonBase*>() && "Cannot reset TemplateDecl Prev"); 1318a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne } 1328a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne} 1338a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne 134f88718ea0ca0d64b7fd31d109f1d9ec769a9c45fPeter CollingbourneRedeclarableTemplateDecl *RedeclarableTemplateDecl::getNextRedeclaration() { 135f88718ea0ca0d64b7fd31d109f1d9ec769a9c45fPeter Collingbourne if (CommonOrPrev.is<RedeclarableTemplateDecl*>()) 136f88718ea0ca0d64b7fd31d109f1d9ec769a9c45fPeter Collingbourne return CommonOrPrev.get<RedeclarableTemplateDecl*>(); 137f88718ea0ca0d64b7fd31d109f1d9ec769a9c45fPeter Collingbourne CommonBase *Common = CommonOrPrev.get<CommonBase*>(); 138f88718ea0ca0d64b7fd31d109f1d9ec769a9c45fPeter Collingbourne return Common ? Common->Latest : this; 139f88718ea0ca0d64b7fd31d109f1d9ec769a9c45fPeter Collingbourne} 140f88718ea0ca0d64b7fd31d109f1d9ec769a9c45fPeter Collingbourne 1414048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbournetemplate <class EntryType> 1424048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbournetypename RedeclarableTemplateDecl::SpecEntryTraits<EntryType>::DeclType* 1434048590d5774fd4b08661b5cf59b6f90b62f283aPeter CollingbourneRedeclarableTemplateDecl::findSpecializationImpl( 1444048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne llvm::FoldingSet<EntryType> &Specs, 1454048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne const TemplateArgument *Args, unsigned NumArgs, 1464048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne void *&InsertPos) { 1474048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne typedef SpecEntryTraits<EntryType> SETraits; 1484048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne llvm::FoldingSetNodeID ID; 1494048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne EntryType::Profile(ID,Args,NumArgs, getASTContext()); 1504048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne EntryType *Entry = Specs.FindNodeOrInsertPos(ID, InsertPos); 1514048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne return Entry ? SETraits::getMostRecentDeclaration(Entry) : 0; 1524048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne} 1534048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne 1549eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne//===----------------------------------------------------------------------===// 155aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// FunctionTemplateDecl Implementation 156aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 157aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 1580054531488928a424666ac11fcdc6bcc5112de52Douglas Gregorvoid FunctionTemplateDecl::DeallocateCommon(void *Ptr) { 1590054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor static_cast<Common *>(Ptr)->~Common(); 1600054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor} 1610054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor 162aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorFunctionTemplateDecl *FunctionTemplateDecl::Create(ASTContext &C, 163aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor DeclContext *DC, 164aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor SourceLocation L, 165aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor DeclarationName Name, 166127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor TemplateParameterList *Params, 167aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor NamedDecl *Decl) { 168aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor return new (C) FunctionTemplateDecl(DC, L, Name, Params, Decl); 169aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor} 170aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 1716b5415196327fa8ef00f028ba175fafef1738ae1Argyrios KyrtzidisRedeclarableTemplateDecl::CommonBase * 1726b5415196327fa8ef00f028ba175fafef1738ae1Argyrios KyrtzidisFunctionTemplateDecl::newCommon(ASTContext &C) { 1736b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis Common *CommonPtr = new (C) Common; 1746b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis C.AddDeallocation(DeallocateCommon, CommonPtr); 1759eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne return CommonPtr; 1769eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne} 1779eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne 1782c853e401ca406d417eb916e867226050e7be06bArgyrios KyrtzidisFunctionDecl * 1792c853e401ca406d417eb916e867226050e7be06bArgyrios KyrtzidisFunctionTemplateDecl::findSpecialization(const TemplateArgument *Args, 1802c853e401ca406d417eb916e867226050e7be06bArgyrios Kyrtzidis unsigned NumArgs, void *&InsertPos) { 1814048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne return findSpecializationImpl(getSpecializations(), Args, NumArgs, InsertPos); 1822c853e401ca406d417eb916e867226050e7be06bArgyrios Kyrtzidis} 1832c853e401ca406d417eb916e867226050e7be06bArgyrios Kyrtzidis 184aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 185aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// ClassTemplateDecl Implementation 186aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 187aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 1880054531488928a424666ac11fcdc6bcc5112de52Douglas Gregorvoid ClassTemplateDecl::DeallocateCommon(void *Ptr) { 1890054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor static_cast<Common *>(Ptr)->~Common(); 1900054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor} 1910054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor 1928731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios KyrtzidisClassTemplateDecl *ClassTemplateDecl::Create(ASTContext &C, 1938731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis DeclContext *DC, 1948731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis SourceLocation L, 1958731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis DeclarationName Name, 1968731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis TemplateParameterList *Params, 1978731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis NamedDecl *Decl, 1988731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis ClassTemplateDecl *PrevDecl) { 1998731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis ClassTemplateDecl *New = new (C) ClassTemplateDecl(DC, L, Name, Params, Decl); 2005bf1bdc2fedb0c29b5fcdb4abc852aa85b4fe26aArgyrios Kyrtzidis New->setPreviousDeclaration(PrevDecl); 2018731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis return New; 2025953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor} 2035953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor 204c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregorvoid ClassTemplateDecl::LoadLazySpecializations() { 205c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor Common *CommonPtr = getCommonPtr(); 206c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor if (CommonPtr->LazySpecializations) { 207c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor ASTContext &Context = getASTContext(); 208c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor uint32_t *Specs = CommonPtr->LazySpecializations; 209c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor CommonPtr->LazySpecializations = 0; 210c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor for (uint32_t I = 0, N = *Specs++; I != N; ++I) 211c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor (void)Context.getExternalSource()->GetExternalDecl(Specs[I]); 212c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor } 213c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor} 214c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor 215c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregorllvm::FoldingSet<ClassTemplateSpecializationDecl> & 216c8e5cf8f725e111965debb7130ef7466c0c73884Douglas GregorClassTemplateDecl::getSpecializations() { 217c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor LoadLazySpecializations(); 218c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor return getCommonPtr()->Specializations; 219c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor} 220c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor 221c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregorllvm::FoldingSet<ClassTemplatePartialSpecializationDecl> & 222c8e5cf8f725e111965debb7130ef7466c0c73884Douglas GregorClassTemplateDecl::getPartialSpecializations() { 223c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor LoadLazySpecializations(); 224c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor return getCommonPtr()->PartialSpecializations; 225c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor} 226c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor 2276b5415196327fa8ef00f028ba175fafef1738ae1Argyrios KyrtzidisRedeclarableTemplateDecl::CommonBase * 2286b5415196327fa8ef00f028ba175fafef1738ae1Argyrios KyrtzidisClassTemplateDecl::newCommon(ASTContext &C) { 2296b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis Common *CommonPtr = new (C) Common; 2306b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis C.AddDeallocation(DeallocateCommon, CommonPtr); 2319eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne return CommonPtr; 2329eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne} 2339eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne 234cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplateSpecializationDecl * 235cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplateDecl::findSpecialization(const TemplateArgument *Args, 236cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis unsigned NumArgs, void *&InsertPos) { 2374048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne return findSpecializationImpl(getSpecializations(), Args, NumArgs, InsertPos); 238cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis} 239cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis 240bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidisvoid ClassTemplateDecl::AddSpecialization(ClassTemplateSpecializationDecl *D, 241bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis void *InsertPos) { 242bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis getSpecializations().InsertNode(D, InsertPos); 243bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis if (ASTMutationListener *L = getASTMutationListener()) 244bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis L->AddedCXXTemplateSpecialization(this, D); 245bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis} 246bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis 247cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplatePartialSpecializationDecl * 248cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplateDecl::findPartialSpecialization(const TemplateArgument *Args, 249cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis unsigned NumArgs, 250cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis void *&InsertPos) { 2514048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne return findSpecializationImpl(getPartialSpecializations(), Args, NumArgs, 2524048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne InsertPos); 253cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis} 254cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis 255bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidisvoid ClassTemplateDecl::AddPartialSpecialization( 256bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis ClassTemplatePartialSpecializationDecl *D, 257bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis void *InsertPos) { 258bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis getPartialSpecializations().InsertNode(D, InsertPos); 259bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis if (ASTMutationListener *L = getASTMutationListener()) 260bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis L->AddedCXXTemplateSpecialization(this, D); 261bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis} 262bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis 263dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregorvoid ClassTemplateDecl::getPartialSpecializations( 264dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor llvm::SmallVectorImpl<ClassTemplatePartialSpecializationDecl *> &PS) { 265dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor llvm::FoldingSet<ClassTemplatePartialSpecializationDecl> &PartialSpecs 2665bf1bdc2fedb0c29b5fcdb4abc852aa85b4fe26aArgyrios Kyrtzidis = getPartialSpecializations(); 267dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor PS.clear(); 268dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor PS.resize(PartialSpecs.size()); 269dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor for (llvm::FoldingSet<ClassTemplatePartialSpecializationDecl>::iterator 270dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor P = PartialSpecs.begin(), PEnd = PartialSpecs.end(); 271dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor P != PEnd; ++P) { 272dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor assert(!PS[P->getSequenceNumber()]); 273cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis PS[P->getSequenceNumber()] = P->getMostRecentDeclaration(); 274dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor } 275dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor} 276dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor 277b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas GregorClassTemplatePartialSpecializationDecl * 278b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas GregorClassTemplateDecl::findPartialSpecialization(QualType T) { 279b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor ASTContext &Context = getASTContext(); 280b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor typedef llvm::FoldingSet<ClassTemplatePartialSpecializationDecl>::iterator 281b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor partial_spec_iterator; 282b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor for (partial_spec_iterator P = getPartialSpecializations().begin(), 283b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor PEnd = getPartialSpecializations().end(); 284b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor P != PEnd; ++P) { 28531f17ecbef57b5679c017c375db330546b7b5145John McCall if (Context.hasSameType(P->getInjectedSpecializationType(), T)) 286cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis return P->getMostRecentDeclaration(); 287cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis } 288cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis 289cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis return 0; 290cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis} 291cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis 292cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplatePartialSpecializationDecl * 293cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplateDecl::findPartialSpecInstantiatedFromMember( 294cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis ClassTemplatePartialSpecializationDecl *D) { 295cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis Decl *DCanon = D->getCanonicalDecl(); 296cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis for (llvm::FoldingSet<ClassTemplatePartialSpecializationDecl>::iterator 297cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis P = getPartialSpecializations().begin(), 298cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis PEnd = getPartialSpecializations().end(); 299cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis P != PEnd; ++P) { 300cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis if (P->getInstantiatedFromMember()->getCanonicalDecl() == DCanon) 301cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis return P->getMostRecentDeclaration(); 302b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor } 3031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 304b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor return 0; 305b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor} 306b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor 3073cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCallQualType 30824bae92f08ae098cc50a602d8cf1273b423e14daDouglas GregorClassTemplateDecl::getInjectedClassNameSpecialization() { 3095bf1bdc2fedb0c29b5fcdb4abc852aa85b4fe26aArgyrios Kyrtzidis Common *CommonPtr = getCommonPtr(); 3107da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor if (!CommonPtr->InjectedClassNameType.isNull()) 3117da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor return CommonPtr->InjectedClassNameType; 3127da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor 313b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor // C++0x [temp.dep.type]p2: 314b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor // The template argument list of a primary template is a template argument 315b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor // list in which the nth template argument has the value of the nth template 316b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor // parameter of the class template. If the nth template parameter is a 317b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor // template parameter pack (14.5.3), the nth template argument is a pack 318b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor // expansion (14.5.3) whose pattern is the name of the template parameter 319b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor // pack. 32024bae92f08ae098cc50a602d8cf1273b423e14daDouglas Gregor ASTContext &Context = getASTContext(); 3217da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor TemplateParameterList *Params = getTemplateParameters(); 3227da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor llvm::SmallVector<TemplateArgument, 16> TemplateArgs; 3237da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor TemplateArgs.reserve(Params->size()); 3241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump for (TemplateParameterList::iterator Param = Params->begin(), 3251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump ParamEnd = Params->end(); 3267da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor Param != ParamEnd; ++Param) { 327b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor TemplateArgument Arg; 328b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(*Param)) { 329b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor QualType ArgType = Context.getTypeDeclType(TTP); 330b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor if (TTP->isParameterPack()) 331cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor ArgType = Context.getPackExpansionType(ArgType, 332cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor llvm::Optional<unsigned>()); 333b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor 334b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor Arg = TemplateArgument(ArgType); 3351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } else if (NonTypeTemplateParmDecl *NTTP = 3367da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor dyn_cast<NonTypeTemplateParmDecl>(*Param)) { 337b7de181d912690958e82c01f1b3d752d3d4ab43bChandler Carruth Expr *E = new (Context) DeclRefExpr(NTTP, 3386398235d7890a81b785ea5af3b6e66d86bf184ccDouglas Gregor NTTP->getType().getNonLValueExprType(Context), 339f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall Expr::getValueKindForType(NTTP->getType()), 3400da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor NTTP->getLocation()); 341b95cc97b2023d00cd3fbae8455bc9d728eab5e5dDouglas Gregor 342b95cc97b2023d00cd3fbae8455bc9d728eab5e5dDouglas Gregor if (NTTP->isParameterPack()) 343b95cc97b2023d00cd3fbae8455bc9d728eab5e5dDouglas Gregor E = new (Context) PackExpansionExpr(Context.DependentTy, E, 34467fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor NTTP->getLocation(), 34567fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor llvm::Optional<unsigned>()); 346b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor Arg = TemplateArgument(E); 3471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } else { 3487da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor TemplateTemplateParmDecl *TTP = cast<TemplateTemplateParmDecl>(*Param); 3492be29f423acad3bbe39099a78db2805acb5bdf17Douglas Gregor if (TTP->isParameterPack()) 3502be29f423acad3bbe39099a78db2805acb5bdf17Douglas Gregor Arg = TemplateArgument(TemplateName(TTP), llvm::Optional<unsigned>()); 3512be29f423acad3bbe39099a78db2805acb5bdf17Douglas Gregor else 3522be29f423acad3bbe39099a78db2805acb5bdf17Douglas Gregor Arg = TemplateArgument(TemplateName(TTP)); 3537da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor } 354b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor 355203e6a322ae29d577acafcb1572a57ec16e1e730Douglas Gregor if ((*Param)->isTemplateParameterPack()) 356203e6a322ae29d577acafcb1572a57ec16e1e730Douglas Gregor Arg = TemplateArgument::CreatePackCopy(Context, &Arg, 1); 357b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor 358b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor TemplateArgs.push_back(Arg); 3597da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor } 3607da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor 3617da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor CommonPtr->InjectedClassNameType 3621275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor = Context.getTemplateSpecializationType(TemplateName(this), 3637da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor &TemplateArgs[0], 3641275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor TemplateArgs.size()); 3657da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor return CommonPtr->InjectedClassNameType; 3667da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor} 3677da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor 368aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 369aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// TemplateTypeParm Allocation/Deallocation Method Implementations 370aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 371aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 372aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorTemplateTypeParmDecl * 3734ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadTemplateTypeParmDecl::Create(const ASTContext &C, DeclContext *DC, 374aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor SourceLocation L, unsigned D, unsigned P, 3756d845ae1baf77691bca080e0762a1d45ee017f70Anders Carlsson IdentifierInfo *Id, bool Typename, 3766d845ae1baf77691bca080e0762a1d45ee017f70Anders Carlsson bool ParameterPack) { 377efed5c832de630715dd42211dd3b2aab5dd97a1bDouglas Gregor QualType Type = C.getTemplateTypeParmType(D, P, ParameterPack, Id); 378efed5c832de630715dd42211dd3b2aab5dd97a1bDouglas Gregor return new (C) TemplateTypeParmDecl(DC, L, Id, Typename, Type, ParameterPack); 379aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor} 380aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 381b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios KyrtzidisTemplateTypeParmDecl * 3824ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadTemplateTypeParmDecl::Create(const ASTContext &C, EmptyShell Empty) { 383b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios Kyrtzidis return new (C) TemplateTypeParmDecl(0, SourceLocation(), 0, false, 384b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios Kyrtzidis QualType(), false); 385b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios Kyrtzidis} 386b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios Kyrtzidis 387833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallSourceLocation TemplateTypeParmDecl::getDefaultArgumentLoc() const { 38877d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara return hasDefaultArgument() 38977d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara ? DefaultArgument->getTypeLoc().getBeginLoc() 39077d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara : SourceLocation(); 39177d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara} 39277d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara 39377d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo BagnaraSourceRange TemplateTypeParmDecl::getSourceRange() const { 39477d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara if (hasDefaultArgument() && !defaultArgumentWasInherited()) 39577d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara return SourceRange(getLocation(), 39677d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara DefaultArgument->getTypeLoc().getEndLoc()); 39777d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara else 39877d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara return SourceRange(getLocation()); 399833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall} 400833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 401ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregorunsigned TemplateTypeParmDecl::getDepth() const { 402ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor return TypeForDecl->getAs<TemplateTypeParmType>()->getDepth(); 403ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor} 404ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor 405ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregorunsigned TemplateTypeParmDecl::getIndex() const { 406ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor return TypeForDecl->getAs<TemplateTypeParmType>()->getIndex(); 407ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor} 408ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor 409aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 410aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// NonTypeTemplateParmDecl Method Implementations 411aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 412aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 4136952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas GregorNonTypeTemplateParmDecl::NonTypeTemplateParmDecl(DeclContext *DC, 4146952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor SourceLocation L, unsigned D, 4156952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor unsigned P, IdentifierInfo *Id, 4166952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor QualType T, 4176952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor TypeSourceInfo *TInfo, 4186952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor const QualType *ExpandedTypes, 4196952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor unsigned NumExpandedTypes, 4206952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor TypeSourceInfo **ExpandedTInfos) 42176a40219ee5624d78aba167dce02bdbaa930955fJohn McCall : DeclaratorDecl(NonTypeTemplateParm, DC, L, Id, T, TInfo), 4226952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor TemplateParmPosition(D, P), DefaultArgumentAndInherited(0, false), 4236952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor ParameterPack(true), ExpandedParameterPack(true), 4246952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor NumExpandedTypes(NumExpandedTypes) 4256952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor{ 4266952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor if (ExpandedTypes && ExpandedTInfos) { 4276952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor void **TypesAndInfos = reinterpret_cast<void **>(this + 1); 4286952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor for (unsigned I = 0; I != NumExpandedTypes; ++I) { 4296952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor TypesAndInfos[2*I] = ExpandedTypes[I].getAsOpaquePtr(); 4306952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor TypesAndInfos[2*I + 1] = ExpandedTInfos[I]; 4316952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor } 4326952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor } 4336952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor} 4346952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor 435aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorNonTypeTemplateParmDecl * 4364ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadNonTypeTemplateParmDecl::Create(const ASTContext &C, DeclContext *DC, 437aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor SourceLocation L, unsigned D, unsigned P, 438aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor IdentifierInfo *Id, QualType T, 43910738d36b150aa65206890c1c845cdba076e4200Douglas Gregor bool ParameterPack, TypeSourceInfo *TInfo) { 44010738d36b150aa65206890c1c845cdba076e4200Douglas Gregor return new (C) NonTypeTemplateParmDecl(DC, L, D, P, Id, T, ParameterPack, 44110738d36b150aa65206890c1c845cdba076e4200Douglas Gregor TInfo); 442aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor} 443aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 4446952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas GregorNonTypeTemplateParmDecl * 4456952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas GregorNonTypeTemplateParmDecl::Create(const ASTContext &C, DeclContext *DC, 4466952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor SourceLocation L, unsigned D, unsigned P, 4476952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor IdentifierInfo *Id, QualType T, 4486952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor TypeSourceInfo *TInfo, 4496952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor const QualType *ExpandedTypes, 4506952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor unsigned NumExpandedTypes, 4516952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor TypeSourceInfo **ExpandedTInfos) { 4526952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor unsigned Size = sizeof(NonTypeTemplateParmDecl) 4536952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor + NumExpandedTypes * 2 * sizeof(void*); 4546952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor void *Mem = C.Allocate(Size); 4556952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor return new (Mem) NonTypeTemplateParmDecl(DC, L, D, P, Id, T, TInfo, 4566952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor ExpandedTypes, NumExpandedTypes, 4576952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor ExpandedTInfos); 4586952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor} 4596952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor 460da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas GregorSourceLocation NonTypeTemplateParmDecl::getInnerLocStart() const { 461da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor SourceLocation Start = getTypeSpecStartLoc(); 462da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor if (Start.isInvalid()) 463da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor Start = getLocation(); 464da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor return Start; 465da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor} 466da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor 46776a40219ee5624d78aba167dce02bdbaa930955fJohn McCallSourceRange NonTypeTemplateParmDecl::getSourceRange() const { 468ee4bfd412db491c489fc2ee74916edd73f9c618aAbramo Bagnara SourceLocation End = getLocation(); 469ee4bfd412db491c489fc2ee74916edd73f9c618aAbramo Bagnara if (hasDefaultArgument() && !defaultArgumentWasInherited()) 470ee4bfd412db491c489fc2ee74916edd73f9c618aAbramo Bagnara End = getDefaultArgument()->getSourceRange().getEnd(); 471ee4bfd412db491c489fc2ee74916edd73f9c618aAbramo Bagnara return SourceRange(getOuterLocStart(), End); 47276a40219ee5624d78aba167dce02bdbaa930955fJohn McCall} 47376a40219ee5624d78aba167dce02bdbaa930955fJohn McCall 474d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas GregorSourceLocation NonTypeTemplateParmDecl::getDefaultArgumentLoc() const { 475d92f7a297c0ed3f7d0ebcbb557e1d4c1925b8c72Abramo Bagnara return hasDefaultArgument() 476d92f7a297c0ed3f7d0ebcbb557e1d4c1925b8c72Abramo Bagnara ? getDefaultArgument()->getSourceRange().getBegin() 477d92f7a297c0ed3f7d0ebcbb557e1d4c1925b8c72Abramo Bagnara : SourceLocation(); 478d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas Gregor} 479d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas Gregor 480aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 481aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// TemplateTemplateParmDecl Method Implementations 482aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 483aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 484aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorTemplateTemplateParmDecl * 4854ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadTemplateTemplateParmDecl::Create(const ASTContext &C, DeclContext *DC, 486aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor SourceLocation L, unsigned D, unsigned P, 48761c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor bool ParameterPack, IdentifierInfo *Id, 488aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor TemplateParameterList *Params) { 48961c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor return new (C) TemplateTemplateParmDecl(DC, L, D, P, ParameterPack, Id, 49061c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor Params); 491aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor} 492aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 4933e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor//===----------------------------------------------------------------------===// 4947e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor// TemplateArgumentList Implementation 4957e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor//===----------------------------------------------------------------------===// 496910f8008fea79120489a53593fe971b0b8a4a740Douglas GregorTemplateArgumentList * 497910f8008fea79120489a53593fe971b0b8a4a740Douglas GregorTemplateArgumentList::CreateCopy(ASTContext &Context, 498910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor const TemplateArgument *Args, 499910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor unsigned NumArgs) { 500910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor std::size_t Size = sizeof(TemplateArgumentList) 501910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor + NumArgs * sizeof(TemplateArgument); 502910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor void *Mem = Context.Allocate(Size); 503910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor TemplateArgument *StoredArgs 504910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor = reinterpret_cast<TemplateArgument *>( 505910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor static_cast<TemplateArgumentList *>(Mem) + 1); 506910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor std::uninitialized_copy(Args, Args + NumArgs, StoredArgs); 507910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor return new (Mem) TemplateArgumentList(StoredArgs, NumArgs, true); 50894d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis} 50994d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis 5107e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor//===----------------------------------------------------------------------===// 5113e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor// ClassTemplateSpecializationDecl Implementation 5123e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor//===----------------------------------------------------------------------===// 5133e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas GregorClassTemplateSpecializationDecl:: 51413c8577201e4fc0ddac5f09d05fd1778832137d1Douglas GregorClassTemplateSpecializationDecl(ASTContext &Context, Kind DK, TagKind TK, 5157e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor DeclContext *DC, SourceLocation L, 5163e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor ClassTemplateDecl *SpecializedTemplate, 517910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor const TemplateArgument *Args, 518910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor unsigned NumArgs, 5198e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor ClassTemplateSpecializationDecl *PrevDecl) 52013c8577201e4fc0ddac5f09d05fd1778832137d1Douglas Gregor : CXXRecordDecl(DK, TK, DC, L, 5218e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor SpecializedTemplate->getIdentifier(), 5228e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor PrevDecl), 5233e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor SpecializedTemplate(SpecializedTemplate), 524c98971d5c994caed9452aeadd0122c855e0f4de1Abramo Bagnara ExplicitInfo(0), 525910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor TemplateArgs(TemplateArgumentList::CreateCopy(Context, Args, NumArgs)), 5267e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor SpecializationKind(TSK_Undeclared) { 5273e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor} 5281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 52994d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios KyrtzidisClassTemplateSpecializationDecl::ClassTemplateSpecializationDecl(Kind DK) 53094d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis : CXXRecordDecl(DK, TTK_Struct, 0, SourceLocation(), 0, 0), 53194d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis ExplicitInfo(0), 53294d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis SpecializationKind(TSK_Undeclared) { 53394d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis} 53494d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis 5353e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas GregorClassTemplateSpecializationDecl * 53613c8577201e4fc0ddac5f09d05fd1778832137d1Douglas GregorClassTemplateSpecializationDecl::Create(ASTContext &Context, TagKind TK, 5373e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor DeclContext *DC, SourceLocation L, 5383e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor ClassTemplateDecl *SpecializedTemplate, 539910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor const TemplateArgument *Args, 540910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor unsigned NumArgs, 541cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor ClassTemplateSpecializationDecl *PrevDecl) { 542cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor ClassTemplateSpecializationDecl *Result 5431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump = new (Context)ClassTemplateSpecializationDecl(Context, 544c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor ClassTemplateSpecialization, 54513c8577201e4fc0ddac5f09d05fd1778832137d1Douglas Gregor TK, DC, L, 5467e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor SpecializedTemplate, 547910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor Args, NumArgs, 5488e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor PrevDecl); 549cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor Context.getTypeDeclType(Result, PrevDecl); 550cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor return Result; 5513e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor} 552c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor 55394d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios KyrtzidisClassTemplateSpecializationDecl * 554b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios KyrtzidisClassTemplateSpecializationDecl::Create(ASTContext &Context, EmptyShell Empty) { 55594d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis return 55694d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis new (Context)ClassTemplateSpecializationDecl(ClassTemplateSpecialization); 55794d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis} 55894d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis 559da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregorvoid 560da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas GregorClassTemplateSpecializationDecl::getNameForDiagnostic(std::string &S, 561da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor const PrintingPolicy &Policy, 562da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor bool Qualified) const { 563da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor NamedDecl::getNameForDiagnostic(S, Policy, Qualified); 564da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor 565da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor const TemplateArgumentList &TemplateArgs = getTemplateArgs(); 566da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor S += TemplateSpecializationType::PrintTemplateArgumentList( 567da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor TemplateArgs.data(), 568da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor TemplateArgs.size(), 569da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor Policy); 570da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor} 571da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor 57237d93e9252026d4fb836d9c05d0122a2d46e56beDouglas GregorClassTemplateDecl * 5731eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpClassTemplateSpecializationDecl::getSpecializedTemplate() const { 5741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (SpecializedPartialSpecialization *PartialSpec 57537d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor = SpecializedTemplate.dyn_cast<SpecializedPartialSpecialization*>()) 57637d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor return PartialSpec->PartialSpecialization->getSpecializedTemplate(); 57737d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor return SpecializedTemplate.get<ClassTemplateDecl*>(); 57837d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor} 57937d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor 580c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor//===----------------------------------------------------------------------===// 581c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor// ClassTemplatePartialSpecializationDecl Implementation 582c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor//===----------------------------------------------------------------------===// 583c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas GregorClassTemplatePartialSpecializationDecl * 584c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas GregorClassTemplatePartialSpecializationDecl:: 58513c8577201e4fc0ddac5f09d05fd1778832137d1Douglas GregorCreate(ASTContext &Context, TagKind TK,DeclContext *DC, SourceLocation L, 586c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor TemplateParameterList *Params, 587c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor ClassTemplateDecl *SpecializedTemplate, 588910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor const TemplateArgument *Args, 589910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor unsigned NumArgs, 590d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall const TemplateArgumentListInfo &ArgInfos, 5913cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall QualType CanonInjectedType, 592dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor ClassTemplatePartialSpecializationDecl *PrevDecl, 593dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor unsigned SequenceNumber) { 594d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall unsigned N = ArgInfos.size(); 595833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateArgumentLoc *ClonedArgs = new (Context) TemplateArgumentLoc[N]; 596833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall for (unsigned I = 0; I != N; ++I) 597833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall ClonedArgs[I] = ArgInfos[I]; 598833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 599c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor ClassTemplatePartialSpecializationDecl *Result 60013c8577201e4fc0ddac5f09d05fd1778832137d1Douglas Gregor = new (Context)ClassTemplatePartialSpecializationDecl(Context, TK, 601c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor DC, L, Params, 602c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor SpecializedTemplate, 603910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor Args, NumArgs, 604833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall ClonedArgs, N, 605dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor PrevDecl, 606dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor SequenceNumber); 607c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor Result->setSpecializationKind(TSK_ExplicitSpecialization); 6083cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall 6093cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall Context.getInjectedClassNameType(Result, CanonInjectedType); 610c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor return Result; 611c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor} 612dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall 61394d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios KyrtzidisClassTemplatePartialSpecializationDecl * 614b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios KyrtzidisClassTemplatePartialSpecializationDecl::Create(ASTContext &Context, 615b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios Kyrtzidis EmptyShell Empty) { 61694d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis return new (Context)ClassTemplatePartialSpecializationDecl(); 61794d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis} 61894d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis 619dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall//===----------------------------------------------------------------------===// 620dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall// FriendTemplateDecl Implementation 621dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall//===----------------------------------------------------------------------===// 622dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall 623dd4a3b0065b9a7e7b00073df415a798886c090f3John McCallFriendTemplateDecl *FriendTemplateDecl::Create(ASTContext &Context, 624dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall DeclContext *DC, 625dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall SourceLocation L, 626dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall unsigned NParams, 627dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall TemplateParameterList **Params, 628dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall FriendUnion Friend, 629dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall SourceLocation FLoc) { 630dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall FriendTemplateDecl *Result 631dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall = new (Context) FriendTemplateDecl(DC, L, NParams, Params, Friend, FLoc); 632dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall return Result; 633dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall} 634554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis 635554e6aa2da082575514607c3639c246c04b3232aArgyrios KyrtzidisFriendTemplateDecl *FriendTemplateDecl::Create(ASTContext &Context, 636554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis EmptyShell Empty) { 637554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis return new (Context) FriendTemplateDecl(Empty); 638554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis} 639