DeclTemplate.cpp revision 4ba2a17694148e16eaa8d3917f657ffcd3667be4
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 { 5362cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor unsigned NumRequiredArgs = size(); 541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump iterator Param = const_cast<TemplateParameterList *>(this)->end(), 5562cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor ParamBegin = const_cast<TemplateParameterList *>(this)->begin(); 5662cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor while (Param != ParamBegin) { 5762cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor --Param; 581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 590ceffb51b28b09db67404058c642dcb1f877f6e8Anders Carlsson if (!(*Param)->isTemplateParameterPack() && 601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump !(isa<TemplateTypeParmDecl>(*Param) && 6162cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor cast<TemplateTypeParmDecl>(*Param)->hasDefaultArgument()) && 6262cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor !(isa<NonTypeTemplateParmDecl>(*Param) && 6362cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor cast<NonTypeTemplateParmDecl>(*Param)->hasDefaultArgument()) && 6462cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor !(isa<TemplateTemplateParmDecl>(*Param) && 6562cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor cast<TemplateTemplateParmDecl>(*Param)->hasDefaultArgument())) 6662cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor break; 671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6862cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor --NumRequiredArgs; 6962cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor } 7062cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor 7162cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor return NumRequiredArgs; 7262cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor} 7362cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor 74ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregorunsigned TemplateParameterList::getDepth() const { 75ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor if (size() == 0) 76ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor return 0; 77ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor 78ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor const NamedDecl *FirstParm = getParam(0); 79ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor if (const TemplateTypeParmDecl *TTP 80ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor = dyn_cast<TemplateTypeParmDecl>(FirstParm)) 81ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor return TTP->getDepth(); 82ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor else if (const NonTypeTemplateParmDecl *NTTP 83ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor = dyn_cast<NonTypeTemplateParmDecl>(FirstParm)) 84ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor return NTTP->getDepth(); 85ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor else 86ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor return cast<TemplateTemplateParmDecl>(FirstParm)->getDepth(); 87ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor} 88ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor 89aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 909eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne// RedeclarableTemplateDecl Implementation 919eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne//===----------------------------------------------------------------------===// 929eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne 939eabebafc165a67812eacc184806e7bf34c5f0a5Peter CollingbourneRedeclarableTemplateDecl::CommonBase *RedeclarableTemplateDecl::getCommonPtr() { 949eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne // Find the first declaration of this function template. 959eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne RedeclarableTemplateDecl *First = getCanonicalDecl(); 969eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne 979eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne if (First->CommonOrPrev.isNull()) { 986b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis CommonBase *CommonPtr = First->newCommon(getASTContext()); 999eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne First->CommonOrPrev = CommonPtr; 1008a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne CommonPtr->Latest = First; 1019eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne } 1029eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne return First->CommonOrPrev.get<CommonBase*>(); 1039eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne} 1049eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne 1059eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne 1069eabebafc165a67812eacc184806e7bf34c5f0a5Peter CollingbourneRedeclarableTemplateDecl *RedeclarableTemplateDecl::getCanonicalDeclImpl() { 1079eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne RedeclarableTemplateDecl *Tmpl = this; 1089eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne while (Tmpl->getPreviousDeclaration()) 1099eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne Tmpl = Tmpl->getPreviousDeclaration(); 1109eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne return Tmpl; 1119eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne} 1129eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne 1138a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbournevoid RedeclarableTemplateDecl::setPreviousDeclarationImpl( 1148a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne RedeclarableTemplateDecl *Prev) { 1158a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne if (Prev) { 1168a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne CommonBase *Common = Prev->getCommonPtr(); 1178a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne Prev = Common->Latest; 1188a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne Common->Latest = this; 1198a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne CommonOrPrev = Prev; 1208a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne } else { 1218a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne assert(CommonOrPrev.is<CommonBase*>() && "Cannot reset TemplateDecl Prev"); 1228a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne } 1238a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne} 1248a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne 125f88718ea0ca0d64b7fd31d109f1d9ec769a9c45fPeter CollingbourneRedeclarableTemplateDecl *RedeclarableTemplateDecl::getNextRedeclaration() { 126f88718ea0ca0d64b7fd31d109f1d9ec769a9c45fPeter Collingbourne if (CommonOrPrev.is<RedeclarableTemplateDecl*>()) 127f88718ea0ca0d64b7fd31d109f1d9ec769a9c45fPeter Collingbourne return CommonOrPrev.get<RedeclarableTemplateDecl*>(); 128f88718ea0ca0d64b7fd31d109f1d9ec769a9c45fPeter Collingbourne CommonBase *Common = CommonOrPrev.get<CommonBase*>(); 129f88718ea0ca0d64b7fd31d109f1d9ec769a9c45fPeter Collingbourne return Common ? Common->Latest : this; 130f88718ea0ca0d64b7fd31d109f1d9ec769a9c45fPeter Collingbourne} 131f88718ea0ca0d64b7fd31d109f1d9ec769a9c45fPeter Collingbourne 1324048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbournetemplate <class EntryType> 1334048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbournetypename RedeclarableTemplateDecl::SpecEntryTraits<EntryType>::DeclType* 1344048590d5774fd4b08661b5cf59b6f90b62f283aPeter CollingbourneRedeclarableTemplateDecl::findSpecializationImpl( 1354048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne llvm::FoldingSet<EntryType> &Specs, 1364048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne const TemplateArgument *Args, unsigned NumArgs, 1374048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne void *&InsertPos) { 1384048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne typedef SpecEntryTraits<EntryType> SETraits; 1394048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne llvm::FoldingSetNodeID ID; 1404048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne EntryType::Profile(ID,Args,NumArgs, getASTContext()); 1414048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne EntryType *Entry = Specs.FindNodeOrInsertPos(ID, InsertPos); 1424048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne return Entry ? SETraits::getMostRecentDeclaration(Entry) : 0; 1434048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne} 1444048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne 1459eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne//===----------------------------------------------------------------------===// 146aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// FunctionTemplateDecl Implementation 147aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 148aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 1490054531488928a424666ac11fcdc6bcc5112de52Douglas Gregorvoid FunctionTemplateDecl::DeallocateCommon(void *Ptr) { 1500054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor static_cast<Common *>(Ptr)->~Common(); 1510054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor} 1520054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor 153aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorFunctionTemplateDecl *FunctionTemplateDecl::Create(ASTContext &C, 154aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor DeclContext *DC, 155aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor SourceLocation L, 156aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor DeclarationName Name, 157127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor TemplateParameterList *Params, 158aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor NamedDecl *Decl) { 159aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor return new (C) FunctionTemplateDecl(DC, L, Name, Params, Decl); 160aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor} 161aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 1626b5415196327fa8ef00f028ba175fafef1738ae1Argyrios KyrtzidisRedeclarableTemplateDecl::CommonBase * 1636b5415196327fa8ef00f028ba175fafef1738ae1Argyrios KyrtzidisFunctionTemplateDecl::newCommon(ASTContext &C) { 1646b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis Common *CommonPtr = new (C) Common; 1656b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis C.AddDeallocation(DeallocateCommon, CommonPtr); 1669eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne return CommonPtr; 1679eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne} 1689eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne 1692c853e401ca406d417eb916e867226050e7be06bArgyrios KyrtzidisFunctionDecl * 1702c853e401ca406d417eb916e867226050e7be06bArgyrios KyrtzidisFunctionTemplateDecl::findSpecialization(const TemplateArgument *Args, 1712c853e401ca406d417eb916e867226050e7be06bArgyrios Kyrtzidis unsigned NumArgs, void *&InsertPos) { 1724048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne return findSpecializationImpl(getSpecializations(), Args, NumArgs, InsertPos); 1732c853e401ca406d417eb916e867226050e7be06bArgyrios Kyrtzidis} 1742c853e401ca406d417eb916e867226050e7be06bArgyrios Kyrtzidis 175aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 176aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// ClassTemplateDecl Implementation 177aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 178aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 1790054531488928a424666ac11fcdc6bcc5112de52Douglas Gregorvoid ClassTemplateDecl::DeallocateCommon(void *Ptr) { 1800054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor static_cast<Common *>(Ptr)->~Common(); 1810054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor} 1820054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor 1838731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios KyrtzidisClassTemplateDecl *ClassTemplateDecl::Create(ASTContext &C, 1848731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis DeclContext *DC, 1858731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis SourceLocation L, 1868731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis DeclarationName Name, 1878731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis TemplateParameterList *Params, 1888731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis NamedDecl *Decl, 1898731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis ClassTemplateDecl *PrevDecl) { 1908731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis ClassTemplateDecl *New = new (C) ClassTemplateDecl(DC, L, Name, Params, Decl); 1915bf1bdc2fedb0c29b5fcdb4abc852aa85b4fe26aArgyrios Kyrtzidis New->setPreviousDeclaration(PrevDecl); 1928731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis return New; 1935953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor} 1945953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor 195c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregorvoid ClassTemplateDecl::LoadLazySpecializations() { 196c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor Common *CommonPtr = getCommonPtr(); 197c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor if (CommonPtr->LazySpecializations) { 198c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor ASTContext &Context = getASTContext(); 199c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor uint32_t *Specs = CommonPtr->LazySpecializations; 200c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor CommonPtr->LazySpecializations = 0; 201c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor for (uint32_t I = 0, N = *Specs++; I != N; ++I) 202c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor (void)Context.getExternalSource()->GetExternalDecl(Specs[I]); 203c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor } 204c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor} 205c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor 206c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregorllvm::FoldingSet<ClassTemplateSpecializationDecl> & 207c8e5cf8f725e111965debb7130ef7466c0c73884Douglas GregorClassTemplateDecl::getSpecializations() { 208c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor LoadLazySpecializations(); 209c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor return getCommonPtr()->Specializations; 210c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor} 211c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor 212c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregorllvm::FoldingSet<ClassTemplatePartialSpecializationDecl> & 213c8e5cf8f725e111965debb7130ef7466c0c73884Douglas GregorClassTemplateDecl::getPartialSpecializations() { 214c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor LoadLazySpecializations(); 215c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor return getCommonPtr()->PartialSpecializations; 216c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor} 217c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor 2186b5415196327fa8ef00f028ba175fafef1738ae1Argyrios KyrtzidisRedeclarableTemplateDecl::CommonBase * 2196b5415196327fa8ef00f028ba175fafef1738ae1Argyrios KyrtzidisClassTemplateDecl::newCommon(ASTContext &C) { 2206b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis Common *CommonPtr = new (C) Common; 2216b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis C.AddDeallocation(DeallocateCommon, CommonPtr); 2229eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne return CommonPtr; 2239eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne} 2249eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne 225cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplateSpecializationDecl * 226cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplateDecl::findSpecialization(const TemplateArgument *Args, 227cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis unsigned NumArgs, void *&InsertPos) { 2284048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne return findSpecializationImpl(getSpecializations(), Args, NumArgs, InsertPos); 229cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis} 230cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis 231bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidisvoid ClassTemplateDecl::AddSpecialization(ClassTemplateSpecializationDecl *D, 232bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis void *InsertPos) { 233bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis getSpecializations().InsertNode(D, InsertPos); 234bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis if (ASTMutationListener *L = getASTMutationListener()) 235bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis L->AddedCXXTemplateSpecialization(this, D); 236bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis} 237bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis 238cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplatePartialSpecializationDecl * 239cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplateDecl::findPartialSpecialization(const TemplateArgument *Args, 240cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis unsigned NumArgs, 241cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis void *&InsertPos) { 2424048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne return findSpecializationImpl(getPartialSpecializations(), Args, NumArgs, 2434048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne InsertPos); 244cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis} 245cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis 246bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidisvoid ClassTemplateDecl::AddPartialSpecialization( 247bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis ClassTemplatePartialSpecializationDecl *D, 248bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis void *InsertPos) { 249bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis getPartialSpecializations().InsertNode(D, InsertPos); 250bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis if (ASTMutationListener *L = getASTMutationListener()) 251bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis L->AddedCXXTemplateSpecialization(this, D); 252bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis} 253bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis 254dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregorvoid ClassTemplateDecl::getPartialSpecializations( 255dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor llvm::SmallVectorImpl<ClassTemplatePartialSpecializationDecl *> &PS) { 256dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor llvm::FoldingSet<ClassTemplatePartialSpecializationDecl> &PartialSpecs 2575bf1bdc2fedb0c29b5fcdb4abc852aa85b4fe26aArgyrios Kyrtzidis = getPartialSpecializations(); 258dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor PS.clear(); 259dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor PS.resize(PartialSpecs.size()); 260dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor for (llvm::FoldingSet<ClassTemplatePartialSpecializationDecl>::iterator 261dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor P = PartialSpecs.begin(), PEnd = PartialSpecs.end(); 262dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor P != PEnd; ++P) { 263dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor assert(!PS[P->getSequenceNumber()]); 264cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis PS[P->getSequenceNumber()] = P->getMostRecentDeclaration(); 265dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor } 266dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor} 267dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor 268b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas GregorClassTemplatePartialSpecializationDecl * 269b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas GregorClassTemplateDecl::findPartialSpecialization(QualType T) { 270b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor ASTContext &Context = getASTContext(); 271b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor typedef llvm::FoldingSet<ClassTemplatePartialSpecializationDecl>::iterator 272b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor partial_spec_iterator; 273b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor for (partial_spec_iterator P = getPartialSpecializations().begin(), 274b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor PEnd = getPartialSpecializations().end(); 275b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor P != PEnd; ++P) { 27631f17ecbef57b5679c017c375db330546b7b5145John McCall if (Context.hasSameType(P->getInjectedSpecializationType(), T)) 277cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis return P->getMostRecentDeclaration(); 278cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis } 279cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis 280cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis return 0; 281cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis} 282cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis 283cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplatePartialSpecializationDecl * 284cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplateDecl::findPartialSpecInstantiatedFromMember( 285cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis ClassTemplatePartialSpecializationDecl *D) { 286cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis Decl *DCanon = D->getCanonicalDecl(); 287cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis for (llvm::FoldingSet<ClassTemplatePartialSpecializationDecl>::iterator 288cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis P = getPartialSpecializations().begin(), 289cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis PEnd = getPartialSpecializations().end(); 290cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis P != PEnd; ++P) { 291cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis if (P->getInstantiatedFromMember()->getCanonicalDecl() == DCanon) 292cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis return P->getMostRecentDeclaration(); 293b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor } 2941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 295b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor return 0; 296b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor} 297b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor 2983cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCallQualType 29924bae92f08ae098cc50a602d8cf1273b423e14daDouglas GregorClassTemplateDecl::getInjectedClassNameSpecialization() { 3005bf1bdc2fedb0c29b5fcdb4abc852aa85b4fe26aArgyrios Kyrtzidis Common *CommonPtr = getCommonPtr(); 3017da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor if (!CommonPtr->InjectedClassNameType.isNull()) 3027da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor return CommonPtr->InjectedClassNameType; 3037da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor 304b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor // C++0x [temp.dep.type]p2: 305b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor // The template argument list of a primary template is a template argument 306b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor // list in which the nth template argument has the value of the nth template 307b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor // parameter of the class template. If the nth template parameter is a 308b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor // template parameter pack (14.5.3), the nth template argument is a pack 309b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor // expansion (14.5.3) whose pattern is the name of the template parameter 310b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor // pack. 31124bae92f08ae098cc50a602d8cf1273b423e14daDouglas Gregor ASTContext &Context = getASTContext(); 3127da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor TemplateParameterList *Params = getTemplateParameters(); 3137da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor llvm::SmallVector<TemplateArgument, 16> TemplateArgs; 3147da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor TemplateArgs.reserve(Params->size()); 3151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump for (TemplateParameterList::iterator Param = Params->begin(), 3161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump ParamEnd = Params->end(); 3177da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor Param != ParamEnd; ++Param) { 318b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor TemplateArgument Arg; 319b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(*Param)) { 320b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor QualType ArgType = Context.getTypeDeclType(TTP); 321b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor if (TTP->isParameterPack()) 322b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor ArgType = Context.getPackExpansionType(ArgType); 323b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor 324b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor Arg = TemplateArgument(ArgType); 3251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } else if (NonTypeTemplateParmDecl *NTTP = 3267da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor dyn_cast<NonTypeTemplateParmDecl>(*Param)) { 327b7de181d912690958e82c01f1b3d752d3d4ab43bChandler Carruth Expr *E = new (Context) DeclRefExpr(NTTP, 3286398235d7890a81b785ea5af3b6e66d86bf184ccDouglas Gregor NTTP->getType().getNonLValueExprType(Context), 329f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall Expr::getValueKindForType(NTTP->getType()), 3300da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor NTTP->getLocation()); 331b95cc97b2023d00cd3fbae8455bc9d728eab5e5dDouglas Gregor 332b95cc97b2023d00cd3fbae8455bc9d728eab5e5dDouglas Gregor if (NTTP->isParameterPack()) 333b95cc97b2023d00cd3fbae8455bc9d728eab5e5dDouglas Gregor E = new (Context) PackExpansionExpr(Context.DependentTy, E, 334b95cc97b2023d00cd3fbae8455bc9d728eab5e5dDouglas Gregor NTTP->getLocation()); 335b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor Arg = TemplateArgument(E); 3361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } else { 3377da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor TemplateTemplateParmDecl *TTP = cast<TemplateTemplateParmDecl>(*Param); 338ba68eca7582a62e3e2ff4b0eba1b2b73a6b80895Douglas Gregor Arg = TemplateArgument(TemplateName(TTP), TTP->isParameterPack()); 3397da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor } 340b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor 341203e6a322ae29d577acafcb1572a57ec16e1e730Douglas Gregor if ((*Param)->isTemplateParameterPack()) 342203e6a322ae29d577acafcb1572a57ec16e1e730Douglas Gregor Arg = TemplateArgument::CreatePackCopy(Context, &Arg, 1); 343b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor 344b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor TemplateArgs.push_back(Arg); 3457da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor } 3467da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor 3477da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor CommonPtr->InjectedClassNameType 3481275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor = Context.getTemplateSpecializationType(TemplateName(this), 3497da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor &TemplateArgs[0], 3501275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor TemplateArgs.size()); 3517da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor return CommonPtr->InjectedClassNameType; 3527da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor} 3537da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor 354aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 355aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// TemplateTypeParm Allocation/Deallocation Method Implementations 356aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 357aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 358aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorTemplateTypeParmDecl * 3594ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadTemplateTypeParmDecl::Create(const ASTContext &C, DeclContext *DC, 360aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor SourceLocation L, unsigned D, unsigned P, 3616d845ae1baf77691bca080e0762a1d45ee017f70Anders Carlsson IdentifierInfo *Id, bool Typename, 3626d845ae1baf77691bca080e0762a1d45ee017f70Anders Carlsson bool ParameterPack) { 363efed5c832de630715dd42211dd3b2aab5dd97a1bDouglas Gregor QualType Type = C.getTemplateTypeParmType(D, P, ParameterPack, Id); 364efed5c832de630715dd42211dd3b2aab5dd97a1bDouglas Gregor return new (C) TemplateTypeParmDecl(DC, L, Id, Typename, Type, ParameterPack); 365aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor} 366aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 367b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios KyrtzidisTemplateTypeParmDecl * 3684ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadTemplateTypeParmDecl::Create(const ASTContext &C, EmptyShell Empty) { 369b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios Kyrtzidis return new (C) TemplateTypeParmDecl(0, SourceLocation(), 0, false, 370b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios Kyrtzidis QualType(), false); 371b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios Kyrtzidis} 372b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios Kyrtzidis 373833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallSourceLocation TemplateTypeParmDecl::getDefaultArgumentLoc() const { 374bd054dba8a3023821f2a0951b0fae05e3522a7c9Abramo Bagnara return DefaultArgument->getTypeLoc().getSourceRange().getBegin(); 375833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall} 376833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 377ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregorunsigned TemplateTypeParmDecl::getDepth() const { 378ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor return TypeForDecl->getAs<TemplateTypeParmType>()->getDepth(); 379ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor} 380ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor 381ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregorunsigned TemplateTypeParmDecl::getIndex() const { 382ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor return TypeForDecl->getAs<TemplateTypeParmType>()->getIndex(); 383ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor} 384ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor 385aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 386aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// NonTypeTemplateParmDecl Method Implementations 387aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 388aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 389aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorNonTypeTemplateParmDecl * 3904ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadNonTypeTemplateParmDecl::Create(const ASTContext &C, DeclContext *DC, 391aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor SourceLocation L, unsigned D, unsigned P, 392aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor IdentifierInfo *Id, QualType T, 39310738d36b150aa65206890c1c845cdba076e4200Douglas Gregor bool ParameterPack, TypeSourceInfo *TInfo) { 39410738d36b150aa65206890c1c845cdba076e4200Douglas Gregor return new (C) NonTypeTemplateParmDecl(DC, L, D, P, Id, T, ParameterPack, 39510738d36b150aa65206890c1c845cdba076e4200Douglas Gregor TInfo); 396aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor} 397aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 398d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas GregorSourceLocation NonTypeTemplateParmDecl::getDefaultArgumentLoc() const { 399d92f7a297c0ed3f7d0ebcbb557e1d4c1925b8c72Abramo Bagnara return hasDefaultArgument() 400d92f7a297c0ed3f7d0ebcbb557e1d4c1925b8c72Abramo Bagnara ? getDefaultArgument()->getSourceRange().getBegin() 401d92f7a297c0ed3f7d0ebcbb557e1d4c1925b8c72Abramo Bagnara : SourceLocation(); 402d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas Gregor} 403d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas Gregor 404aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 405aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// TemplateTemplateParmDecl Method Implementations 406aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 407aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 408aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorTemplateTemplateParmDecl * 4094ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadTemplateTemplateParmDecl::Create(const ASTContext &C, DeclContext *DC, 410aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor SourceLocation L, unsigned D, unsigned P, 41161c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor bool ParameterPack, IdentifierInfo *Id, 412aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor TemplateParameterList *Params) { 41361c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor return new (C) TemplateTemplateParmDecl(DC, L, D, P, ParameterPack, Id, 41461c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor Params); 415aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor} 416aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 4173e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor//===----------------------------------------------------------------------===// 4187e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor// TemplateArgumentList Implementation 4197e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor//===----------------------------------------------------------------------===// 420910f8008fea79120489a53593fe971b0b8a4a740Douglas GregorTemplateArgumentList * 421910f8008fea79120489a53593fe971b0b8a4a740Douglas GregorTemplateArgumentList::CreateCopy(ASTContext &Context, 422910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor const TemplateArgument *Args, 423910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor unsigned NumArgs) { 424910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor std::size_t Size = sizeof(TemplateArgumentList) 425910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor + NumArgs * sizeof(TemplateArgument); 426910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor void *Mem = Context.Allocate(Size); 427910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor TemplateArgument *StoredArgs 428910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor = reinterpret_cast<TemplateArgument *>( 429910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor static_cast<TemplateArgumentList *>(Mem) + 1); 430910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor std::uninitialized_copy(Args, Args + NumArgs, StoredArgs); 431910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor return new (Mem) TemplateArgumentList(StoredArgs, NumArgs, true); 43294d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis} 43394d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis 4347e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor//===----------------------------------------------------------------------===// 4353e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor// ClassTemplateSpecializationDecl Implementation 4363e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor//===----------------------------------------------------------------------===// 4373e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas GregorClassTemplateSpecializationDecl:: 43813c8577201e4fc0ddac5f09d05fd1778832137d1Douglas GregorClassTemplateSpecializationDecl(ASTContext &Context, Kind DK, TagKind TK, 4397e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor DeclContext *DC, SourceLocation L, 4403e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor ClassTemplateDecl *SpecializedTemplate, 441910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor const TemplateArgument *Args, 442910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor unsigned NumArgs, 4438e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor ClassTemplateSpecializationDecl *PrevDecl) 44413c8577201e4fc0ddac5f09d05fd1778832137d1Douglas Gregor : CXXRecordDecl(DK, TK, DC, L, 4458e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor SpecializedTemplate->getIdentifier(), 4468e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor PrevDecl), 4473e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor SpecializedTemplate(SpecializedTemplate), 448c98971d5c994caed9452aeadd0122c855e0f4de1Abramo Bagnara ExplicitInfo(0), 449910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor TemplateArgs(TemplateArgumentList::CreateCopy(Context, Args, NumArgs)), 4507e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor SpecializationKind(TSK_Undeclared) { 4513e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor} 4521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 45394d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios KyrtzidisClassTemplateSpecializationDecl::ClassTemplateSpecializationDecl(Kind DK) 45494d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis : CXXRecordDecl(DK, TTK_Struct, 0, SourceLocation(), 0, 0), 45594d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis ExplicitInfo(0), 45694d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis SpecializationKind(TSK_Undeclared) { 45794d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis} 45894d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis 4593e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas GregorClassTemplateSpecializationDecl * 46013c8577201e4fc0ddac5f09d05fd1778832137d1Douglas GregorClassTemplateSpecializationDecl::Create(ASTContext &Context, TagKind TK, 4613e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor DeclContext *DC, SourceLocation L, 4623e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor ClassTemplateDecl *SpecializedTemplate, 463910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor const TemplateArgument *Args, 464910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor unsigned NumArgs, 465cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor ClassTemplateSpecializationDecl *PrevDecl) { 466cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor ClassTemplateSpecializationDecl *Result 4671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump = new (Context)ClassTemplateSpecializationDecl(Context, 468c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor ClassTemplateSpecialization, 46913c8577201e4fc0ddac5f09d05fd1778832137d1Douglas Gregor TK, DC, L, 4707e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor SpecializedTemplate, 471910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor Args, NumArgs, 4728e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor PrevDecl); 473cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor Context.getTypeDeclType(Result, PrevDecl); 474cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor return Result; 4753e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor} 476c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor 47794d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios KyrtzidisClassTemplateSpecializationDecl * 478b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios KyrtzidisClassTemplateSpecializationDecl::Create(ASTContext &Context, EmptyShell Empty) { 47994d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis return 48094d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis new (Context)ClassTemplateSpecializationDecl(ClassTemplateSpecialization); 48194d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis} 48294d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis 483136a6988960ac3aeb96f298da7a1a182db7217cdJohn McCallvoid 484136a6988960ac3aeb96f298da7a1a182db7217cdJohn McCallClassTemplateSpecializationDecl::getNameForDiagnostic(std::string &S, 485136a6988960ac3aeb96f298da7a1a182db7217cdJohn McCall const PrintingPolicy &Policy, 486136a6988960ac3aeb96f298da7a1a182db7217cdJohn McCall bool Qualified) const { 487136a6988960ac3aeb96f298da7a1a182db7217cdJohn McCall NamedDecl::getNameForDiagnostic(S, Policy, Qualified); 488136a6988960ac3aeb96f298da7a1a182db7217cdJohn McCall 489136a6988960ac3aeb96f298da7a1a182db7217cdJohn McCall const TemplateArgumentList &TemplateArgs = getTemplateArgs(); 490136a6988960ac3aeb96f298da7a1a182db7217cdJohn McCall S += TemplateSpecializationType::PrintTemplateArgumentList( 491910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor TemplateArgs.data(), 492910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor TemplateArgs.size(), 493136a6988960ac3aeb96f298da7a1a182db7217cdJohn McCall Policy); 494136a6988960ac3aeb96f298da7a1a182db7217cdJohn McCall} 495136a6988960ac3aeb96f298da7a1a182db7217cdJohn McCall 49637d93e9252026d4fb836d9c05d0122a2d46e56beDouglas GregorClassTemplateDecl * 4971eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpClassTemplateSpecializationDecl::getSpecializedTemplate() const { 4981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (SpecializedPartialSpecialization *PartialSpec 49937d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor = SpecializedTemplate.dyn_cast<SpecializedPartialSpecialization*>()) 50037d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor return PartialSpec->PartialSpecialization->getSpecializedTemplate(); 50137d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor return SpecializedTemplate.get<ClassTemplateDecl*>(); 50237d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor} 50337d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor 504c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor//===----------------------------------------------------------------------===// 505c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor// ClassTemplatePartialSpecializationDecl Implementation 506c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor//===----------------------------------------------------------------------===// 507c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas GregorClassTemplatePartialSpecializationDecl * 508c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas GregorClassTemplatePartialSpecializationDecl:: 50913c8577201e4fc0ddac5f09d05fd1778832137d1Douglas GregorCreate(ASTContext &Context, TagKind TK,DeclContext *DC, SourceLocation L, 510c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor TemplateParameterList *Params, 511c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor ClassTemplateDecl *SpecializedTemplate, 512910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor const TemplateArgument *Args, 513910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor unsigned NumArgs, 514d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall const TemplateArgumentListInfo &ArgInfos, 5153cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall QualType CanonInjectedType, 516dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor ClassTemplatePartialSpecializationDecl *PrevDecl, 517dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor unsigned SequenceNumber) { 518d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall unsigned N = ArgInfos.size(); 519833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateArgumentLoc *ClonedArgs = new (Context) TemplateArgumentLoc[N]; 520833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall for (unsigned I = 0; I != N; ++I) 521833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall ClonedArgs[I] = ArgInfos[I]; 522833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 523c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor ClassTemplatePartialSpecializationDecl *Result 52413c8577201e4fc0ddac5f09d05fd1778832137d1Douglas Gregor = new (Context)ClassTemplatePartialSpecializationDecl(Context, TK, 525c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor DC, L, Params, 526c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor SpecializedTemplate, 527910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor Args, NumArgs, 528833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall ClonedArgs, N, 529dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor PrevDecl, 530dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor SequenceNumber); 531c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor Result->setSpecializationKind(TSK_ExplicitSpecialization); 5323cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall 5333cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall Context.getInjectedClassNameType(Result, CanonInjectedType); 534c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor return Result; 535c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor} 536dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall 53794d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios KyrtzidisClassTemplatePartialSpecializationDecl * 538b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios KyrtzidisClassTemplatePartialSpecializationDecl::Create(ASTContext &Context, 539b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios Kyrtzidis EmptyShell Empty) { 54094d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis return new (Context)ClassTemplatePartialSpecializationDecl(); 54194d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis} 54294d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis 543dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall//===----------------------------------------------------------------------===// 544dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall// FriendTemplateDecl Implementation 545dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall//===----------------------------------------------------------------------===// 546dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall 547dd4a3b0065b9a7e7b00073df415a798886c090f3John McCallFriendTemplateDecl *FriendTemplateDecl::Create(ASTContext &Context, 548dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall DeclContext *DC, 549dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall SourceLocation L, 550dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall unsigned NParams, 551dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall TemplateParameterList **Params, 552dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall FriendUnion Friend, 553dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall SourceLocation FLoc) { 554dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall FriendTemplateDecl *Result 555dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall = new (Context) FriendTemplateDecl(DC, L, NParams, Params, Friend, FLoc); 556dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall return Result; 557dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall} 558554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis 559554e6aa2da082575514607c3639c246c04b3232aArgyrios KyrtzidisFriendTemplateDecl *FriendTemplateDecl::Create(ASTContext &Context, 560554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis EmptyShell Empty) { 561554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis return new (Context) FriendTemplateDecl(Empty); 562554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis} 563