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