DeclTemplate.cpp revision 0054531488928a424666ac11fcdc6bcc5112de52
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//===----------------------------------------------------------------------===//
87aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// TemplateDecl Implementation
88aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
89aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
90aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorTemplateDecl::~TemplateDecl() {
91aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor}
92aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
93aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
94aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// FunctionTemplateDecl Implementation
95aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
96aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
970054531488928a424666ac11fcdc6bcc5112de52Douglas Gregorvoid FunctionTemplateDecl::DeallocateCommon(void *Ptr) {
980054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor  static_cast<Common *>(Ptr)->~Common();
990054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor}
1000054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor
101aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorFunctionTemplateDecl *FunctionTemplateDecl::Create(ASTContext &C,
102aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                                   DeclContext *DC,
103aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                                   SourceLocation L,
104aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                                   DeclarationName Name,
105127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor                                               TemplateParameterList *Params,
106aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                                   NamedDecl *Decl) {
107aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor  return new (C) FunctionTemplateDecl(DC, L, Name, Params, Decl);
108aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor}
109aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
110127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregorvoid FunctionTemplateDecl::Destroy(ASTContext &C) {
111127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor  if (Common *CommonPtr = CommonOrPrev.dyn_cast<Common*>()) {
112127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor    for (llvm::FoldingSet<FunctionTemplateSpecializationInfo>::iterator
113127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor              Spec = CommonPtr->Specializations.begin(),
114127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor           SpecEnd = CommonPtr->Specializations.end();
115127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor         Spec != SpecEnd; ++Spec)
116127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor      C.Deallocate(&*Spec);
117127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor  }
1181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
119127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor  Decl::Destroy(C);
120127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor}
121127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor
122b57a4fe73b8227c0dba651818b8495dfca61e530Argyrios KyrtzidisFunctionTemplateDecl *FunctionTemplateDecl::getCanonicalDecl() {
123b57a4fe73b8227c0dba651818b8495dfca61e530Argyrios Kyrtzidis  FunctionTemplateDecl *FunTmpl = this;
124b57a4fe73b8227c0dba651818b8495dfca61e530Argyrios Kyrtzidis  while (FunTmpl->getPreviousDeclaration())
125b57a4fe73b8227c0dba651818b8495dfca61e530Argyrios Kyrtzidis    FunTmpl = FunTmpl->getPreviousDeclaration();
126b57a4fe73b8227c0dba651818b8495dfca61e530Argyrios Kyrtzidis  return FunTmpl;
127b57a4fe73b8227c0dba651818b8495dfca61e530Argyrios Kyrtzidis}
128b57a4fe73b8227c0dba651818b8495dfca61e530Argyrios Kyrtzidis
129127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas GregorFunctionTemplateDecl::Common *FunctionTemplateDecl::getCommonPtr() {
130127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor  // Find the first declaration of this function template.
131127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor  FunctionTemplateDecl *First = this;
132127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor  while (First->getPreviousDeclaration())
133127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor    First = First->getPreviousDeclaration();
1341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
135127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor  if (First->CommonOrPrev.isNull()) {
1360054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor    Common *CommonPtr = new (getASTContext()) Common;
1370054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor    getASTContext().AddDeallocation(DeallocateCommon, CommonPtr);
1380054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor    First->CommonOrPrev = CommonPtr;
139127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor  }
140127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor  return First->CommonOrPrev.get<Common*>();
141127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor}
142127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor
143aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
144aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// ClassTemplateDecl Implementation
145aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
146aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
1470054531488928a424666ac11fcdc6bcc5112de52Douglas Gregorvoid ClassTemplateDecl::DeallocateCommon(void *Ptr) {
1480054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor  static_cast<Common *>(Ptr)->~Common();
1490054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor}
1500054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor
151b57a4fe73b8227c0dba651818b8495dfca61e530Argyrios KyrtzidisClassTemplateDecl *ClassTemplateDecl::getCanonicalDecl() {
152b57a4fe73b8227c0dba651818b8495dfca61e530Argyrios Kyrtzidis  ClassTemplateDecl *Template = this;
153b57a4fe73b8227c0dba651818b8495dfca61e530Argyrios Kyrtzidis  while (Template->getPreviousDeclaration())
154b57a4fe73b8227c0dba651818b8495dfca61e530Argyrios Kyrtzidis    Template = Template->getPreviousDeclaration();
155b57a4fe73b8227c0dba651818b8495dfca61e530Argyrios Kyrtzidis  return Template;
156b57a4fe73b8227c0dba651818b8495dfca61e530Argyrios Kyrtzidis}
157b57a4fe73b8227c0dba651818b8495dfca61e530Argyrios Kyrtzidis
158aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorClassTemplateDecl *ClassTemplateDecl::Create(ASTContext &C,
159aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                             DeclContext *DC,
160aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                             SourceLocation L,
161aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                             DeclarationName Name,
162aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                             TemplateParameterList *Params,
1635953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor                                             NamedDecl *Decl,
1645953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor                                             ClassTemplateDecl *PrevDecl) {
1655953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor  Common *CommonPtr;
1665953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor  if (PrevDecl)
1675953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor    CommonPtr = PrevDecl->CommonPtr;
1680054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor  else {
1695953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor    CommonPtr = new (C) Common;
1700054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor    C.AddDeallocation(DeallocateCommon, CommonPtr);
1710054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor  }
1725953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor
1731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return new (C) ClassTemplateDecl(DC, L, Name, Params, Decl, PrevDecl,
1745953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor                                   CommonPtr);
1755953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor}
1765953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor
1775953d8b37f92f0cf548941f617c9b0a7703df33bDouglas GregorClassTemplateDecl::~ClassTemplateDecl() {
1785953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor  assert(CommonPtr == 0 && "ClassTemplateDecl must be explicitly destroyed");
1795953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor}
1805953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor
1815953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregorvoid ClassTemplateDecl::Destroy(ASTContext& C) {
1825953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor  if (!PreviousDeclaration) {
1835953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor    CommonPtr->~Common();
1845953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor    C.Deallocate((void*)CommonPtr);
1855953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor  }
1865953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor  CommonPtr = 0;
1875953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor
1885953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor  this->~ClassTemplateDecl();
1895953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor  C.Deallocate((void*)this);
190aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor}
191aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
192dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregorvoid ClassTemplateDecl::getPartialSpecializations(
193dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor          llvm::SmallVectorImpl<ClassTemplatePartialSpecializationDecl *> &PS) {
194dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor  llvm::FoldingSet<ClassTemplatePartialSpecializationDecl> &PartialSpecs
195dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor    = CommonPtr->PartialSpecializations;
196dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor  PS.clear();
197dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor  PS.resize(PartialSpecs.size());
198dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor  for (llvm::FoldingSet<ClassTemplatePartialSpecializationDecl>::iterator
199dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor       P = PartialSpecs.begin(), PEnd = PartialSpecs.end();
200dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor       P != PEnd; ++P) {
201dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor    assert(!PS[P->getSequenceNumber()]);
202dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor    PS[P->getSequenceNumber()] = &*P;
203dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor  }
204dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor}
205dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor
206b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas GregorClassTemplatePartialSpecializationDecl *
207b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas GregorClassTemplateDecl::findPartialSpecialization(QualType T) {
208b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor  ASTContext &Context = getASTContext();
209b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor  typedef llvm::FoldingSet<ClassTemplatePartialSpecializationDecl>::iterator
210b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor    partial_spec_iterator;
211b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor  for (partial_spec_iterator P = getPartialSpecializations().begin(),
212b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor                          PEnd = getPartialSpecializations().end();
213b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor       P != PEnd; ++P) {
21431f17ecbef57b5679c017c375db330546b7b5145John McCall    if (Context.hasSameType(P->getInjectedSpecializationType(), T))
215b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor      return &*P;
216b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor  }
2171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
218b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor  return 0;
219b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor}
220b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor
2213cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCallQualType
2223cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCallClassTemplateDecl::getInjectedClassNameSpecialization(ASTContext &Context) {
2237da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor  if (!CommonPtr->InjectedClassNameType.isNull())
2247da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor    return CommonPtr->InjectedClassNameType;
2257da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor
2267da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor  // FIXME: n2800 14.6.1p1 should say how the template arguments
2277da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor  // corresponding to template parameter packs should be pack
2287da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor  // expansions. We already say that in 14.6.2.1p2, so it would be
2297da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor  // better to fix that redundancy.
2307da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor
2317da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor  TemplateParameterList *Params = getTemplateParameters();
2327da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor  llvm::SmallVector<TemplateArgument, 16> TemplateArgs;
2337da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor  TemplateArgs.reserve(Params->size());
2341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  for (TemplateParameterList::iterator Param = Params->begin(),
2351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                    ParamEnd = Params->end();
2367da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor       Param != ParamEnd; ++Param) {
2377da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor    if (isa<TemplateTypeParmDecl>(*Param)) {
2387da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor      QualType ParamType = Context.getTypeDeclType(cast<TypeDecl>(*Param));
239833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall      TemplateArgs.push_back(TemplateArgument(ParamType));
2401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    } else if (NonTypeTemplateParmDecl *NTTP =
2417da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor                 dyn_cast<NonTypeTemplateParmDecl>(*Param)) {
242b7de181d912690958e82c01f1b3d752d3d4ab43bChandler Carruth      Expr *E = new (Context) DeclRefExpr(NTTP,
243b7de181d912690958e82c01f1b3d752d3d4ab43bChandler Carruth                                          NTTP->getType().getNonReferenceType(),
2440da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor                                          NTTP->getLocation());
2457da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor      TemplateArgs.push_back(TemplateArgument(E));
2461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    } else {
2477da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor      TemplateTemplateParmDecl *TTP = cast<TemplateTemplateParmDecl>(*Param);
248788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor      TemplateArgs.push_back(TemplateArgument(TemplateName(TTP)));
2497da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor    }
2507da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor  }
2517da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor
2527da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor  CommonPtr->InjectedClassNameType
2531275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor    = Context.getTemplateSpecializationType(TemplateName(this),
2547da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor                                            &TemplateArgs[0],
2551275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor                                            TemplateArgs.size());
2567da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor  return CommonPtr->InjectedClassNameType;
2577da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor}
2587da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor
259aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
260aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// TemplateTypeParm Allocation/Deallocation Method Implementations
261aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
262aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
263aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorTemplateTypeParmDecl *
264aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorTemplateTypeParmDecl::Create(ASTContext &C, DeclContext *DC,
265aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                             SourceLocation L, unsigned D, unsigned P,
2666d845ae1baf77691bca080e0762a1d45ee017f70Anders Carlsson                             IdentifierInfo *Id, bool Typename,
2676d845ae1baf77691bca080e0762a1d45ee017f70Anders Carlsson                             bool ParameterPack) {
26876e4ce42a30cee4dc40ce7c6014874fbc4f9baa7Anders Carlsson  QualType Type = C.getTemplateTypeParmType(D, P, ParameterPack, Id);
2696d845ae1baf77691bca080e0762a1d45ee017f70Anders Carlsson  return new (C) TemplateTypeParmDecl(DC, L, Id, Typename, Type, ParameterPack);
270aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor}
271aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
272833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallSourceLocation TemplateTypeParmDecl::getDefaultArgumentLoc() const {
273bd054dba8a3023821f2a0951b0fae05e3522a7c9Abramo Bagnara  return DefaultArgument->getTypeLoc().getSourceRange().getBegin();
274833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall}
275833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
276ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregorunsigned TemplateTypeParmDecl::getDepth() const {
277ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor  return TypeForDecl->getAs<TemplateTypeParmType>()->getDepth();
278ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor}
279ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor
280ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregorunsigned TemplateTypeParmDecl::getIndex() const {
281ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor  return TypeForDecl->getAs<TemplateTypeParmType>()->getIndex();
282ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor}
283ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor
284aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
285aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// NonTypeTemplateParmDecl Method Implementations
286aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
287aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
288aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorNonTypeTemplateParmDecl *
289aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorNonTypeTemplateParmDecl::Create(ASTContext &C, DeclContext *DC,
290aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                SourceLocation L, unsigned D, unsigned P,
291aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                IdentifierInfo *Id, QualType T,
292a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall                                TypeSourceInfo *TInfo) {
293a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall  return new (C) NonTypeTemplateParmDecl(DC, L, D, P, Id, T, TInfo);
294aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor}
295aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
296d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas GregorSourceLocation NonTypeTemplateParmDecl::getDefaultArgumentLoc() const {
297d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas Gregor  return DefaultArgument? DefaultArgument->getSourceRange().getBegin()
2981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                        : SourceLocation();
299d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas Gregor}
300d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas Gregor
301aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
302aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// TemplateTemplateParmDecl Method Implementations
303aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
304aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
305aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorTemplateTemplateParmDecl *
306aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorTemplateTemplateParmDecl::Create(ASTContext &C, DeclContext *DC,
307aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                 SourceLocation L, unsigned D, unsigned P,
308aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                 IdentifierInfo *Id,
309aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                 TemplateParameterList *Params) {
310aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor  return new (C) TemplateTemplateParmDecl(DC, L, D, P, Id, Params);
311aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor}
312aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
3133e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor//===----------------------------------------------------------------------===//
3149ba41645892da0000fe8a7832b80208f44dafedaAnders Carlsson// TemplateArgumentListBuilder Implementation
3159ba41645892da0000fe8a7832b80208f44dafedaAnders Carlsson//===----------------------------------------------------------------------===//
316fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson
31798d279ba8092186f606abaa8298f13a0816b9cf2Chris Lattnervoid TemplateArgumentListBuilder::Append(const TemplateArgument &Arg) {
31898d279ba8092186f606abaa8298f13a0816b9cf2Chris Lattner  assert((Arg.getKind() != TemplateArgument::Type ||
31998d279ba8092186f606abaa8298f13a0816b9cf2Chris Lattner          Arg.getAsType().isCanonical()) && "Type must be canonical!");
32098d279ba8092186f606abaa8298f13a0816b9cf2Chris Lattner  assert(FlatArgs.size() < MaxFlatArgs && "Argument list builder is full!");
3211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  assert(!StructuredArgs &&
322fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson         "Can't append arguments when an argument pack has been added!");
3231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
32498d279ba8092186f606abaa8298f13a0816b9cf2Chris Lattner  FlatArgs.push_back(Arg);
3259ba41645892da0000fe8a7832b80208f44dafedaAnders Carlsson}
3269ba41645892da0000fe8a7832b80208f44dafedaAnders Carlsson
327fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlssonvoid TemplateArgumentListBuilder::BeginPack() {
328fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson  assert(!AddingToPack && "Already adding to pack!");
329fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson  assert(!StructuredArgs && "Argument list already contains a pack!");
3301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
331fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson  AddingToPack = true;
33298d279ba8092186f606abaa8298f13a0816b9cf2Chris Lattner  PackBeginIndex = FlatArgs.size();
33367e332009c6e349dc34700f539747afcff990336Anders Carlsson}
33467e332009c6e349dc34700f539747afcff990336Anders Carlsson
335fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlssonvoid TemplateArgumentListBuilder::EndPack() {
336fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson  assert(AddingToPack && "Not adding to pack!");
337fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson  assert(!StructuredArgs && "Argument list already contains a pack!");
3381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
339fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson  AddingToPack = false;
3403b36b66a00b7d5bab71b486a54694f0ae397bddbAnders Carlsson
341304d0faa6cac3111074cc400c1c573a6e611872bChris Lattner  // FIXME: This is a memory leak!
342fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson  StructuredArgs = new TemplateArgument[MaxStructuredArgs];
3431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
344fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson  // First copy the flat entries over to the list  (if any)
345fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson  for (unsigned I = 0; I != PackBeginIndex; ++I) {
346fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson    NumStructuredArgs++;
347fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson    StructuredArgs[I] = FlatArgs[I];
348fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson  }
3491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
350fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson  // Next, set the pack.
351fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson  TemplateArgument *PackArgs = 0;
352fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson  unsigned NumPackArgs = NumFlatArgs - PackBeginIndex;
35398d279ba8092186f606abaa8298f13a0816b9cf2Chris Lattner  // FIXME: NumPackArgs shouldn't be negative here???
354fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson  if (NumPackArgs)
35598d279ba8092186f606abaa8298f13a0816b9cf2Chris Lattner    PackArgs = FlatArgs.data()+PackBeginIndex;
3561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  StructuredArgs[NumStructuredArgs++].setArgumentPack(PackArgs, NumPackArgs,
358fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson                                                      /*CopyArgs=*/false);
359fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson}
360fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson
3619ba41645892da0000fe8a7832b80208f44dafedaAnders Carlsson//===----------------------------------------------------------------------===//
3627e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor// TemplateArgumentList Implementation
3637e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor//===----------------------------------------------------------------------===//
3647e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas GregorTemplateArgumentList::TemplateArgumentList(ASTContext &Context,
365e9c904b082ac3299831704a69066b86ab0f78becAnders Carlsson                                           TemplateArgumentListBuilder &Builder,
366fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson                                           bool TakeArgs)
3671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  : FlatArguments(Builder.getFlatArguments(), TakeArgs),
3681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    NumFlatArguments(Builder.flatSize()),
369fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson    StructuredArguments(Builder.getStructuredArguments(), TakeArgs),
370fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson    NumStructuredArguments(Builder.structuredSize()) {
3711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
372fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson  if (!TakeArgs)
373fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson    return;
3741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
37556ef550c5eeea0714c635782776389df2a177584Chris Lattner  // If this does take ownership of the arguments, then we have to new them
37656ef550c5eeea0714c635782776389df2a177584Chris Lattner  // and copy over.
37756ef550c5eeea0714c635782776389df2a177584Chris Lattner  TemplateArgument *NewArgs = new TemplateArgument[Builder.flatSize()];
37856ef550c5eeea0714c635782776389df2a177584Chris Lattner  std::copy(Builder.getFlatArguments(),
37956ef550c5eeea0714c635782776389df2a177584Chris Lattner            Builder.getFlatArguments()+Builder.flatSize(), NewArgs);
38056ef550c5eeea0714c635782776389df2a177584Chris Lattner  FlatArguments.setPointer(NewArgs);
38156ef550c5eeea0714c635782776389df2a177584Chris Lattner
38256ef550c5eeea0714c635782776389df2a177584Chris Lattner  // Just reuse the structured and flat arguments array if possible.
38356ef550c5eeea0714c635782776389df2a177584Chris Lattner  if (Builder.getStructuredArguments() == Builder.getFlatArguments()) {
38456ef550c5eeea0714c635782776389df2a177584Chris Lattner    StructuredArguments.setPointer(NewArgs);
385fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson    StructuredArguments.setInt(0);
38656ef550c5eeea0714c635782776389df2a177584Chris Lattner  } else {
38756ef550c5eeea0714c635782776389df2a177584Chris Lattner    TemplateArgument *NewSArgs = new TemplateArgument[Builder.flatSize()];
38856ef550c5eeea0714c635782776389df2a177584Chris Lattner    std::copy(Builder.getFlatArguments(),
38956ef550c5eeea0714c635782776389df2a177584Chris Lattner              Builder.getFlatArguments()+Builder.flatSize(), NewSArgs);
39056ef550c5eeea0714c635782776389df2a177584Chris Lattner    StructuredArguments.setPointer(NewSArgs);
39156ef550c5eeea0714c635782776389df2a177584Chris Lattner  }
3927e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor}
3937e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor
394885989109ade7cb4dc493e25da41456c64b3cf6aChris Lattner/// Produces a shallow copy of the given template argument list.  This
395885989109ade7cb4dc493e25da41456c64b3cf6aChris Lattner/// assumes that the input argument list outlives it.  This takes the list as
396885989109ade7cb4dc493e25da41456c64b3cf6aChris Lattner/// a pointer to avoid looking like a copy constructor, since this really
397885989109ade7cb4dc493e25da41456c64b3cf6aChris Lattner/// really isn't safe to use that way.
398885989109ade7cb4dc493e25da41456c64b3cf6aChris LattnerTemplateArgumentList::TemplateArgumentList(const TemplateArgumentList *Other)
399885989109ade7cb4dc493e25da41456c64b3cf6aChris Lattner  : FlatArguments(Other->FlatArguments.getPointer(), false),
400885989109ade7cb4dc493e25da41456c64b3cf6aChris Lattner    NumFlatArguments(Other->flat_size()),
401885989109ade7cb4dc493e25da41456c64b3cf6aChris Lattner    StructuredArguments(Other->StructuredArguments.getPointer(), false),
402885989109ade7cb4dc493e25da41456c64b3cf6aChris Lattner    NumStructuredArguments(Other->NumStructuredArguments) { }
403b9aa6b214c8fbc3e081dde575eef1f0913d48bdcDouglas Gregor
4047e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas GregorTemplateArgumentList::~TemplateArgumentList() {
40556ef550c5eeea0714c635782776389df2a177584Chris Lattner  if (FlatArguments.getInt())
40656ef550c5eeea0714c635782776389df2a177584Chris Lattner    delete [] FlatArguments.getPointer();
40756ef550c5eeea0714c635782776389df2a177584Chris Lattner  if (StructuredArguments.getInt())
40856ef550c5eeea0714c635782776389df2a177584Chris Lattner    delete [] StructuredArguments.getPointer();
4097e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor}
4107e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor
4117e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor//===----------------------------------------------------------------------===//
4123e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor// ClassTemplateSpecializationDecl Implementation
4133e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor//===----------------------------------------------------------------------===//
4143e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas GregorClassTemplateSpecializationDecl::
41513c8577201e4fc0ddac5f09d05fd1778832137d1Douglas GregorClassTemplateSpecializationDecl(ASTContext &Context, Kind DK, TagKind TK,
4167e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor                                DeclContext *DC, SourceLocation L,
4173e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor                                ClassTemplateDecl *SpecializedTemplate,
4188e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor                                TemplateArgumentListBuilder &Builder,
4198e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor                                ClassTemplateSpecializationDecl *PrevDecl)
42013c8577201e4fc0ddac5f09d05fd1778832137d1Douglas Gregor  : CXXRecordDecl(DK, TK, DC, L,
4218e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor                  SpecializedTemplate->getIdentifier(),
4228e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor                  PrevDecl),
4233e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor    SpecializedTemplate(SpecializedTemplate),
4243cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall    TypeAsWritten(0),
425fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson    TemplateArgs(Context, Builder, /*TakeArgs=*/true),
4267e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor    SpecializationKind(TSK_Undeclared) {
4273e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor}
4281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4293e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas GregorClassTemplateSpecializationDecl *
43013c8577201e4fc0ddac5f09d05fd1778832137d1Douglas GregorClassTemplateSpecializationDecl::Create(ASTContext &Context, TagKind TK,
4313e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor                                        DeclContext *DC, SourceLocation L,
4323e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor                                        ClassTemplateDecl *SpecializedTemplate,
43391fdf6f576b91f023c3bebb0d3786aab555cb3c5Anders Carlsson                                        TemplateArgumentListBuilder &Builder,
434cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor                                   ClassTemplateSpecializationDecl *PrevDecl) {
435cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor  ClassTemplateSpecializationDecl *Result
4361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    = new (Context)ClassTemplateSpecializationDecl(Context,
437c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor                                                   ClassTemplateSpecialization,
43813c8577201e4fc0ddac5f09d05fd1778832137d1Douglas Gregor                                                   TK, DC, L,
4397e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor                                                   SpecializedTemplate,
4408e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor                                                   Builder,
4418e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor                                                   PrevDecl);
442cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor  Context.getTypeDeclType(Result, PrevDecl);
443cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor  return Result;
4443e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor}
445c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor
44637d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregorvoid ClassTemplateSpecializationDecl::Destroy(ASTContext &C) {
4471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (SpecializedPartialSpecialization *PartialSpec
44837d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor        = SpecializedTemplate.dyn_cast<SpecializedPartialSpecialization*>())
44937d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor    C.Deallocate(PartialSpec);
4501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
45137d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor  CXXRecordDecl::Destroy(C);
45237d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor}
45337d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor
454136a6988960ac3aeb96f298da7a1a182db7217cdJohn McCallvoid
455136a6988960ac3aeb96f298da7a1a182db7217cdJohn McCallClassTemplateSpecializationDecl::getNameForDiagnostic(std::string &S,
456136a6988960ac3aeb96f298da7a1a182db7217cdJohn McCall                                                  const PrintingPolicy &Policy,
457136a6988960ac3aeb96f298da7a1a182db7217cdJohn McCall                                                      bool Qualified) const {
458136a6988960ac3aeb96f298da7a1a182db7217cdJohn McCall  NamedDecl::getNameForDiagnostic(S, Policy, Qualified);
459136a6988960ac3aeb96f298da7a1a182db7217cdJohn McCall
460136a6988960ac3aeb96f298da7a1a182db7217cdJohn McCall  const TemplateArgumentList &TemplateArgs = getTemplateArgs();
461136a6988960ac3aeb96f298da7a1a182db7217cdJohn McCall  S += TemplateSpecializationType::PrintTemplateArgumentList(
462136a6988960ac3aeb96f298da7a1a182db7217cdJohn McCall                                       TemplateArgs.getFlatArgumentList(),
463136a6988960ac3aeb96f298da7a1a182db7217cdJohn McCall                                       TemplateArgs.flat_size(),
464136a6988960ac3aeb96f298da7a1a182db7217cdJohn McCall                                                             Policy);
465136a6988960ac3aeb96f298da7a1a182db7217cdJohn McCall}
466136a6988960ac3aeb96f298da7a1a182db7217cdJohn McCall
46737d93e9252026d4fb836d9c05d0122a2d46e56beDouglas GregorClassTemplateDecl *
4681eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpClassTemplateSpecializationDecl::getSpecializedTemplate() const {
4691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (SpecializedPartialSpecialization *PartialSpec
47037d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor      = SpecializedTemplate.dyn_cast<SpecializedPartialSpecialization*>())
47137d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor    return PartialSpec->PartialSpecialization->getSpecializedTemplate();
47237d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor  return SpecializedTemplate.get<ClassTemplateDecl*>();
47337d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor}
47437d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor
475c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor//===----------------------------------------------------------------------===//
476c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor// ClassTemplatePartialSpecializationDecl Implementation
477c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor//===----------------------------------------------------------------------===//
478c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas GregorClassTemplatePartialSpecializationDecl *
479c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas GregorClassTemplatePartialSpecializationDecl::
48013c8577201e4fc0ddac5f09d05fd1778832137d1Douglas GregorCreate(ASTContext &Context, TagKind TK,DeclContext *DC, SourceLocation L,
481c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor       TemplateParameterList *Params,
482c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor       ClassTemplateDecl *SpecializedTemplate,
48391fdf6f576b91f023c3bebb0d3786aab555cb3c5Anders Carlsson       TemplateArgumentListBuilder &Builder,
484d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall       const TemplateArgumentListInfo &ArgInfos,
4853cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall       QualType CanonInjectedType,
486dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor       ClassTemplatePartialSpecializationDecl *PrevDecl,
487dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor       unsigned SequenceNumber) {
488d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  unsigned N = ArgInfos.size();
489833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  TemplateArgumentLoc *ClonedArgs = new (Context) TemplateArgumentLoc[N];
490833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  for (unsigned I = 0; I != N; ++I)
491833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    ClonedArgs[I] = ArgInfos[I];
492833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
493c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor  ClassTemplatePartialSpecializationDecl *Result
49413c8577201e4fc0ddac5f09d05fd1778832137d1Douglas Gregor    = new (Context)ClassTemplatePartialSpecializationDecl(Context, TK,
495c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor                                                          DC, L, Params,
496c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor                                                          SpecializedTemplate,
497833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                                          Builder,
498833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                                          ClonedArgs, N,
499dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor                                                          PrevDecl,
500dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor                                                          SequenceNumber);
501c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor  Result->setSpecializationKind(TSK_ExplicitSpecialization);
5023cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall
5033cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  Context.getInjectedClassNameType(Result, CanonInjectedType);
504c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor  return Result;
505c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor}
506dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall
507dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall//===----------------------------------------------------------------------===//
508dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall// FriendTemplateDecl Implementation
509dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall//===----------------------------------------------------------------------===//
510dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall
511dd4a3b0065b9a7e7b00073df415a798886c090f3John McCallFriendTemplateDecl *FriendTemplateDecl::Create(ASTContext &Context,
512dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall                                               DeclContext *DC,
513dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall                                               SourceLocation L,
514dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall                                               unsigned NParams,
515dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall                                               TemplateParameterList **Params,
516dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall                                               FriendUnion Friend,
517dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall                                               SourceLocation FLoc) {
518dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall  FriendTemplateDecl *Result
519dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall    = new (Context) FriendTemplateDecl(DC, L, NParams, Params, Friend, FLoc);
520dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall  return Result;
521dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall}
522