DeclTemplate.cpp revision 0ceffb51b28b09db67404058c642dcb1f877f6e8
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,
84aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                                   TemplateParameterList *Params,
85aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                                   NamedDecl *Decl) {
86aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor  return new (C) FunctionTemplateDecl(DC, L, Name, Params, Decl);
87aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor}
88aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
89aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
90aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// ClassTemplateDecl Implementation
91aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
92aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
93aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorClassTemplateDecl *ClassTemplateDecl::Create(ASTContext &C,
94aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                             DeclContext *DC,
95aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                             SourceLocation L,
96aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                             DeclarationName Name,
97aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                             TemplateParameterList *Params,
985953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor                                             NamedDecl *Decl,
995953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor                                             ClassTemplateDecl *PrevDecl) {
1005953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor  Common *CommonPtr;
1015953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor  if (PrevDecl)
1025953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor    CommonPtr = PrevDecl->CommonPtr;
1035953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor  else
1045953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor    CommonPtr = new (C) Common;
1055953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor
1065953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor  return new (C) ClassTemplateDecl(DC, L, Name, Params, Decl, PrevDecl,
1075953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor                                   CommonPtr);
1085953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor}
1095953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor
1105953d8b37f92f0cf548941f617c9b0a7703df33bDouglas GregorClassTemplateDecl::~ClassTemplateDecl() {
1115953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor  assert(CommonPtr == 0 && "ClassTemplateDecl must be explicitly destroyed");
1125953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor}
1135953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor
1145953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregorvoid ClassTemplateDecl::Destroy(ASTContext& C) {
1155953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor  if (!PreviousDeclaration) {
1165953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor    CommonPtr->~Common();
1175953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor    C.Deallocate((void*)CommonPtr);
1185953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor  }
1195953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor  CommonPtr = 0;
1205953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor
1215953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor  this->~ClassTemplateDecl();
1225953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor  C.Deallocate((void*)this);
123aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor}
124aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
1257da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas GregorQualType ClassTemplateDecl::getInjectedClassNameType(ASTContext &Context) {
1267da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor  if (!CommonPtr->InjectedClassNameType.isNull())
1277da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor    return CommonPtr->InjectedClassNameType;
1287da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor
1297da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor  // FIXME: n2800 14.6.1p1 should say how the template arguments
1307da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor  // corresponding to template parameter packs should be pack
1317da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor  // expansions. We already say that in 14.6.2.1p2, so it would be
1327da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor  // better to fix that redundancy.
1337da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor
1347da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor  TemplateParameterList *Params = getTemplateParameters();
1357da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor
1367da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor  llvm::SmallVector<TemplateArgument, 16> TemplateArgs;
1377da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor  llvm::SmallVector<TemplateArgument, 16> CanonTemplateArgs;
1387da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor  TemplateArgs.reserve(Params->size());
1397da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor  CanonTemplateArgs.reserve(Params->size());
1407da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor
1417da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor  for (TemplateParameterList::iterator
1427da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor         Param = Params->begin(), ParamEnd = Params->end();
1437da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor       Param != ParamEnd; ++Param) {
1447da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor    if (isa<TemplateTypeParmDecl>(*Param)) {
1457da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor      QualType ParamType = Context.getTypeDeclType(cast<TypeDecl>(*Param));
1467da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor      TemplateArgs.push_back(TemplateArgument((*Param)->getLocation(),
1477da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor                                              ParamType));
1487da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor      CanonTemplateArgs.push_back(
1497da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor                         TemplateArgument((*Param)->getLocation(),
1507da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor                                          Context.getCanonicalType(ParamType)));
1517da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor    } else if (NonTypeTemplateParmDecl *NTTP =
1527da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor                 dyn_cast<NonTypeTemplateParmDecl>(*Param)) {
1537da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor      // FIXME: Build canonical expression, too!
1547da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor      Expr *E = new (Context) DeclRefExpr(NTTP, NTTP->getType(),
1557da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor                                          NTTP->getLocation(),
1567da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor                                          NTTP->getType()->isDependentType(),
1577da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor                                          /*Value-dependent=*/true);
1587da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor      TemplateArgs.push_back(TemplateArgument(E));
1597da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor      CanonTemplateArgs.push_back(TemplateArgument(E));
1607da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor    } else {
1617da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor      TemplateTemplateParmDecl *TTP = cast<TemplateTemplateParmDecl>(*Param);
1627da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor      TemplateArgs.push_back(TemplateArgument(TTP->getLocation(), TTP));
1637da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor      CanonTemplateArgs.push_back(TemplateArgument(TTP->getLocation(),
1647da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor                                              Context.getCanonicalDecl(TTP)));
1657da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor    }
1667da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor  }
1677da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor
1687da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor  // FIXME: I should really move the "build-the-canonical-type" logic
1697da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor  // into ASTContext::getTemplateSpecializationType.
1707da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor  TemplateName Name = TemplateName(this);
1717da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor  QualType CanonType = Context.getTemplateSpecializationType(
1727da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor                                       Context.getCanonicalTemplateName(Name),
1737da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor                                             &CanonTemplateArgs[0],
1747da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor                                             CanonTemplateArgs.size());
1757da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor
1767da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor  CommonPtr->InjectedClassNameType
1777da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor    = Context.getTemplateSpecializationType(Name,
1787da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor                                            &TemplateArgs[0],
1797da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor                                            TemplateArgs.size(),
1807da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor                                            CanonType);
1817da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor  return CommonPtr->InjectedClassNameType;
1827da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor}
1837da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor
184aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
185aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// TemplateTypeParm Allocation/Deallocation Method Implementations
186aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
187aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
188aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorTemplateTypeParmDecl *
189aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorTemplateTypeParmDecl::Create(ASTContext &C, DeclContext *DC,
190aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                             SourceLocation L, unsigned D, unsigned P,
1916d845ae1baf77691bca080e0762a1d45ee017f70Anders Carlsson                             IdentifierInfo *Id, bool Typename,
1926d845ae1baf77691bca080e0762a1d45ee017f70Anders Carlsson                             bool ParameterPack) {
193fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor  QualType Type = C.getTemplateTypeParmType(D, P, Id);
1946d845ae1baf77691bca080e0762a1d45ee017f70Anders Carlsson  return new (C) TemplateTypeParmDecl(DC, L, Id, Typename, Type, ParameterPack);
195aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor}
196aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
197aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
198aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// NonTypeTemplateParmDecl Method Implementations
199aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
200aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
201aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorNonTypeTemplateParmDecl *
202aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorNonTypeTemplateParmDecl::Create(ASTContext &C, DeclContext *DC,
203aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                SourceLocation L, unsigned D, unsigned P,
204aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                IdentifierInfo *Id, QualType T,
205aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                SourceLocation TypeSpecStartLoc) {
206aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor  return new (C) NonTypeTemplateParmDecl(DC, L, D, P, Id, T,
207aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                         TypeSpecStartLoc);
208aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor}
209aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
210d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas GregorSourceLocation NonTypeTemplateParmDecl::getDefaultArgumentLoc() const {
211d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas Gregor  return DefaultArgument? DefaultArgument->getSourceRange().getBegin()
212d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas Gregor                        : SourceLocation();
213d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas Gregor}
214d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas Gregor
215aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
216aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// TemplateTemplateParmDecl Method Implementations
217aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
218aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
219aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorTemplateTemplateParmDecl *
220aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorTemplateTemplateParmDecl::Create(ASTContext &C, DeclContext *DC,
221aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                 SourceLocation L, unsigned D, unsigned P,
222aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                 IdentifierInfo *Id,
223aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                 TemplateParameterList *Params) {
224aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor  return new (C) TemplateTemplateParmDecl(DC, L, D, P, Id, Params);
225aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor}
226aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
227d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas GregorSourceLocation TemplateTemplateParmDecl::getDefaultArgumentLoc() const {
228d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas Gregor  return DefaultArgument? DefaultArgument->getSourceRange().getBegin()
229d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas Gregor                        : SourceLocation();
230d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas Gregor}
2313e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor
2323e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor//===----------------------------------------------------------------------===//
23340808ce6ac04b102c3b56244a635d6b98eed6d97Douglas Gregor// TemplateArgument Implementation
23440808ce6ac04b102c3b56244a635d6b98eed6d97Douglas Gregor//===----------------------------------------------------------------------===//
23540808ce6ac04b102c3b56244a635d6b98eed6d97Douglas Gregor
23640808ce6ac04b102c3b56244a635d6b98eed6d97Douglas GregorTemplateArgument::TemplateArgument(Expr *E) : Kind(Expression) {
23740808ce6ac04b102c3b56244a635d6b98eed6d97Douglas Gregor  TypeOrValue = reinterpret_cast<uintptr_t>(E);
23840808ce6ac04b102c3b56244a635d6b98eed6d97Douglas Gregor  StartLoc = E->getSourceRange().getBegin();
23940808ce6ac04b102c3b56244a635d6b98eed6d97Douglas Gregor}
24040808ce6ac04b102c3b56244a635d6b98eed6d97Douglas Gregor
24140808ce6ac04b102c3b56244a635d6b98eed6d97Douglas Gregor//===----------------------------------------------------------------------===//
2429ba41645892da0000fe8a7832b80208f44dafedaAnders Carlsson// TemplateArgumentListBuilder Implementation
2439ba41645892da0000fe8a7832b80208f44dafedaAnders Carlsson//===----------------------------------------------------------------------===//
2449ba41645892da0000fe8a7832b80208f44dafedaAnders Carlssonvoid TemplateArgumentListBuilder::push_back(const TemplateArgument& Arg) {
2459ba41645892da0000fe8a7832b80208f44dafedaAnders Carlsson  switch (Arg.getKind()) {
246412485d6659214285607aacd34ab2a25cfb6a67aMike Stump  default: break;
2479ba41645892da0000fe8a7832b80208f44dafedaAnders Carlsson  case TemplateArgument::Type:
2489ba41645892da0000fe8a7832b80208f44dafedaAnders Carlsson    assert(Arg.getAsType()->isCanonical() && "Type must be canonical!");
2499ba41645892da0000fe8a7832b80208f44dafedaAnders Carlsson    break;
2509ba41645892da0000fe8a7832b80208f44dafedaAnders Carlsson  }
2519ba41645892da0000fe8a7832b80208f44dafedaAnders Carlsson
25267e332009c6e349dc34700f539747afcff990336Anders Carlsson  if (!isAddingFromParameterPack()) {
25367e332009c6e349dc34700f539747afcff990336Anders Carlsson    // Add begin and end indicies.
25467e332009c6e349dc34700f539747afcff990336Anders Carlsson    Indices.push_back(Args.size());
25567e332009c6e349dc34700f539747afcff990336Anders Carlsson    Indices.push_back(Args.size());
25667e332009c6e349dc34700f539747afcff990336Anders Carlsson  }
25767e332009c6e349dc34700f539747afcff990336Anders Carlsson
2589ba41645892da0000fe8a7832b80208f44dafedaAnders Carlsson  Args.push_back(Arg);
2599ba41645892da0000fe8a7832b80208f44dafedaAnders Carlsson}
2609ba41645892da0000fe8a7832b80208f44dafedaAnders Carlsson
26167e332009c6e349dc34700f539747afcff990336Anders Carlssonvoid TemplateArgumentListBuilder::BeginParameterPack() {
26267e332009c6e349dc34700f539747afcff990336Anders Carlsson  assert(!isAddingFromParameterPack() && "Already adding to parameter pack!");
26367e332009c6e349dc34700f539747afcff990336Anders Carlsson
26467e332009c6e349dc34700f539747afcff990336Anders Carlsson  Indices.push_back(Args.size());
26567e332009c6e349dc34700f539747afcff990336Anders Carlsson}
26667e332009c6e349dc34700f539747afcff990336Anders Carlsson
26767e332009c6e349dc34700f539747afcff990336Anders Carlssonvoid TemplateArgumentListBuilder::EndParameterPack() {
26867e332009c6e349dc34700f539747afcff990336Anders Carlsson  assert(isAddingFromParameterPack() && "Not adding to parameter pack!");
26967e332009c6e349dc34700f539747afcff990336Anders Carlsson
27067e332009c6e349dc34700f539747afcff990336Anders Carlsson  Indices.push_back(Args.size());
27167e332009c6e349dc34700f539747afcff990336Anders Carlsson}
27267e332009c6e349dc34700f539747afcff990336Anders Carlsson
2739ba41645892da0000fe8a7832b80208f44dafedaAnders Carlsson//===----------------------------------------------------------------------===//
2747e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor// TemplateArgumentList Implementation
2757e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor//===----------------------------------------------------------------------===//
2767e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas GregorTemplateArgumentList::TemplateArgumentList(ASTContext &Context,
277e9c904b082ac3299831704a69066b86ab0f78becAnders Carlsson                                           TemplateArgumentListBuilder &Builder,
278e9c904b082ac3299831704a69066b86ab0f78becAnders Carlsson                                           bool CopyArgs, bool FlattenArgs)
279e9c904b082ac3299831704a69066b86ab0f78becAnders Carlsson  : NumArguments(Builder.flatSize()) {
2807e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor  if (!CopyArgs) {
281e9c904b082ac3299831704a69066b86ab0f78becAnders Carlsson    Arguments.setPointer(Builder.getFlatArgumentList());
2827e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor    Arguments.setInt(1);
2837e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor    return;
2847e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor  }
2857e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor
286e9c904b082ac3299831704a69066b86ab0f78becAnders Carlsson
287e9c904b082ac3299831704a69066b86ab0f78becAnders Carlsson  unsigned Size = sizeof(TemplateArgument) * Builder.flatSize();
2887e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor  unsigned Align = llvm::AlignOf<TemplateArgument>::Alignment;
2897e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor  void *Mem = Context.Allocate(Size, Align);
2907e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor  Arguments.setPointer((TemplateArgument *)Mem);
2917e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor  Arguments.setInt(0);
2927e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor
2937e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor  TemplateArgument *Args = (TemplateArgument *)Mem;
294e9c904b082ac3299831704a69066b86ab0f78becAnders Carlsson  for (unsigned I = 0; I != NumArguments; ++I)
295e9c904b082ac3299831704a69066b86ab0f78becAnders Carlsson    new (Args + I) TemplateArgument(Builder.getFlatArgumentList()[I]);
2967e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor}
2977e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor
2987e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas GregorTemplateArgumentList::~TemplateArgumentList() {
2997e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor  // FIXME: Deallocate template arguments
3007e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor}
3017e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor
3027e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor//===----------------------------------------------------------------------===//
3033e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor// ClassTemplateSpecializationDecl Implementation
3043e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor//===----------------------------------------------------------------------===//
3053e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas GregorClassTemplateSpecializationDecl::
306c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas GregorClassTemplateSpecializationDecl(ASTContext &Context, Kind DK,
3077e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor                                DeclContext *DC, SourceLocation L,
3083e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor                                ClassTemplateDecl *SpecializedTemplate,
30991fdf6f576b91f023c3bebb0d3786aab555cb3c5Anders Carlsson                                TemplateArgumentListBuilder &Builder)
310c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor  : CXXRecordDecl(DK,
3113e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor                  SpecializedTemplate->getTemplatedDecl()->getTagKind(),
3123e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor                  DC, L,
3133e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor                  // FIXME: Should we use DeclarationName for the name of
3143e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor                  // class template specializations?
3153e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor                  SpecializedTemplate->getIdentifier()),
3163e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor    SpecializedTemplate(SpecializedTemplate),
317e9c904b082ac3299831704a69066b86ab0f78becAnders Carlsson    TemplateArgs(Context, Builder, /*CopyArgs=*/true, /*FlattenArgs=*/true),
3187e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor    SpecializationKind(TSK_Undeclared) {
3193e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor}
3203e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor
3213e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas GregorClassTemplateSpecializationDecl *
3223e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas GregorClassTemplateSpecializationDecl::Create(ASTContext &Context,
3233e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor                                        DeclContext *DC, SourceLocation L,
3243e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor                                        ClassTemplateDecl *SpecializedTemplate,
32591fdf6f576b91f023c3bebb0d3786aab555cb3c5Anders Carlsson                                        TemplateArgumentListBuilder &Builder,
326cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor                                   ClassTemplateSpecializationDecl *PrevDecl) {
327cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor  ClassTemplateSpecializationDecl *Result
328c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor    = new (Context)ClassTemplateSpecializationDecl(Context,
329c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor                                                   ClassTemplateSpecialization,
330c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor                                                   DC, L,
3317e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor                                                   SpecializedTemplate,
33291fdf6f576b91f023c3bebb0d3786aab555cb3c5Anders Carlsson                                                   Builder);
333cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor  Context.getTypeDeclType(Result, PrevDecl);
334cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor  return Result;
3353e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor}
336c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor
337c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor//===----------------------------------------------------------------------===//
338c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor// ClassTemplatePartialSpecializationDecl Implementation
339c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor//===----------------------------------------------------------------------===//
340c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas GregorClassTemplatePartialSpecializationDecl *
341c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas GregorClassTemplatePartialSpecializationDecl::
342c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas GregorCreate(ASTContext &Context, DeclContext *DC, SourceLocation L,
343c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor       TemplateParameterList *Params,
344c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor       ClassTemplateDecl *SpecializedTemplate,
34591fdf6f576b91f023c3bebb0d3786aab555cb3c5Anders Carlsson       TemplateArgumentListBuilder &Builder,
346c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor       ClassTemplatePartialSpecializationDecl *PrevDecl) {
347c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor  ClassTemplatePartialSpecializationDecl *Result
348c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor    = new (Context)ClassTemplatePartialSpecializationDecl(Context,
349c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor                                                          DC, L, Params,
350c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor                                                          SpecializedTemplate,
35191fdf6f576b91f023c3bebb0d3786aab555cb3c5Anders Carlsson                                                          Builder);
352c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor  Result->setSpecializationKind(TSK_ExplicitSpecialization);
353c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor  Context.getTypeDeclType(Result, PrevDecl);
354c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor  return Result;
355c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor}
356