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), 356964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith NumParams(NumParams), ContainsUnexpandedParameterPack(false) { 366964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith assert(this->NumParams == NumParams && "Too many template parameters"); 376964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith for (unsigned Idx = 0; Idx < NumParams; ++Idx) { 386964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith NamedDecl *P = Params[Idx]; 396964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith begin()[Idx] = P; 406964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith 416964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith if (!P->isTemplateParameterPack()) { 426964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith if (NonTypeTemplateParmDecl *NTTP = dyn_cast<NonTypeTemplateParmDecl>(P)) 436964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith if (NTTP->getType()->containsUnexpandedParameterPack()) 446964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith ContainsUnexpandedParameterPack = true; 456964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith 466964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith if (TemplateTemplateParmDecl *TTP = dyn_cast<TemplateTemplateParmDecl>(P)) 476964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith if (TTP->getTemplateParameters()->containsUnexpandedParameterPack()) 486964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith ContainsUnexpandedParameterPack = true; 496964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith 506964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith // FIXME: If a default argument contains an unexpanded parameter pack, the 516964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith // template parameter list does too. 526964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith } 536964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith } 54aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor} 55aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 56aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorTemplateParameterList * 574ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadTemplateParameterList::Create(const ASTContext &C, SourceLocation TemplateLoc, 58bf4ea56cdc376cef5a12abf6bf18dc34805c2226Douglas Gregor SourceLocation LAngleLoc, NamedDecl **Params, 59ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas Gregor unsigned NumParams, SourceLocation RAngleLoc) { 60bf4ea56cdc376cef5a12abf6bf18dc34805c2226Douglas Gregor unsigned Size = sizeof(TemplateParameterList) 61bf4ea56cdc376cef5a12abf6bf18dc34805c2226Douglas Gregor + sizeof(NamedDecl *) * NumParams; 621a30edb995924b007044ca7abd97d7fbea22007fRichard Smith unsigned Align = std::max(llvm::alignOf<TemplateParameterList>(), 631a30edb995924b007044ca7abd97d7fbea22007fRichard Smith llvm::alignOf<NamedDecl*>()); 64aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor void *Mem = C.Allocate(Size, Align); 651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return new (Mem) TemplateParameterList(TemplateLoc, LAngleLoc, Params, 66ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas Gregor NumParams, RAngleLoc); 67aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor} 68aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 6962cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregorunsigned TemplateParameterList::getMinRequiredArguments() const { 706952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor unsigned NumRequiredArgs = 0; 716952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor for (iterator P = const_cast<TemplateParameterList *>(this)->begin(), 726952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor PEnd = const_cast<TemplateParameterList *>(this)->end(); 736952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor P != PEnd; ++P) { 746952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor if ((*P)->isTemplateParameterPack()) { 756952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor if (NonTypeTemplateParmDecl *NTTP = dyn_cast<NonTypeTemplateParmDecl>(*P)) 766952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor if (NTTP->isExpandedParameterPack()) { 776952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor NumRequiredArgs += NTTP->getNumExpansionTypes(); 786952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor continue; 796952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor } 806952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor 8162cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor break; 826952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor } 836952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor 846952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(*P)) { 856952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor if (TTP->hasDefaultArgument()) 866952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor break; 876952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor } else if (NonTypeTemplateParmDecl *NTTP 886952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor = dyn_cast<NonTypeTemplateParmDecl>(*P)) { 896952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor if (NTTP->hasDefaultArgument()) 906952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor break; 916952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor } else if (cast<TemplateTemplateParmDecl>(*P)->hasDefaultArgument()) 926952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor break; 936952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor 946952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor ++NumRequiredArgs; 9562cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor } 966952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor 9762cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor return NumRequiredArgs; 9862cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor} 9962cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor 100ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregorunsigned TemplateParameterList::getDepth() const { 101ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor if (size() == 0) 102ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor return 0; 103ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor 104ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor const NamedDecl *FirstParm = getParam(0); 105ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor if (const TemplateTypeParmDecl *TTP 106ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor = dyn_cast<TemplateTypeParmDecl>(FirstParm)) 107ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor return TTP->getDepth(); 108ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor else if (const NonTypeTemplateParmDecl *NTTP 109ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor = dyn_cast<NonTypeTemplateParmDecl>(FirstParm)) 110ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor return NTTP->getDepth(); 111ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor else 112ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor return cast<TemplateTemplateParmDecl>(FirstParm)->getDepth(); 113ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor} 114ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor 115787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregorstatic void AdoptTemplateParameterList(TemplateParameterList *Params, 116787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor DeclContext *Owner) { 117787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor for (TemplateParameterList::iterator P = Params->begin(), 118787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor PEnd = Params->end(); 119787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor P != PEnd; ++P) { 120787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor (*P)->setDeclContext(Owner); 121787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor 122787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor if (TemplateTemplateParmDecl *TTP = dyn_cast<TemplateTemplateParmDecl>(*P)) 123787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor AdoptTemplateParameterList(TTP->getTemplateParameters(), Owner); 124787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor } 125787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor} 126787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor 127aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 1289eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne// RedeclarableTemplateDecl Implementation 1299eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne//===----------------------------------------------------------------------===// 1309eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne 1319eabebafc165a67812eacc184806e7bf34c5f0a5Peter CollingbourneRedeclarableTemplateDecl::CommonBase *RedeclarableTemplateDecl::getCommonPtr() { 1327c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor if (!Common) { 1337c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor // Walk the previous-declaration chain until we either find a declaration 1347c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor // with a common pointer or we run out of previous declarations. 1357c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor llvm::SmallVector<RedeclarableTemplateDecl *, 2> PrevDecls; 136ef96ee0be5f100789f451641542a69cd719144d2Douglas Gregor for (RedeclarableTemplateDecl *Prev = getPreviousDecl(); Prev; 137ef96ee0be5f100789f451641542a69cd719144d2Douglas Gregor Prev = Prev->getPreviousDecl()) { 1387c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor if (Prev->Common) { 1397c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor Common = Prev->Common; 1407c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor break; 1417c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor } 1427c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor 1437c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor PrevDecls.push_back(Prev); 1447c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor } 1459eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne 1467c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor // If we never found a common pointer, allocate one now. 1478a8950b13e4d438f732d24f22f63ebe1a9e0075eDouglas Gregor if (!Common) { 1488a8950b13e4d438f732d24f22f63ebe1a9e0075eDouglas Gregor // FIXME: If any of the declarations is from an AST file, we probably 1498a8950b13e4d438f732d24f22f63ebe1a9e0075eDouglas Gregor // need an update record to add the common data. 1508a8950b13e4d438f732d24f22f63ebe1a9e0075eDouglas Gregor 1517c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor Common = newCommon(getASTContext()); 1528a8950b13e4d438f732d24f22f63ebe1a9e0075eDouglas Gregor } 1537c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor 1547c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor // Update any previous declarations we saw with the common pointer. 1557c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor for (unsigned I = 0, N = PrevDecls.size(); I != N; ++I) 1567c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor PrevDecls[I]->Common = Common; 1578a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne } 1588a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne 1597c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor return Common; 160f88718ea0ca0d64b7fd31d109f1d9ec769a9c45fPeter Collingbourne} 161f88718ea0ca0d64b7fd31d109f1d9ec769a9c45fPeter Collingbourne 1624048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbournetemplate <class EntryType> 1634048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbournetypename RedeclarableTemplateDecl::SpecEntryTraits<EntryType>::DeclType* 1644048590d5774fd4b08661b5cf59b6f90b62f283aPeter CollingbourneRedeclarableTemplateDecl::findSpecializationImpl( 165d964d6380945e0505b623050fe6a3f428008fc2aChandler Carruth llvm::FoldingSetVector<EntryType> &Specs, 1664048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne const TemplateArgument *Args, unsigned NumArgs, 1674048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne void *&InsertPos) { 1684048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne typedef SpecEntryTraits<EntryType> SETraits; 1694048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne llvm::FoldingSetNodeID ID; 1704048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne EntryType::Profile(ID,Args,NumArgs, getASTContext()); 1714048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne EntryType *Entry = Specs.FindNodeOrInsertPos(ID, InsertPos); 172ef96ee0be5f100789f451641542a69cd719144d2Douglas Gregor return Entry ? SETraits::getMostRecentDecl(Entry) : 0; 1734048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne} 1744048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne 175c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor/// \brief Generate the injected template arguments for the given template 176c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor/// parameter list, e.g., for the injected-class-name of a class template. 177c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregorstatic void GenerateInjectedTemplateArgs(ASTContext &Context, 178c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor TemplateParameterList *Params, 179c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor TemplateArgument *Args) { 180c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor for (TemplateParameterList::iterator Param = Params->begin(), 181c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor ParamEnd = Params->end(); 182c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor Param != ParamEnd; ++Param) { 183c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor TemplateArgument Arg; 184c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(*Param)) { 185c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor QualType ArgType = Context.getTypeDeclType(TTP); 186c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor if (TTP->isParameterPack()) 187c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor ArgType = Context.getPackExpansionType(ArgType, 188c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor llvm::Optional<unsigned>()); 189c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor 190c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor Arg = TemplateArgument(ArgType); 191c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor } else if (NonTypeTemplateParmDecl *NTTP = 192c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor dyn_cast<NonTypeTemplateParmDecl>(*Param)) { 193f4b88a45902af1802a1cb42ba48b1c474474f228John McCall Expr *E = new (Context) DeclRefExpr(NTTP, /*enclosing*/ false, 194c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor NTTP->getType().getNonLValueExprType(Context), 195c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor Expr::getValueKindForType(NTTP->getType()), 196c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor NTTP->getLocation()); 197c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor 198c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor if (NTTP->isParameterPack()) 199c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor E = new (Context) PackExpansionExpr(Context.DependentTy, E, 200c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor NTTP->getLocation(), 201c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor llvm::Optional<unsigned>()); 202c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor Arg = TemplateArgument(E); 203c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor } else { 204c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor TemplateTemplateParmDecl *TTP = cast<TemplateTemplateParmDecl>(*Param); 205c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor if (TTP->isParameterPack()) 206c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor Arg = TemplateArgument(TemplateName(TTP), llvm::Optional<unsigned>()); 207c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor else 208c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor Arg = TemplateArgument(TemplateName(TTP)); 209c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor } 210c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor 211c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor if ((*Param)->isTemplateParameterPack()) 212c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor Arg = TemplateArgument::CreatePackCopy(Context, &Arg, 1); 213c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor 214c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor *Args++ = Arg; 215c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor } 216c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor} 217c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor 2189eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne//===----------------------------------------------------------------------===// 219aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// FunctionTemplateDecl Implementation 220aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 221aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 2220054531488928a424666ac11fcdc6bcc5112de52Douglas Gregorvoid FunctionTemplateDecl::DeallocateCommon(void *Ptr) { 2230054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor static_cast<Common *>(Ptr)->~Common(); 2240054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor} 2250054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor 226aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorFunctionTemplateDecl *FunctionTemplateDecl::Create(ASTContext &C, 227aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor DeclContext *DC, 228aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor SourceLocation L, 229aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor DeclarationName Name, 230127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor TemplateParameterList *Params, 231aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor NamedDecl *Decl) { 232787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor AdoptTemplateParameterList(Params, cast<DeclContext>(Decl)); 233aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor return new (C) FunctionTemplateDecl(DC, L, Name, Params, Decl); 234aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor} 235aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 2361e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorFunctionTemplateDecl *FunctionTemplateDecl::CreateDeserialized(ASTContext &C, 2371e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor unsigned ID) { 2381e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor void *Mem = AllocateDeserializedDecl(C, ID, sizeof(FunctionTemplateDecl)); 2391e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor return new (Mem) FunctionTemplateDecl(0, SourceLocation(), DeclarationName(), 2401e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor 0, 0); 2419a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor} 2429a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor 2436b5415196327fa8ef00f028ba175fafef1738ae1Argyrios KyrtzidisRedeclarableTemplateDecl::CommonBase * 2446b5415196327fa8ef00f028ba175fafef1738ae1Argyrios KyrtzidisFunctionTemplateDecl::newCommon(ASTContext &C) { 2456b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis Common *CommonPtr = new (C) Common; 2466b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis C.AddDeallocation(DeallocateCommon, CommonPtr); 2479eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne return CommonPtr; 2489eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne} 2499eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne 2502c853e401ca406d417eb916e867226050e7be06bArgyrios KyrtzidisFunctionDecl * 2512c853e401ca406d417eb916e867226050e7be06bArgyrios KyrtzidisFunctionTemplateDecl::findSpecialization(const TemplateArgument *Args, 2522c853e401ca406d417eb916e867226050e7be06bArgyrios Kyrtzidis unsigned NumArgs, void *&InsertPos) { 2534048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne return findSpecializationImpl(getSpecializations(), Args, NumArgs, InsertPos); 2542c853e401ca406d417eb916e867226050e7be06bArgyrios Kyrtzidis} 2552c853e401ca406d417eb916e867226050e7be06bArgyrios Kyrtzidis 2565bbcdbf36f8cf79d99703ef20848c55960065e43Sebastian Redlvoid FunctionTemplateDecl::addSpecialization( 2575bbcdbf36f8cf79d99703ef20848c55960065e43Sebastian Redl FunctionTemplateSpecializationInfo *Info, void *InsertPos) { 2581e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor if (InsertPos) 2591e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor getSpecializations().InsertNode(Info, InsertPos); 2601e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor else 2611e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor getSpecializations().GetOrInsertNode(Info); 2625bbcdbf36f8cf79d99703ef20848c55960065e43Sebastian Redl if (ASTMutationListener *L = getASTMutationListener()) 2635bbcdbf36f8cf79d99703ef20848c55960065e43Sebastian Redl L->AddedCXXTemplateSpecialization(this, Info->Function); 2645bbcdbf36f8cf79d99703ef20848c55960065e43Sebastian Redl} 2655bbcdbf36f8cf79d99703ef20848c55960065e43Sebastian Redl 266c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregorstd::pair<const TemplateArgument *, unsigned> 267c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas GregorFunctionTemplateDecl::getInjectedTemplateArgs() { 268c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor TemplateParameterList *Params = getTemplateParameters(); 269c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor Common *CommonPtr = getCommonPtr(); 270c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor if (!CommonPtr->InjectedArgs) { 271c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor CommonPtr->InjectedArgs 272c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor = new (getASTContext()) TemplateArgument [Params->size()]; 273c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor GenerateInjectedTemplateArgs(getASTContext(), Params, 274c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor CommonPtr->InjectedArgs); 275c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor } 276c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor 277c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor return std::make_pair(CommonPtr->InjectedArgs, Params->size()); 278c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor} 279c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor 280aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 281aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// ClassTemplateDecl Implementation 282aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 283aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 2840054531488928a424666ac11fcdc6bcc5112de52Douglas Gregorvoid ClassTemplateDecl::DeallocateCommon(void *Ptr) { 2850054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor static_cast<Common *>(Ptr)->~Common(); 2860054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor} 2870054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor 2888731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios KyrtzidisClassTemplateDecl *ClassTemplateDecl::Create(ASTContext &C, 2898731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis DeclContext *DC, 2908731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis SourceLocation L, 2918731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis DeclarationName Name, 2928731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis TemplateParameterList *Params, 2938731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis NamedDecl *Decl, 2948731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis ClassTemplateDecl *PrevDecl) { 295787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor AdoptTemplateParameterList(Params, cast<DeclContext>(Decl)); 2968731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis ClassTemplateDecl *New = new (C) ClassTemplateDecl(DC, L, Name, Params, Decl); 2975bf1bdc2fedb0c29b5fcdb4abc852aa85b4fe26aArgyrios Kyrtzidis New->setPreviousDeclaration(PrevDecl); 2988731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis return New; 2995953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor} 3005953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor 3011e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorClassTemplateDecl *ClassTemplateDecl::CreateDeserialized(ASTContext &C, 3021e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor unsigned ID) { 3031e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor void *Mem = AllocateDeserializedDecl(C, ID, sizeof(ClassTemplateDecl)); 3041e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor return new (Mem) ClassTemplateDecl(EmptyShell()); 3059a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor} 3069a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor 307c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregorvoid ClassTemplateDecl::LoadLazySpecializations() { 308c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor Common *CommonPtr = getCommonPtr(); 309c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor if (CommonPtr->LazySpecializations) { 310c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor ASTContext &Context = getASTContext(); 311c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor uint32_t *Specs = CommonPtr->LazySpecializations; 312c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor CommonPtr->LazySpecializations = 0; 313c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor for (uint32_t I = 0, N = *Specs++; I != N; ++I) 314c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor (void)Context.getExternalSource()->GetExternalDecl(Specs[I]); 315c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor } 316c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor} 317c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor 318d964d6380945e0505b623050fe6a3f428008fc2aChandler Carruthllvm::FoldingSetVector<ClassTemplateSpecializationDecl> & 319c8e5cf8f725e111965debb7130ef7466c0c73884Douglas GregorClassTemplateDecl::getSpecializations() { 320c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor LoadLazySpecializations(); 321c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor return getCommonPtr()->Specializations; 322c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor} 323c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor 324d964d6380945e0505b623050fe6a3f428008fc2aChandler Carruthllvm::FoldingSetVector<ClassTemplatePartialSpecializationDecl> & 325c8e5cf8f725e111965debb7130ef7466c0c73884Douglas GregorClassTemplateDecl::getPartialSpecializations() { 326c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor LoadLazySpecializations(); 327c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor return getCommonPtr()->PartialSpecializations; 328c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor} 329c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor 3306b5415196327fa8ef00f028ba175fafef1738ae1Argyrios KyrtzidisRedeclarableTemplateDecl::CommonBase * 3316b5415196327fa8ef00f028ba175fafef1738ae1Argyrios KyrtzidisClassTemplateDecl::newCommon(ASTContext &C) { 3326b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis Common *CommonPtr = new (C) Common; 3336b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis C.AddDeallocation(DeallocateCommon, CommonPtr); 3349eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne return CommonPtr; 3359eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne} 3369eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne 337cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplateSpecializationDecl * 338cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplateDecl::findSpecialization(const TemplateArgument *Args, 339cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis unsigned NumArgs, void *&InsertPos) { 3404048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne return findSpecializationImpl(getSpecializations(), Args, NumArgs, InsertPos); 341cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis} 342cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis 343bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidisvoid ClassTemplateDecl::AddSpecialization(ClassTemplateSpecializationDecl *D, 344bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis void *InsertPos) { 3451e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor if (InsertPos) 3461e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor getSpecializations().InsertNode(D, InsertPos); 3471e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor else { 3481e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor ClassTemplateSpecializationDecl *Existing 3491e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor = getSpecializations().GetOrInsertNode(D); 3501e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor (void)Existing; 3511e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor assert(Existing->isCanonicalDecl() && "Non-canonical specialization?"); 3521e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor } 353bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis if (ASTMutationListener *L = getASTMutationListener()) 354bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis L->AddedCXXTemplateSpecialization(this, D); 355bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis} 356bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis 357cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplatePartialSpecializationDecl * 358cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplateDecl::findPartialSpecialization(const TemplateArgument *Args, 359cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis unsigned NumArgs, 360cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis void *&InsertPos) { 3614048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne return findSpecializationImpl(getPartialSpecializations(), Args, NumArgs, 3624048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne InsertPos); 363cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis} 364cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis 365bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidisvoid ClassTemplateDecl::AddPartialSpecialization( 366bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis ClassTemplatePartialSpecializationDecl *D, 367bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis void *InsertPos) { 3681e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor if (InsertPos) 3691e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor getPartialSpecializations().InsertNode(D, InsertPos); 3701e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor else { 3711e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor ClassTemplatePartialSpecializationDecl *Existing 3721e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor = getPartialSpecializations().GetOrInsertNode(D); 3731e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor (void)Existing; 3741e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor assert(Existing->isCanonicalDecl() && "Non-canonical specialization?"); 3751e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor } 3761e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor 377bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis if (ASTMutationListener *L = getASTMutationListener()) 378bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis L->AddedCXXTemplateSpecialization(this, D); 379bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis} 380bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis 381dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregorvoid ClassTemplateDecl::getPartialSpecializations( 3825f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVectorImpl<ClassTemplatePartialSpecializationDecl *> &PS) { 383d964d6380945e0505b623050fe6a3f428008fc2aChandler Carruth llvm::FoldingSetVector<ClassTemplatePartialSpecializationDecl> &PartialSpecs 3845bf1bdc2fedb0c29b5fcdb4abc852aa85b4fe26aArgyrios Kyrtzidis = getPartialSpecializations(); 385dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor PS.clear(); 386dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor PS.resize(PartialSpecs.size()); 387d964d6380945e0505b623050fe6a3f428008fc2aChandler Carruth for (llvm::FoldingSetVector<ClassTemplatePartialSpecializationDecl>::iterator 388dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor P = PartialSpecs.begin(), PEnd = PartialSpecs.end(); 389dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor P != PEnd; ++P) { 390dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor assert(!PS[P->getSequenceNumber()]); 391ef96ee0be5f100789f451641542a69cd719144d2Douglas Gregor PS[P->getSequenceNumber()] = P->getMostRecentDecl(); 392dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor } 393dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor} 394dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor 395b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas GregorClassTemplatePartialSpecializationDecl * 396b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas GregorClassTemplateDecl::findPartialSpecialization(QualType T) { 397b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor ASTContext &Context = getASTContext(); 398d964d6380945e0505b623050fe6a3f428008fc2aChandler Carruth using llvm::FoldingSetVector; 399d964d6380945e0505b623050fe6a3f428008fc2aChandler Carruth typedef FoldingSetVector<ClassTemplatePartialSpecializationDecl>::iterator 400b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor partial_spec_iterator; 401b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor for (partial_spec_iterator P = getPartialSpecializations().begin(), 402b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor PEnd = getPartialSpecializations().end(); 403b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor P != PEnd; ++P) { 40431f17ecbef57b5679c017c375db330546b7b5145John McCall if (Context.hasSameType(P->getInjectedSpecializationType(), T)) 405ef96ee0be5f100789f451641542a69cd719144d2Douglas Gregor return P->getMostRecentDecl(); 406cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis } 407cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis 408cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis return 0; 409cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis} 410cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis 411cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplatePartialSpecializationDecl * 412cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplateDecl::findPartialSpecInstantiatedFromMember( 413cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis ClassTemplatePartialSpecializationDecl *D) { 414cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis Decl *DCanon = D->getCanonicalDecl(); 415d964d6380945e0505b623050fe6a3f428008fc2aChandler Carruth for (llvm::FoldingSetVector<ClassTemplatePartialSpecializationDecl>::iterator 416cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis P = getPartialSpecializations().begin(), 417cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis PEnd = getPartialSpecializations().end(); 418cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis P != PEnd; ++P) { 419cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis if (P->getInstantiatedFromMember()->getCanonicalDecl() == DCanon) 420ef96ee0be5f100789f451641542a69cd719144d2Douglas Gregor return P->getMostRecentDecl(); 421b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor } 4221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 423b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor return 0; 424b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor} 425b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor 4263cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCallQualType 42724bae92f08ae098cc50a602d8cf1273b423e14daDouglas GregorClassTemplateDecl::getInjectedClassNameSpecialization() { 4285bf1bdc2fedb0c29b5fcdb4abc852aa85b4fe26aArgyrios Kyrtzidis Common *CommonPtr = getCommonPtr(); 4297da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor if (!CommonPtr->InjectedClassNameType.isNull()) 4307da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor return CommonPtr->InjectedClassNameType; 4317da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor 432b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor // C++0x [temp.dep.type]p2: 433b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor // The template argument list of a primary template is a template argument 434b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor // list in which the nth template argument has the value of the nth template 435b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor // parameter of the class template. If the nth template parameter is a 436b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor // template parameter pack (14.5.3), the nth template argument is a pack 437b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor // expansion (14.5.3) whose pattern is the name of the template parameter 438b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor // pack. 43924bae92f08ae098cc50a602d8cf1273b423e14daDouglas Gregor ASTContext &Context = getASTContext(); 4407da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor TemplateParameterList *Params = getTemplateParameters(); 4415f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<TemplateArgument, 16> TemplateArgs; 442c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor TemplateArgs.resize(Params->size()); 443c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor GenerateInjectedTemplateArgs(getASTContext(), Params, TemplateArgs.data()); 4447da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor CommonPtr->InjectedClassNameType 4451275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor = Context.getTemplateSpecializationType(TemplateName(this), 4467da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor &TemplateArgs[0], 4471275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor TemplateArgs.size()); 4487da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor return CommonPtr->InjectedClassNameType; 4497da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor} 4507da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor 451aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 452aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// TemplateTypeParm Allocation/Deallocation Method Implementations 453aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 454aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 455aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorTemplateTypeParmDecl * 4564ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadTemplateTypeParmDecl::Create(const ASTContext &C, DeclContext *DC, 457344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara SourceLocation KeyLoc, SourceLocation NameLoc, 458344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara unsigned D, unsigned P, IdentifierInfo *Id, 459344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara bool Typename, bool ParameterPack) { 4604fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth TemplateTypeParmDecl *TTPDecl = 4614fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth new (C) TemplateTypeParmDecl(DC, KeyLoc, NameLoc, Id, Typename); 4624fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth QualType TTPType = C.getTemplateTypeParmType(D, P, ParameterPack, TTPDecl); 4634fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth TTPDecl->TypeForDecl = TTPType.getTypePtr(); 4644fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth return TTPDecl; 465aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor} 466aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 467b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios KyrtzidisTemplateTypeParmDecl * 4681e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorTemplateTypeParmDecl::CreateDeserialized(const ASTContext &C, unsigned ID) { 4691e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor void *Mem = AllocateDeserializedDecl(C, ID, sizeof(TemplateTypeParmDecl)); 4701e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor return new (Mem) TemplateTypeParmDecl(0, SourceLocation(), SourceLocation(), 4711e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor 0, false); 472b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios Kyrtzidis} 473b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios Kyrtzidis 474833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallSourceLocation TemplateTypeParmDecl::getDefaultArgumentLoc() const { 47577d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara return hasDefaultArgument() 47677d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara ? DefaultArgument->getTypeLoc().getBeginLoc() 47777d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara : SourceLocation(); 47877d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara} 47977d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara 48077d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo BagnaraSourceRange TemplateTypeParmDecl::getSourceRange() const { 48177d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara if (hasDefaultArgument() && !defaultArgumentWasInherited()) 482344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara return SourceRange(getLocStart(), 48377d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara DefaultArgument->getTypeLoc().getEndLoc()); 48477d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara else 485344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara return TypeDecl::getSourceRange(); 486833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall} 487833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 488ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregorunsigned TemplateTypeParmDecl::getDepth() const { 489ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor return TypeForDecl->getAs<TemplateTypeParmType>()->getDepth(); 490ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor} 491ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor 492ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregorunsigned TemplateTypeParmDecl::getIndex() const { 493ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor return TypeForDecl->getAs<TemplateTypeParmType>()->getIndex(); 494ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor} 495ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor 4964fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruthbool TemplateTypeParmDecl::isParameterPack() const { 4974fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth return TypeForDecl->getAs<TemplateTypeParmType>()->isParameterPack(); 4984fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth} 4994fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth 500aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 501aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// NonTypeTemplateParmDecl Method Implementations 502aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 503aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 5046952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas GregorNonTypeTemplateParmDecl::NonTypeTemplateParmDecl(DeclContext *DC, 505ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara SourceLocation StartLoc, 506ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara SourceLocation IdLoc, 507ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara unsigned D, unsigned P, 508ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara IdentifierInfo *Id, 5096952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor QualType T, 5106952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor TypeSourceInfo *TInfo, 5116952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor const QualType *ExpandedTypes, 5126952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor unsigned NumExpandedTypes, 5136952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor TypeSourceInfo **ExpandedTInfos) 514ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara : DeclaratorDecl(NonTypeTemplateParm, DC, IdLoc, Id, T, TInfo, StartLoc), 5156952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor TemplateParmPosition(D, P), DefaultArgumentAndInherited(0, false), 5166952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor ParameterPack(true), ExpandedParameterPack(true), 5176952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor NumExpandedTypes(NumExpandedTypes) 5186952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor{ 5196952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor if (ExpandedTypes && ExpandedTInfos) { 5206952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor void **TypesAndInfos = reinterpret_cast<void **>(this + 1); 5216952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor for (unsigned I = 0; I != NumExpandedTypes; ++I) { 5226952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor TypesAndInfos[2*I] = ExpandedTypes[I].getAsOpaquePtr(); 5236952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor TypesAndInfos[2*I + 1] = ExpandedTInfos[I]; 5246952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor } 5256952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor } 5266952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor} 5276952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor 528aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorNonTypeTemplateParmDecl * 5294ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadNonTypeTemplateParmDecl::Create(const ASTContext &C, DeclContext *DC, 530ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara SourceLocation StartLoc, SourceLocation IdLoc, 531ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara unsigned D, unsigned P, IdentifierInfo *Id, 532ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara QualType T, bool ParameterPack, 533ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara TypeSourceInfo *TInfo) { 534ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara return new (C) NonTypeTemplateParmDecl(DC, StartLoc, IdLoc, D, P, Id, 535ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara T, ParameterPack, TInfo); 536aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor} 537aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 5386952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas GregorNonTypeTemplateParmDecl * 5396952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas GregorNonTypeTemplateParmDecl::Create(const ASTContext &C, DeclContext *DC, 540ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara SourceLocation StartLoc, SourceLocation IdLoc, 541ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara unsigned D, unsigned P, 5426952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor IdentifierInfo *Id, QualType T, 5436952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor TypeSourceInfo *TInfo, 5446952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor const QualType *ExpandedTypes, 5456952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor unsigned NumExpandedTypes, 5466952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor TypeSourceInfo **ExpandedTInfos) { 5476952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor unsigned Size = sizeof(NonTypeTemplateParmDecl) 5486952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor + NumExpandedTypes * 2 * sizeof(void*); 5496952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor void *Mem = C.Allocate(Size); 550ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara return new (Mem) NonTypeTemplateParmDecl(DC, StartLoc, IdLoc, 551ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara D, P, Id, T, TInfo, 5526952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor ExpandedTypes, NumExpandedTypes, 5536952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor ExpandedTInfos); 5546952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor} 5556952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor 5561e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorNonTypeTemplateParmDecl * 5571e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorNonTypeTemplateParmDecl::CreateDeserialized(ASTContext &C, unsigned ID) { 5581e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor void *Mem = AllocateDeserializedDecl(C, ID, sizeof(NonTypeTemplateParmDecl)); 5591e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor return new (Mem) NonTypeTemplateParmDecl(0, SourceLocation(), 5601e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor SourceLocation(), 0, 0, 0, 5611e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor QualType(), false, 0); 5621e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor} 5631e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor 5641e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorNonTypeTemplateParmDecl * 5651e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorNonTypeTemplateParmDecl::CreateDeserialized(ASTContext &C, unsigned ID, 5661e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor unsigned NumExpandedTypes) { 5671e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor unsigned Size = sizeof(NonTypeTemplateParmDecl) 5681e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor + NumExpandedTypes * 2 * sizeof(void*); 5691e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor 5701e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor void *Mem = AllocateDeserializedDecl(C, ID, Size); 5711e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor return new (Mem) NonTypeTemplateParmDecl(0, SourceLocation(), 5721e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor SourceLocation(), 0, 0, 0, 5731e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor QualType(), 0, 0, NumExpandedTypes, 5741e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor 0); 5751e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor} 5761e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor 57776a40219ee5624d78aba167dce02bdbaa930955fJohn McCallSourceRange NonTypeTemplateParmDecl::getSourceRange() const { 578ee4bfd412db491c489fc2ee74916edd73f9c618aAbramo Bagnara if (hasDefaultArgument() && !defaultArgumentWasInherited()) 579a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara return SourceRange(getOuterLocStart(), 580a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara getDefaultArgument()->getSourceRange().getEnd()); 581a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara return DeclaratorDecl::getSourceRange(); 58276a40219ee5624d78aba167dce02bdbaa930955fJohn McCall} 58376a40219ee5624d78aba167dce02bdbaa930955fJohn McCall 584d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas GregorSourceLocation NonTypeTemplateParmDecl::getDefaultArgumentLoc() const { 585d92f7a297c0ed3f7d0ebcbb557e1d4c1925b8c72Abramo Bagnara return hasDefaultArgument() 586d92f7a297c0ed3f7d0ebcbb557e1d4c1925b8c72Abramo Bagnara ? getDefaultArgument()->getSourceRange().getBegin() 587d92f7a297c0ed3f7d0ebcbb557e1d4c1925b8c72Abramo Bagnara : SourceLocation(); 588d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas Gregor} 589d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas Gregor 590aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 591aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// TemplateTemplateParmDecl Method Implementations 592aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 593aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 59499ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid TemplateTemplateParmDecl::anchor() { } 59599ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie 5966964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard SmithTemplateTemplateParmDecl::TemplateTemplateParmDecl( 5976964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith DeclContext *DC, SourceLocation L, unsigned D, unsigned P, 5986964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith IdentifierInfo *Id, TemplateParameterList *Params, 5996964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith unsigned NumExpansions, TemplateParameterList * const *Expansions) 6006964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith : TemplateDecl(TemplateTemplateParm, DC, L, Id, Params), 6016964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith TemplateParmPosition(D, P), DefaultArgument(), 6026964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith DefaultArgumentWasInherited(false), ParameterPack(true), 6036964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith ExpandedParameterPack(true), NumExpandedParams(NumExpansions) { 6046964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith if (Expansions) 6056964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith std::memcpy(reinterpret_cast<void*>(this + 1), Expansions, 6066964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith sizeof(TemplateParameterList*) * NumExpandedParams); 6076964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith} 6086964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith 609aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorTemplateTemplateParmDecl * 6104ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadTemplateTemplateParmDecl::Create(const ASTContext &C, DeclContext *DC, 611aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor SourceLocation L, unsigned D, unsigned P, 61261c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor bool ParameterPack, IdentifierInfo *Id, 613aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor TemplateParameterList *Params) { 61461c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor return new (C) TemplateTemplateParmDecl(DC, L, D, P, ParameterPack, Id, 61561c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor Params); 616aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor} 617aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 6181e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorTemplateTemplateParmDecl * 6196964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard SmithTemplateTemplateParmDecl::Create(const ASTContext &C, DeclContext *DC, 6206964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith SourceLocation L, unsigned D, unsigned P, 6216964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith IdentifierInfo *Id, 6226964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith TemplateParameterList *Params, 6236964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith llvm::ArrayRef<TemplateParameterList*> Expansions) { 6246964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith void *Mem = C.Allocate(sizeof(TemplateTemplateParmDecl) + 6256964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith sizeof(TemplateParameterList*) * Expansions.size()); 6266964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith return new (Mem) TemplateTemplateParmDecl(DC, L, D, P, Id, Params, 6276964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith Expansions.size(), 6286964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith Expansions.data()); 6296964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith} 6306964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith 6316964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard SmithTemplateTemplateParmDecl * 6321e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorTemplateTemplateParmDecl::CreateDeserialized(ASTContext &C, unsigned ID) { 6331e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor void *Mem = AllocateDeserializedDecl(C, ID, sizeof(TemplateTemplateParmDecl)); 6341e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor return new (Mem) TemplateTemplateParmDecl(0, SourceLocation(), 0, 0, false, 6351e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor 0, 0); 6361e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor} 6371e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor 6386964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard SmithTemplateTemplateParmDecl * 6396964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard SmithTemplateTemplateParmDecl::CreateDeserialized(ASTContext &C, unsigned ID, 6406964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith unsigned NumExpansions) { 6416964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith unsigned Size = sizeof(TemplateTemplateParmDecl) + 6426964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith sizeof(TemplateParameterList*) * NumExpansions; 6436964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith void *Mem = AllocateDeserializedDecl(C, ID, Size); 6446964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith return new (Mem) TemplateTemplateParmDecl(0, SourceLocation(), 0, 0, 0, 0, 6456964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith NumExpansions, 0); 6466964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith} 6476964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith 6483e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor//===----------------------------------------------------------------------===// 6497e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor// TemplateArgumentList Implementation 6507e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor//===----------------------------------------------------------------------===// 651910f8008fea79120489a53593fe971b0b8a4a740Douglas GregorTemplateArgumentList * 652910f8008fea79120489a53593fe971b0b8a4a740Douglas GregorTemplateArgumentList::CreateCopy(ASTContext &Context, 653910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor const TemplateArgument *Args, 654910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor unsigned NumArgs) { 655910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor std::size_t Size = sizeof(TemplateArgumentList) 656910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor + NumArgs * sizeof(TemplateArgument); 657910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor void *Mem = Context.Allocate(Size); 658910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor TemplateArgument *StoredArgs 659910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor = reinterpret_cast<TemplateArgument *>( 660910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor static_cast<TemplateArgumentList *>(Mem) + 1); 661910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor std::uninitialized_copy(Args, Args + NumArgs, StoredArgs); 662910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor return new (Mem) TemplateArgumentList(StoredArgs, NumArgs, true); 66394d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis} 66494d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis 66571a7605977113c795edd44fcbd2302ad49506653Argyrios KyrtzidisFunctionTemplateSpecializationInfo * 66671a7605977113c795edd44fcbd2302ad49506653Argyrios KyrtzidisFunctionTemplateSpecializationInfo::Create(ASTContext &C, FunctionDecl *FD, 66771a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis FunctionTemplateDecl *Template, 66871a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis TemplateSpecializationKind TSK, 66971a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis const TemplateArgumentList *TemplateArgs, 67071a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis const TemplateArgumentListInfo *TemplateArgsAsWritten, 67171a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis SourceLocation POI) { 67271a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis const ASTTemplateArgumentListInfo *ArgsAsWritten = 0; 67371a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis if (TemplateArgsAsWritten) 67471a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis ArgsAsWritten = ASTTemplateArgumentListInfo::Create(C, 67571a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis *TemplateArgsAsWritten); 67671a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis 67771a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis return new (C) FunctionTemplateSpecializationInfo(FD, Template, TSK, 67871a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis TemplateArgs, 67971a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis ArgsAsWritten, 68071a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis POI); 68171a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis} 68271a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis 6837e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor//===----------------------------------------------------------------------===// 68499ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie// TemplateDecl Implementation 68599ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie//===----------------------------------------------------------------------===// 68699ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie 68799ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid TemplateDecl::anchor() { } 68899ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie 68999ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie//===----------------------------------------------------------------------===// 6903e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor// ClassTemplateSpecializationDecl Implementation 6913e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor//===----------------------------------------------------------------------===// 6923e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas GregorClassTemplateSpecializationDecl:: 69313c8577201e4fc0ddac5f09d05fd1778832137d1Douglas GregorClassTemplateSpecializationDecl(ASTContext &Context, Kind DK, TagKind TK, 694ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara DeclContext *DC, SourceLocation StartLoc, 695ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara SourceLocation IdLoc, 6963e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor ClassTemplateDecl *SpecializedTemplate, 697910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor const TemplateArgument *Args, 698910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor unsigned NumArgs, 6998e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor ClassTemplateSpecializationDecl *PrevDecl) 700ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara : CXXRecordDecl(DK, TK, DC, StartLoc, IdLoc, 7018e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor SpecializedTemplate->getIdentifier(), 7028e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor PrevDecl), 7033e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor SpecializedTemplate(SpecializedTemplate), 704c98971d5c994caed9452aeadd0122c855e0f4de1Abramo Bagnara ExplicitInfo(0), 705910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor TemplateArgs(TemplateArgumentList::CreateCopy(Context, Args, NumArgs)), 7067e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor SpecializationKind(TSK_Undeclared) { 7073e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor} 7081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 70994d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios KyrtzidisClassTemplateSpecializationDecl::ClassTemplateSpecializationDecl(Kind DK) 710ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara : CXXRecordDecl(DK, TTK_Struct, 0, SourceLocation(), SourceLocation(), 0, 0), 71194d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis ExplicitInfo(0), 71294d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis SpecializationKind(TSK_Undeclared) { 71394d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis} 71494d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis 7153e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas GregorClassTemplateSpecializationDecl * 71613c8577201e4fc0ddac5f09d05fd1778832137d1Douglas GregorClassTemplateSpecializationDecl::Create(ASTContext &Context, TagKind TK, 717ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara DeclContext *DC, 718ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara SourceLocation StartLoc, 719ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara SourceLocation IdLoc, 7203e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor ClassTemplateDecl *SpecializedTemplate, 721910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor const TemplateArgument *Args, 722910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor unsigned NumArgs, 723cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor ClassTemplateSpecializationDecl *PrevDecl) { 724cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor ClassTemplateSpecializationDecl *Result 7251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump = new (Context)ClassTemplateSpecializationDecl(Context, 726c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor ClassTemplateSpecialization, 727ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara TK, DC, StartLoc, IdLoc, 7287e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor SpecializedTemplate, 729910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor Args, NumArgs, 7308e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor PrevDecl); 731cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor Context.getTypeDeclType(Result, PrevDecl); 732cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor return Result; 7333e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor} 734c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor 73594d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios KyrtzidisClassTemplateSpecializationDecl * 7361e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorClassTemplateSpecializationDecl::CreateDeserialized(ASTContext &C, 7371e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor unsigned ID) { 7381e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor void *Mem = AllocateDeserializedDecl(C, ID, 7391e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor sizeof(ClassTemplateSpecializationDecl)); 7401e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor return new (Mem) ClassTemplateSpecializationDecl(ClassTemplateSpecialization); 74194d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis} 74294d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis 743da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregorvoid 744da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas GregorClassTemplateSpecializationDecl::getNameForDiagnostic(std::string &S, 745da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor const PrintingPolicy &Policy, 746da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor bool Qualified) const { 747da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor NamedDecl::getNameForDiagnostic(S, Policy, Qualified); 748da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor 749da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor const TemplateArgumentList &TemplateArgs = getTemplateArgs(); 750da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor S += TemplateSpecializationType::PrintTemplateArgumentList( 751da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor TemplateArgs.data(), 752da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor TemplateArgs.size(), 753da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor Policy); 754da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor} 755da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor 75637d93e9252026d4fb836d9c05d0122a2d46e56beDouglas GregorClassTemplateDecl * 7571eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpClassTemplateSpecializationDecl::getSpecializedTemplate() const { 7581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (SpecializedPartialSpecialization *PartialSpec 75937d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor = SpecializedTemplate.dyn_cast<SpecializedPartialSpecialization*>()) 76037d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor return PartialSpec->PartialSpecialization->getSpecializedTemplate(); 76137d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor return SpecializedTemplate.get<ClassTemplateDecl*>(); 76237d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor} 76337d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor 7644a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo BagnaraSourceRange 7654a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo BagnaraClassTemplateSpecializationDecl::getSourceRange() const { 76609d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara if (ExplicitInfo) { 76709d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara SourceLocation Begin = getExternLoc(); 76809d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara if (Begin.isInvalid()) 76909d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara Begin = getTemplateKeywordLoc(); 77009d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara SourceLocation End = getRBraceLoc(); 77109d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara if (End.isInvalid()) 77209d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara End = getTypeAsWritten()->getTypeLoc().getEndLoc(); 77309d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara return SourceRange(Begin, End); 77409d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara } 77509d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara else { 77609d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara // No explicit info available. 77709d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara llvm::PointerUnion<ClassTemplateDecl *, 77809d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara ClassTemplatePartialSpecializationDecl *> 77909d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara inst_from = getInstantiatedFrom(); 78009d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara if (inst_from.isNull()) 78109d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara return getSpecializedTemplate()->getSourceRange(); 78209d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara if (ClassTemplateDecl *ctd = inst_from.dyn_cast<ClassTemplateDecl*>()) 78309d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara return ctd->getSourceRange(); 78409d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara return inst_from.get<ClassTemplatePartialSpecializationDecl*>() 78509d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara ->getSourceRange(); 78609d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara } 7874a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo Bagnara} 7884a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo Bagnara 789c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor//===----------------------------------------------------------------------===// 790c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor// ClassTemplatePartialSpecializationDecl Implementation 791c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor//===----------------------------------------------------------------------===// 79299ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid ClassTemplatePartialSpecializationDecl::anchor() { } 79399ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie 7949a299e0575ce235f491014627c7267e2d2cd73deDouglas GregorClassTemplatePartialSpecializationDecl:: 7959a299e0575ce235f491014627c7267e2d2cd73deDouglas GregorClassTemplatePartialSpecializationDecl(ASTContext &Context, TagKind TK, 796ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara DeclContext *DC, 797ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara SourceLocation StartLoc, 798ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara SourceLocation IdLoc, 7999a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor TemplateParameterList *Params, 8009a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor ClassTemplateDecl *SpecializedTemplate, 8019a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor const TemplateArgument *Args, 8029a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor unsigned NumArgs, 8039a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor TemplateArgumentLoc *ArgInfos, 8049a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor unsigned NumArgInfos, 8059a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor ClassTemplatePartialSpecializationDecl *PrevDecl, 8069a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor unsigned SequenceNumber) 8079a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor : ClassTemplateSpecializationDecl(Context, 8089a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor ClassTemplatePartialSpecialization, 809ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara TK, DC, StartLoc, IdLoc, 810ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara SpecializedTemplate, 8119a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor Args, NumArgs, PrevDecl), 8129a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor TemplateParams(Params), ArgsAsWritten(ArgInfos), 8139a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor NumArgsAsWritten(NumArgInfos), SequenceNumber(SequenceNumber), 8149a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor InstantiatedFromMember(0, false) 8159a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor{ 816787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor AdoptTemplateParameterList(Params, this); 8179a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor} 8189a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor 819c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas GregorClassTemplatePartialSpecializationDecl * 820c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas GregorClassTemplatePartialSpecializationDecl:: 821ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo BagnaraCreate(ASTContext &Context, TagKind TK,DeclContext *DC, 822ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara SourceLocation StartLoc, SourceLocation IdLoc, 823c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor TemplateParameterList *Params, 824c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor ClassTemplateDecl *SpecializedTemplate, 825910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor const TemplateArgument *Args, 826910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor unsigned NumArgs, 827d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall const TemplateArgumentListInfo &ArgInfos, 8283cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall QualType CanonInjectedType, 829dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor ClassTemplatePartialSpecializationDecl *PrevDecl, 830dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor unsigned SequenceNumber) { 831d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall unsigned N = ArgInfos.size(); 832833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall TemplateArgumentLoc *ClonedArgs = new (Context) TemplateArgumentLoc[N]; 833833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall for (unsigned I = 0; I != N; ++I) 834833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall ClonedArgs[I] = ArgInfos[I]; 835833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 836c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor ClassTemplatePartialSpecializationDecl *Result 837ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara = new (Context)ClassTemplatePartialSpecializationDecl(Context, TK, DC, 838ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara StartLoc, IdLoc, 839ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara Params, 840c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor SpecializedTemplate, 841910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor Args, NumArgs, 842833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall ClonedArgs, N, 843dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor PrevDecl, 844dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor SequenceNumber); 845c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor Result->setSpecializationKind(TSK_ExplicitSpecialization); 8463cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall 8473cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall Context.getInjectedClassNameType(Result, CanonInjectedType); 848c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor return Result; 849c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor} 850dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall 85194d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios KyrtzidisClassTemplatePartialSpecializationDecl * 8521e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorClassTemplatePartialSpecializationDecl::CreateDeserialized(ASTContext &C, 8531e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor unsigned ID) { 8541e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor void *Mem = AllocateDeserializedDecl(C, ID, 8551e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor sizeof(ClassTemplatePartialSpecializationDecl)); 8561e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor return new (Mem) ClassTemplatePartialSpecializationDecl(); 85794d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis} 85894d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis 859dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall//===----------------------------------------------------------------------===// 860dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall// FriendTemplateDecl Implementation 861dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall//===----------------------------------------------------------------------===// 862dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall 86399ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid FriendTemplateDecl::anchor() { } 86499ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie 865dd4a3b0065b9a7e7b00073df415a798886c090f3John McCallFriendTemplateDecl *FriendTemplateDecl::Create(ASTContext &Context, 866dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall DeclContext *DC, 867dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall SourceLocation L, 868dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall unsigned NParams, 869dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall TemplateParameterList **Params, 870dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall FriendUnion Friend, 871dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall SourceLocation FLoc) { 872dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall FriendTemplateDecl *Result 873dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall = new (Context) FriendTemplateDecl(DC, L, NParams, Params, Friend, FLoc); 874dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall return Result; 875dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall} 876554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis 8771e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorFriendTemplateDecl *FriendTemplateDecl::CreateDeserialized(ASTContext &C, 8781e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor unsigned ID) { 8791e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor void *Mem = AllocateDeserializedDecl(C, ID, sizeof(FriendTemplateDecl)); 8801e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor return new (Mem) FriendTemplateDecl(EmptyShell()); 881554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis} 8823e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith 8833e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith//===----------------------------------------------------------------------===// 8843e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith// TypeAliasTemplateDecl Implementation 8853e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith//===----------------------------------------------------------------------===// 8863e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith 8873e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard SmithTypeAliasTemplateDecl *TypeAliasTemplateDecl::Create(ASTContext &C, 8883e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith DeclContext *DC, 8893e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith SourceLocation L, 8903e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith DeclarationName Name, 8913e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith TemplateParameterList *Params, 8923e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith NamedDecl *Decl) { 8933e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith AdoptTemplateParameterList(Params, DC); 8943e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith return new (C) TypeAliasTemplateDecl(DC, L, Name, Params, Decl); 8953e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith} 8963e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith 8971e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorTypeAliasTemplateDecl *TypeAliasTemplateDecl::CreateDeserialized(ASTContext &C, 8981e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor unsigned ID) { 8991e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor void *Mem = AllocateDeserializedDecl(C, ID, sizeof(TypeAliasTemplateDecl)); 9001e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor return new (Mem) TypeAliasTemplateDecl(0, SourceLocation(), DeclarationName(), 9011e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor 0, 0); 9023e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith} 9033e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith 9043e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smithvoid TypeAliasTemplateDecl::DeallocateCommon(void *Ptr) { 9053e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith static_cast<Common *>(Ptr)->~Common(); 9063e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith} 9073e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard SmithRedeclarableTemplateDecl::CommonBase * 9083e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard SmithTypeAliasTemplateDecl::newCommon(ASTContext &C) { 9093e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith Common *CommonPtr = new (C) Common; 9103e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith C.AddDeallocation(DeallocateCommon, CommonPtr); 9113e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith return CommonPtr; 9123e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith} 9133e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith 91499ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie//===----------------------------------------------------------------------===// 91599ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie// ClassScopeFunctionSpecializationDecl Implementation 91699ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie//===----------------------------------------------------------------------===// 91799ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie 91899ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid ClassScopeFunctionSpecializationDecl::anchor() { } 9191e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor 9201e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorClassScopeFunctionSpecializationDecl * 9211e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorClassScopeFunctionSpecializationDecl::CreateDeserialized(ASTContext &C, 9221e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor unsigned ID) { 9231e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor void *Mem = AllocateDeserializedDecl(C, ID, 9241e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor sizeof(ClassScopeFunctionSpecializationDecl)); 9256b02009359a462ffe633696a4441313b462e6566Nico Weber return new (Mem) ClassScopeFunctionSpecializationDecl(0, SourceLocation(), 0, 9266b02009359a462ffe633696a4441313b462e6566Nico Weber false, TemplateArgumentListInfo()); 9271e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor} 928