DeclTemplate.cpp revision 37d93e9252026d4fb836d9c05d0122a2d46e56be
1aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===--- DeclCXX.cpp - C++ 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"
18aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor#include "clang/Basic/IdentifierTable.h"
19aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor#include "llvm/ADT/STLExtras.h"
20aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregorusing namespace clang;
21aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
22aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
23aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// TemplateParameterList Implementation
24aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
25aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
26ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas GregorTemplateParameterList::TemplateParameterList(SourceLocation TemplateLoc,
27ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas Gregor                                             SourceLocation LAngleLoc,
28ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas Gregor                                             Decl **Params, unsigned NumParams,
29ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas Gregor                                             SourceLocation RAngleLoc)
30ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas Gregor  : TemplateLoc(TemplateLoc), LAngleLoc(LAngleLoc), RAngleLoc(RAngleLoc),
31ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas Gregor    NumParams(NumParams) {
32aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor  for (unsigned Idx = 0; Idx < NumParams; ++Idx)
33aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor    begin()[Idx] = Params[Idx];
34aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor}
35aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
36aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorTemplateParameterList *
37ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas GregorTemplateParameterList::Create(ASTContext &C, SourceLocation TemplateLoc,
38ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas Gregor                              SourceLocation LAngleLoc, Decl **Params,
39ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas Gregor                              unsigned NumParams, SourceLocation RAngleLoc) {
40aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor  unsigned Size = sizeof(TemplateParameterList) + sizeof(Decl *) * NumParams;
41aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor  unsigned Align = llvm::AlignOf<TemplateParameterList>::Alignment;
42aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor  void *Mem = C.Allocate(Size, Align);
43ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas Gregor  return new (Mem) TemplateParameterList(TemplateLoc, LAngleLoc, Params,
44ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas Gregor                                         NumParams, RAngleLoc);
45aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor}
46aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
4762cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregorunsigned TemplateParameterList::getMinRequiredArguments() const {
4862cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor  unsigned NumRequiredArgs = size();
4962cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor  iterator Param = const_cast<TemplateParameterList *>(this)->end(),
5062cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor      ParamBegin = const_cast<TemplateParameterList *>(this)->begin();
5162cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor  while (Param != ParamBegin) {
5262cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor    --Param;
530ceffb51b28b09db67404058c642dcb1f877f6e8Anders Carlsson
540ceffb51b28b09db67404058c642dcb1f877f6e8Anders Carlsson    if (!(*Param)->isTemplateParameterPack() &&
550ceffb51b28b09db67404058c642dcb1f877f6e8Anders Carlsson        !(isa<TemplateTypeParmDecl>(*Param) &&
5662cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor          cast<TemplateTypeParmDecl>(*Param)->hasDefaultArgument()) &&
5762cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor        !(isa<NonTypeTemplateParmDecl>(*Param) &&
5862cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor          cast<NonTypeTemplateParmDecl>(*Param)->hasDefaultArgument()) &&
5962cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor        !(isa<TemplateTemplateParmDecl>(*Param) &&
6062cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor          cast<TemplateTemplateParmDecl>(*Param)->hasDefaultArgument()))
6162cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor      break;
6262cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor
6362cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor    --NumRequiredArgs;
6462cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor  }
6562cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor
6662cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor  return NumRequiredArgs;
6762cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor}
6862cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor
69aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
70aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// TemplateDecl Implementation
71aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
72aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
73aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorTemplateDecl::~TemplateDecl() {
74aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor}
75aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
76aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
77aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// FunctionTemplateDecl Implementation
78aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
79aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
80aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorFunctionTemplateDecl *FunctionTemplateDecl::Create(ASTContext &C,
81aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                                   DeclContext *DC,
82aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                                   SourceLocation L,
83aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                                   DeclarationName Name,
84127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor                                               TemplateParameterList *Params,
85aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                                   NamedDecl *Decl) {
86aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor  return new (C) FunctionTemplateDecl(DC, L, Name, Params, Decl);
87aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor}
88aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
89127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregorvoid FunctionTemplateDecl::Destroy(ASTContext &C) {
90127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor  if (Common *CommonPtr = CommonOrPrev.dyn_cast<Common*>()) {
91127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor    for (llvm::FoldingSet<FunctionTemplateSpecializationInfo>::iterator
92127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor              Spec = CommonPtr->Specializations.begin(),
93127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor           SpecEnd = CommonPtr->Specializations.end();
94127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor         Spec != SpecEnd; ++Spec)
95127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor      C.Deallocate(&*Spec);
96127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor  }
97127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor
98127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor  Decl::Destroy(C);
99127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor}
100127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor
101b57a4fe73b8227c0dba651818b8495dfca61e530Argyrios KyrtzidisFunctionTemplateDecl *FunctionTemplateDecl::getCanonicalDecl() {
102b57a4fe73b8227c0dba651818b8495dfca61e530Argyrios Kyrtzidis  FunctionTemplateDecl *FunTmpl = this;
103b57a4fe73b8227c0dba651818b8495dfca61e530Argyrios Kyrtzidis  while (FunTmpl->getPreviousDeclaration())
104b57a4fe73b8227c0dba651818b8495dfca61e530Argyrios Kyrtzidis    FunTmpl = FunTmpl->getPreviousDeclaration();
105b57a4fe73b8227c0dba651818b8495dfca61e530Argyrios Kyrtzidis  return FunTmpl;
106b57a4fe73b8227c0dba651818b8495dfca61e530Argyrios Kyrtzidis}
107b57a4fe73b8227c0dba651818b8495dfca61e530Argyrios Kyrtzidis
108127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas GregorFunctionTemplateDecl::Common *FunctionTemplateDecl::getCommonPtr() {
109127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor  // Find the first declaration of this function template.
110127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor  FunctionTemplateDecl *First = this;
111127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor  while (First->getPreviousDeclaration())
112127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor    First = First->getPreviousDeclaration();
113127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor
114127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor  if (First->CommonOrPrev.isNull()) {
115127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor    // FIXME: Allocate with the ASTContext
116127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor    First->CommonOrPrev = new Common;
117127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor  }
118127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor  return First->CommonOrPrev.get<Common*>();
119127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor}
120127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor
121aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
122aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// ClassTemplateDecl Implementation
123aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
124aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
125b57a4fe73b8227c0dba651818b8495dfca61e530Argyrios KyrtzidisClassTemplateDecl *ClassTemplateDecl::getCanonicalDecl() {
126b57a4fe73b8227c0dba651818b8495dfca61e530Argyrios Kyrtzidis  ClassTemplateDecl *Template = this;
127b57a4fe73b8227c0dba651818b8495dfca61e530Argyrios Kyrtzidis  while (Template->getPreviousDeclaration())
128b57a4fe73b8227c0dba651818b8495dfca61e530Argyrios Kyrtzidis    Template = Template->getPreviousDeclaration();
129b57a4fe73b8227c0dba651818b8495dfca61e530Argyrios Kyrtzidis  return Template;
130b57a4fe73b8227c0dba651818b8495dfca61e530Argyrios Kyrtzidis}
131b57a4fe73b8227c0dba651818b8495dfca61e530Argyrios Kyrtzidis
132aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorClassTemplateDecl *ClassTemplateDecl::Create(ASTContext &C,
133aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                             DeclContext *DC,
134aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                             SourceLocation L,
135aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                             DeclarationName Name,
136aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                             TemplateParameterList *Params,
1375953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor                                             NamedDecl *Decl,
1385953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor                                             ClassTemplateDecl *PrevDecl) {
1395953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor  Common *CommonPtr;
1405953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor  if (PrevDecl)
1415953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor    CommonPtr = PrevDecl->CommonPtr;
1425953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor  else
1435953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor    CommonPtr = new (C) Common;
1445953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor
1455953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor  return new (C) ClassTemplateDecl(DC, L, Name, Params, Decl, PrevDecl,
1465953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor                                   CommonPtr);
1475953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor}
1485953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor
1495953d8b37f92f0cf548941f617c9b0a7703df33bDouglas GregorClassTemplateDecl::~ClassTemplateDecl() {
1505953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor  assert(CommonPtr == 0 && "ClassTemplateDecl must be explicitly destroyed");
1515953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor}
1525953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor
1535953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregorvoid ClassTemplateDecl::Destroy(ASTContext& C) {
1545953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor  if (!PreviousDeclaration) {
1555953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor    CommonPtr->~Common();
1565953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor    C.Deallocate((void*)CommonPtr);
1575953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor  }
1585953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor  CommonPtr = 0;
1595953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor
1605953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor  this->~ClassTemplateDecl();
1615953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor  C.Deallocate((void*)this);
162aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor}
163aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
164b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas GregorClassTemplatePartialSpecializationDecl *
165b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas GregorClassTemplateDecl::findPartialSpecialization(QualType T) {
166b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor  ASTContext &Context = getASTContext();
167b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor  typedef llvm::FoldingSet<ClassTemplatePartialSpecializationDecl>::iterator
168b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor    partial_spec_iterator;
169b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor  for (partial_spec_iterator P = getPartialSpecializations().begin(),
170b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor                          PEnd = getPartialSpecializations().end();
171b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor       P != PEnd; ++P) {
172b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor    if (Context.hasSameType(Context.getTypeDeclType(&*P), T))
173b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor      return &*P;
174b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor  }
175b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor
176b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor  return 0;
177b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor}
178b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor
1797da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas GregorQualType ClassTemplateDecl::getInjectedClassNameType(ASTContext &Context) {
1807da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor  if (!CommonPtr->InjectedClassNameType.isNull())
1817da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor    return CommonPtr->InjectedClassNameType;
1827da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor
1837da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor  // FIXME: n2800 14.6.1p1 should say how the template arguments
1847da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor  // corresponding to template parameter packs should be pack
1857da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor  // expansions. We already say that in 14.6.2.1p2, so it would be
1867da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor  // better to fix that redundancy.
1877da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor
1887da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor  TemplateParameterList *Params = getTemplateParameters();
1897da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor  llvm::SmallVector<TemplateArgument, 16> TemplateArgs;
1907da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor  TemplateArgs.reserve(Params->size());
1911275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor  for (TemplateParameterList::iterator Param = Params->begin(),
1921275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor                                    ParamEnd = Params->end();
1937da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor       Param != ParamEnd; ++Param) {
1947da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor    if (isa<TemplateTypeParmDecl>(*Param)) {
1957da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor      QualType ParamType = Context.getTypeDeclType(cast<TypeDecl>(*Param));
1967da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor      TemplateArgs.push_back(TemplateArgument((*Param)->getLocation(),
1977da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor                                              ParamType));
1987da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor    } else if (NonTypeTemplateParmDecl *NTTP =
1997da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor                 dyn_cast<NonTypeTemplateParmDecl>(*Param)) {
2007da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor      Expr *E = new (Context) DeclRefExpr(NTTP, NTTP->getType(),
2017da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor                                          NTTP->getLocation(),
2027da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor                                          NTTP->getType()->isDependentType(),
2037da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor                                          /*Value-dependent=*/true);
2047da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor      TemplateArgs.push_back(TemplateArgument(E));
2057da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor    } else {
2067da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor      TemplateTemplateParmDecl *TTP = cast<TemplateTemplateParmDecl>(*Param);
2077da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor      TemplateArgs.push_back(TemplateArgument(TTP->getLocation(), TTP));
2087da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor    }
2097da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor  }
2107da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor
2117da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor  CommonPtr->InjectedClassNameType
2121275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor    = Context.getTemplateSpecializationType(TemplateName(this),
2137da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor                                            &TemplateArgs[0],
2141275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor                                            TemplateArgs.size());
2157da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor  return CommonPtr->InjectedClassNameType;
2167da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor}
2177da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor
218aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
219aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// TemplateTypeParm Allocation/Deallocation Method Implementations
220aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
221aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
222aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorTemplateTypeParmDecl *
223aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorTemplateTypeParmDecl::Create(ASTContext &C, DeclContext *DC,
224aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                             SourceLocation L, unsigned D, unsigned P,
2256d845ae1baf77691bca080e0762a1d45ee017f70Anders Carlsson                             IdentifierInfo *Id, bool Typename,
2266d845ae1baf77691bca080e0762a1d45ee017f70Anders Carlsson                             bool ParameterPack) {
22776e4ce42a30cee4dc40ce7c6014874fbc4f9baa7Anders Carlsson  QualType Type = C.getTemplateTypeParmType(D, P, ParameterPack, Id);
2286d845ae1baf77691bca080e0762a1d45ee017f70Anders Carlsson  return new (C) TemplateTypeParmDecl(DC, L, Id, Typename, Type, ParameterPack);
229aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor}
230aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
231aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
232aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// NonTypeTemplateParmDecl Method Implementations
233aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
234aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
235aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorNonTypeTemplateParmDecl *
236aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorNonTypeTemplateParmDecl::Create(ASTContext &C, DeclContext *DC,
237aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                SourceLocation L, unsigned D, unsigned P,
238aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                IdentifierInfo *Id, QualType T,
239aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                SourceLocation TypeSpecStartLoc) {
240aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor  return new (C) NonTypeTemplateParmDecl(DC, L, D, P, Id, T,
241aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                         TypeSpecStartLoc);
242aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor}
243aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
244d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas GregorSourceLocation NonTypeTemplateParmDecl::getDefaultArgumentLoc() const {
245d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas Gregor  return DefaultArgument? DefaultArgument->getSourceRange().getBegin()
246d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas Gregor                        : SourceLocation();
247d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas Gregor}
248d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas Gregor
249aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
250aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// TemplateTemplateParmDecl Method Implementations
251aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
252aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
253aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorTemplateTemplateParmDecl *
254aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorTemplateTemplateParmDecl::Create(ASTContext &C, DeclContext *DC,
255aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                 SourceLocation L, unsigned D, unsigned P,
256aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                 IdentifierInfo *Id,
257aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                 TemplateParameterList *Params) {
258aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor  return new (C) TemplateTemplateParmDecl(DC, L, D, P, Id, Params);
259aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor}
260aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
261d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas GregorSourceLocation TemplateTemplateParmDecl::getDefaultArgumentLoc() const {
262d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas Gregor  return DefaultArgument? DefaultArgument->getSourceRange().getBegin()
263d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas Gregor                        : SourceLocation();
264d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas Gregor}
2653e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor
2663e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor//===----------------------------------------------------------------------===//
26740808ce6ac04b102c3b56244a635d6b98eed6d97Douglas Gregor// TemplateArgument Implementation
26840808ce6ac04b102c3b56244a635d6b98eed6d97Douglas Gregor//===----------------------------------------------------------------------===//
26940808ce6ac04b102c3b56244a635d6b98eed6d97Douglas Gregor
27040808ce6ac04b102c3b56244a635d6b98eed6d97Douglas GregorTemplateArgument::TemplateArgument(Expr *E) : Kind(Expression) {
27140808ce6ac04b102c3b56244a635d6b98eed6d97Douglas Gregor  TypeOrValue = reinterpret_cast<uintptr_t>(E);
27240808ce6ac04b102c3b56244a635d6b98eed6d97Douglas Gregor  StartLoc = E->getSourceRange().getBegin();
27340808ce6ac04b102c3b56244a635d6b98eed6d97Douglas Gregor}
27440808ce6ac04b102c3b56244a635d6b98eed6d97Douglas Gregor
275d01b1da213aeb71fd40ff7fb78a194613cc1ece7Anders Carlsson/// \brief Construct a template argument pack.
276fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlssonvoid TemplateArgument::setArgumentPack(TemplateArgument *args, unsigned NumArgs,
277fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson                                       bool CopyArgs) {
278fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson  assert(isNull() && "Must call setArgumentPack on a null argument");
279fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson
280fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson  Kind = Pack;
281fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson  Args.NumArgs = NumArgs;
282fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson  Args.CopyArgs = CopyArgs;
283fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson  if (!Args.CopyArgs) {
284fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson    Args.Args = args;
285fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson    return;
286fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson  }
287fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson
2881275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor  // FIXME: Allocate in ASTContext
289fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson  Args.Args = new TemplateArgument[NumArgs];
290fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson  for (unsigned I = 0; I != Args.NumArgs; ++I)
291fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson    Args.Args[I] = args[I];
292d01b1da213aeb71fd40ff7fb78a194613cc1ece7Anders Carlsson}
293d01b1da213aeb71fd40ff7fb78a194613cc1ece7Anders Carlsson
29440808ce6ac04b102c3b56244a635d6b98eed6d97Douglas Gregor//===----------------------------------------------------------------------===//
2959ba41645892da0000fe8a7832b80208f44dafedaAnders Carlsson// TemplateArgumentListBuilder Implementation
2969ba41645892da0000fe8a7832b80208f44dafedaAnders Carlsson//===----------------------------------------------------------------------===//
297fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson
298fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlssonvoid TemplateArgumentListBuilder::Append(const TemplateArgument& Arg) {
2999ba41645892da0000fe8a7832b80208f44dafedaAnders Carlsson  switch (Arg.getKind()) {
300fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson    default: break;
301fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson    case TemplateArgument::Type:
302fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson      assert(Arg.getAsType()->isCanonical() && "Type must be canonical!");
303fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson      break;
3049ba41645892da0000fe8a7832b80208f44dafedaAnders Carlsson  }
3059ba41645892da0000fe8a7832b80208f44dafedaAnders Carlsson
306fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson  assert(NumFlatArgs < MaxFlatArgs && "Argument list builder is full!");
307fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson  assert(!StructuredArgs &&
308fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson         "Can't append arguments when an argument pack has been added!");
309fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson
310fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson  if (!FlatArgs)
311fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson    FlatArgs = new TemplateArgument[MaxFlatArgs];
3123b36b66a00b7d5bab71b486a54694f0ae397bddbAnders Carlsson
313fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson  FlatArgs[NumFlatArgs++] = Arg;
3149ba41645892da0000fe8a7832b80208f44dafedaAnders Carlsson}
3159ba41645892da0000fe8a7832b80208f44dafedaAnders Carlsson
316fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlssonvoid TemplateArgumentListBuilder::BeginPack() {
317fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson  assert(!AddingToPack && "Already adding to pack!");
318fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson  assert(!StructuredArgs && "Argument list already contains a pack!");
319fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson
320fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson  AddingToPack = true;
321fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson  PackBeginIndex = NumFlatArgs;
32267e332009c6e349dc34700f539747afcff990336Anders Carlsson}
32367e332009c6e349dc34700f539747afcff990336Anders Carlsson
324fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlssonvoid TemplateArgumentListBuilder::EndPack() {
325fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson  assert(AddingToPack && "Not adding to pack!");
326fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson  assert(!StructuredArgs && "Argument list already contains a pack!");
327fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson
328fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson  AddingToPack = false;
3293b36b66a00b7d5bab71b486a54694f0ae397bddbAnders Carlsson
330fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson  StructuredArgs = new TemplateArgument[MaxStructuredArgs];
331fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson
332fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson  // First copy the flat entries over to the list  (if any)
333fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson  for (unsigned I = 0; I != PackBeginIndex; ++I) {
334fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson    NumStructuredArgs++;
335fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson    StructuredArgs[I] = FlatArgs[I];
336fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson  }
3373b36b66a00b7d5bab71b486a54694f0ae397bddbAnders Carlsson
338fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson  // Next, set the pack.
339fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson  TemplateArgument *PackArgs = 0;
340fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson  unsigned NumPackArgs = NumFlatArgs - PackBeginIndex;
341fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson  if (NumPackArgs)
342fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson    PackArgs = &FlatArgs[PackBeginIndex];
34367e332009c6e349dc34700f539747afcff990336Anders Carlsson
344fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson  StructuredArgs[NumStructuredArgs++].setArgumentPack(PackArgs, NumPackArgs,
345fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson                                                      /*CopyArgs=*/false);
346fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson}
347fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson
348fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlssonvoid TemplateArgumentListBuilder::ReleaseArgs() {
349fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson  FlatArgs = 0;
350fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson  NumFlatArgs = 0;
351fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson  MaxFlatArgs = 0;
352fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson  StructuredArgs = 0;
353fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson  NumStructuredArgs = 0;
354fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson  MaxStructuredArgs = 0;
355fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson}
35667e332009c6e349dc34700f539747afcff990336Anders Carlsson
3579ba41645892da0000fe8a7832b80208f44dafedaAnders Carlsson//===----------------------------------------------------------------------===//
3587e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor// TemplateArgumentList Implementation
3597e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor//===----------------------------------------------------------------------===//
3607e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas GregorTemplateArgumentList::TemplateArgumentList(ASTContext &Context,
361e9c904b082ac3299831704a69066b86ab0f78becAnders Carlsson                                           TemplateArgumentListBuilder &Builder,
362fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson                                           bool TakeArgs)
363fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson  : FlatArguments(Builder.getFlatArguments(), TakeArgs),
364fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson    NumFlatArguments(Builder.flatSize()),
365fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson    StructuredArguments(Builder.getStructuredArguments(), TakeArgs),
366fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson    NumStructuredArguments(Builder.structuredSize()) {
367e9c904b082ac3299831704a69066b86ab0f78becAnders Carlsson
368fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson  if (!TakeArgs)
369fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson    return;
370fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson
371fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson  if (Builder.getStructuredArguments() == Builder.getFlatArguments())
372fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson    StructuredArguments.setInt(0);
373fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson  Builder.ReleaseArgs();
3747e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor}
3757e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor
3767e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas GregorTemplateArgumentList::~TemplateArgumentList() {
3777e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor  // FIXME: Deallocate template arguments
3787e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor}
3797e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor
3807e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor//===----------------------------------------------------------------------===//
3813e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor// ClassTemplateSpecializationDecl Implementation
3823e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor//===----------------------------------------------------------------------===//
3833e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas GregorClassTemplateSpecializationDecl::
384c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas GregorClassTemplateSpecializationDecl(ASTContext &Context, Kind DK,
3857e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor                                DeclContext *DC, SourceLocation L,
3863e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor                                ClassTemplateDecl *SpecializedTemplate,
3878e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor                                TemplateArgumentListBuilder &Builder,
3888e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor                                ClassTemplateSpecializationDecl *PrevDecl)
389c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor  : CXXRecordDecl(DK,
3903e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor                  SpecializedTemplate->getTemplatedDecl()->getTagKind(),
3913e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor                  DC, L,
3923e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor                  // FIXME: Should we use DeclarationName for the name of
3933e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor                  // class template specializations?
3948e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor                  SpecializedTemplate->getIdentifier(),
3958e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor                  PrevDecl),
3963e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor    SpecializedTemplate(SpecializedTemplate),
397fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson    TemplateArgs(Context, Builder, /*TakeArgs=*/true),
3987e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor    SpecializationKind(TSK_Undeclared) {
3993e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor}
4003e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor
4013e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas GregorClassTemplateSpecializationDecl *
4023e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas GregorClassTemplateSpecializationDecl::Create(ASTContext &Context,
4033e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor                                        DeclContext *DC, SourceLocation L,
4043e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor                                        ClassTemplateDecl *SpecializedTemplate,
40591fdf6f576b91f023c3bebb0d3786aab555cb3c5Anders Carlsson                                        TemplateArgumentListBuilder &Builder,
406cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor                                   ClassTemplateSpecializationDecl *PrevDecl) {
407cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor  ClassTemplateSpecializationDecl *Result
408c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor    = new (Context)ClassTemplateSpecializationDecl(Context,
409c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor                                                   ClassTemplateSpecialization,
410c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor                                                   DC, L,
4117e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor                                                   SpecializedTemplate,
4128e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor                                                   Builder,
4138e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor                                                   PrevDecl);
414cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor  Context.getTypeDeclType(Result, PrevDecl);
415cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor  return Result;
4163e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor}
417c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor
41837d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregorvoid ClassTemplateSpecializationDecl::Destroy(ASTContext &C) {
41937d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor  if (SpecializedPartialSpecialization *PartialSpec
42037d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor        = SpecializedTemplate.dyn_cast<SpecializedPartialSpecialization*>())
42137d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor    C.Deallocate(PartialSpec);
42237d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor
42337d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor  CXXRecordDecl::Destroy(C);
42437d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor}
42537d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor
42637d93e9252026d4fb836d9c05d0122a2d46e56beDouglas GregorClassTemplateDecl *
42737d93e9252026d4fb836d9c05d0122a2d46e56beDouglas GregorClassTemplateSpecializationDecl::getSpecializedTemplate() const {
42837d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor  if (SpecializedPartialSpecialization *PartialSpec
42937d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor      = SpecializedTemplate.dyn_cast<SpecializedPartialSpecialization*>())
43037d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor    return PartialSpec->PartialSpecialization->getSpecializedTemplate();
43137d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor  return SpecializedTemplate.get<ClassTemplateDecl*>();
43237d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor}
43337d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor
434c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor//===----------------------------------------------------------------------===//
435c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor// ClassTemplatePartialSpecializationDecl Implementation
436c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor//===----------------------------------------------------------------------===//
437c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas GregorClassTemplatePartialSpecializationDecl *
438c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas GregorClassTemplatePartialSpecializationDecl::
439c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas GregorCreate(ASTContext &Context, DeclContext *DC, SourceLocation L,
440c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor       TemplateParameterList *Params,
441c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor       ClassTemplateDecl *SpecializedTemplate,
44291fdf6f576b91f023c3bebb0d3786aab555cb3c5Anders Carlsson       TemplateArgumentListBuilder &Builder,
443c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor       ClassTemplatePartialSpecializationDecl *PrevDecl) {
444c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor  ClassTemplatePartialSpecializationDecl *Result
445c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor    = new (Context)ClassTemplatePartialSpecializationDecl(Context,
446c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor                                                          DC, L, Params,
447c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor                                                          SpecializedTemplate,
4488e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor                                                          Builder, PrevDecl);
449c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor  Result->setSpecializationKind(TSK_ExplicitSpecialization);
450c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor  Context.getTypeDeclType(Result, PrevDecl);
451c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor  return Result;
452c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor}
453