DeclTemplate.cpp revision 6b02009359a462ffe633696a4441313b462e6566
106a59bb8260ce3d52de761865dee90f90054a5ccSebastian Redl//===--- DeclTemplate.cpp - Template Declaration AST Node Implementation --===//
2aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//
3aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//                     The LLVM Compiler Infrastructure
4aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//
5aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// This file is distributed under the University of Illinois Open Source
6aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// License. See LICENSE.TXT for details.
7aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//
8aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
9aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//
10aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// This file implements the C++ related Decl classes for templates.
11aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//
12aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
13aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
14aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor#include "clang/AST/DeclCXX.h"
15aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor#include "clang/AST/DeclTemplate.h"
1655f6b14230c94272efbbcdd89a92224c8db9f225Douglas Gregor#include "clang/AST/Expr.h"
17b95cc97b2023d00cd3fbae8455bc9d728eab5e5dDouglas Gregor#include "clang/AST/ExprCXX.h"
18aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor#include "clang/AST/ASTContext.h"
19833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall#include "clang/AST/TypeLoc.h"
20bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis#include "clang/AST/ASTMutationListener.h"
21aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor#include "clang/Basic/IdentifierTable.h"
22aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor#include "llvm/ADT/STLExtras.h"
23910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor#include <memory>
24aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregorusing namespace clang;
25aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
26aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
27aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// TemplateParameterList Implementation
28aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
29aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
30ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas GregorTemplateParameterList::TemplateParameterList(SourceLocation TemplateLoc,
31ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas Gregor                                             SourceLocation LAngleLoc,
32bf4ea56cdc376cef5a12abf6bf18dc34805c2226Douglas Gregor                                             NamedDecl **Params, unsigned NumParams,
33ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas Gregor                                             SourceLocation RAngleLoc)
34ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas Gregor  : TemplateLoc(TemplateLoc), LAngleLoc(LAngleLoc), RAngleLoc(RAngleLoc),
35ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas Gregor    NumParams(NumParams) {
36aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor  for (unsigned Idx = 0; Idx < NumParams; ++Idx)
37aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor    begin()[Idx] = Params[Idx];
38aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor}
39aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
40aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorTemplateParameterList *
414ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadTemplateParameterList::Create(const ASTContext &C, SourceLocation TemplateLoc,
42bf4ea56cdc376cef5a12abf6bf18dc34805c2226Douglas Gregor                              SourceLocation LAngleLoc, NamedDecl **Params,
43ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas Gregor                              unsigned NumParams, SourceLocation RAngleLoc) {
44bf4ea56cdc376cef5a12abf6bf18dc34805c2226Douglas Gregor  unsigned Size = sizeof(TemplateParameterList)
45bf4ea56cdc376cef5a12abf6bf18dc34805c2226Douglas Gregor                + sizeof(NamedDecl *) * NumParams;
46aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor  unsigned Align = llvm::AlignOf<TemplateParameterList>::Alignment;
47aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor  void *Mem = C.Allocate(Size, Align);
481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return new (Mem) TemplateParameterList(TemplateLoc, LAngleLoc, Params,
49ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas Gregor                                         NumParams, RAngleLoc);
50aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor}
51aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
5262cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregorunsigned TemplateParameterList::getMinRequiredArguments() const {
536952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor  unsigned NumRequiredArgs = 0;
546952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor  for (iterator P = const_cast<TemplateParameterList *>(this)->begin(),
556952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor             PEnd = const_cast<TemplateParameterList *>(this)->end();
566952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor       P != PEnd; ++P) {
576952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor    if ((*P)->isTemplateParameterPack()) {
586952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor      if (NonTypeTemplateParmDecl *NTTP = dyn_cast<NonTypeTemplateParmDecl>(*P))
596952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor        if (NTTP->isExpandedParameterPack()) {
606952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor          NumRequiredArgs += NTTP->getNumExpansionTypes();
616952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor          continue;
626952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor        }
636952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor
6462cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor      break;
656952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor    }
666952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor
676952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor    if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(*P)) {
686952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor      if (TTP->hasDefaultArgument())
696952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor        break;
706952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor    } else if (NonTypeTemplateParmDecl *NTTP
716952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                    = dyn_cast<NonTypeTemplateParmDecl>(*P)) {
726952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor      if (NTTP->hasDefaultArgument())
736952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor        break;
746952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor    } else if (cast<TemplateTemplateParmDecl>(*P)->hasDefaultArgument())
756952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor      break;
766952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor
776952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor    ++NumRequiredArgs;
7862cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor  }
796952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor
8062cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor  return NumRequiredArgs;
8162cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor}
8262cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor
83ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregorunsigned TemplateParameterList::getDepth() const {
84ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor  if (size() == 0)
85ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor    return 0;
86ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor
87ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor  const NamedDecl *FirstParm = getParam(0);
88ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor  if (const TemplateTypeParmDecl *TTP
89ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor        = dyn_cast<TemplateTypeParmDecl>(FirstParm))
90ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor    return TTP->getDepth();
91ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor  else if (const NonTypeTemplateParmDecl *NTTP
92ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor             = dyn_cast<NonTypeTemplateParmDecl>(FirstParm))
93ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor    return NTTP->getDepth();
94ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor  else
95ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor    return cast<TemplateTemplateParmDecl>(FirstParm)->getDepth();
96ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor}
97ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor
98787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregorstatic void AdoptTemplateParameterList(TemplateParameterList *Params,
99787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor                                       DeclContext *Owner) {
100787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor  for (TemplateParameterList::iterator P = Params->begin(),
101787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor                                    PEnd = Params->end();
102787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor       P != PEnd; ++P) {
103787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor    (*P)->setDeclContext(Owner);
104787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor
105787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor    if (TemplateTemplateParmDecl *TTP = dyn_cast<TemplateTemplateParmDecl>(*P))
106787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor      AdoptTemplateParameterList(TTP->getTemplateParameters(), Owner);
107787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor  }
108787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor}
109787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor
110aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
1119eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne// RedeclarableTemplateDecl Implementation
1129eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne//===----------------------------------------------------------------------===//
1139eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne
1149eabebafc165a67812eacc184806e7bf34c5f0a5Peter CollingbourneRedeclarableTemplateDecl::CommonBase *RedeclarableTemplateDecl::getCommonPtr() {
1157c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor  if (!Common) {
1167c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor    // Walk the previous-declaration chain until we either find a declaration
1177c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor    // with a common pointer or we run out of previous declarations.
1187c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor    llvm::SmallVector<RedeclarableTemplateDecl *, 2> PrevDecls;
119ef96ee0be5f100789f451641542a69cd719144d2Douglas Gregor    for (RedeclarableTemplateDecl *Prev = getPreviousDecl(); Prev;
120ef96ee0be5f100789f451641542a69cd719144d2Douglas Gregor         Prev = Prev->getPreviousDecl()) {
1217c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor      if (Prev->Common) {
1227c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor        Common = Prev->Common;
1237c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor        break;
1247c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor      }
1257c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor
1267c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor      PrevDecls.push_back(Prev);
1277c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor    }
1289eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne
1297c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor    // If we never found a common pointer, allocate one now.
1308a8950b13e4d438f732d24f22f63ebe1a9e0075eDouglas Gregor    if (!Common) {
1318a8950b13e4d438f732d24f22f63ebe1a9e0075eDouglas Gregor      // FIXME: If any of the declarations is from an AST file, we probably
1328a8950b13e4d438f732d24f22f63ebe1a9e0075eDouglas Gregor      // need an update record to add the common data.
1338a8950b13e4d438f732d24f22f63ebe1a9e0075eDouglas Gregor
1347c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor      Common = newCommon(getASTContext());
1358a8950b13e4d438f732d24f22f63ebe1a9e0075eDouglas Gregor    }
1367c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor
1377c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor    // Update any previous declarations we saw with the common pointer.
1387c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor    for (unsigned I = 0, N = PrevDecls.size(); I != N; ++I)
1397c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor      PrevDecls[I]->Common = Common;
1408a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne  }
1418a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne
1427c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor  return Common;
143f88718ea0ca0d64b7fd31d109f1d9ec769a9c45fPeter Collingbourne}
144f88718ea0ca0d64b7fd31d109f1d9ec769a9c45fPeter Collingbourne
1454048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbournetemplate <class EntryType>
1464048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbournetypename RedeclarableTemplateDecl::SpecEntryTraits<EntryType>::DeclType*
1474048590d5774fd4b08661b5cf59b6f90b62f283aPeter CollingbourneRedeclarableTemplateDecl::findSpecializationImpl(
148d964d6380945e0505b623050fe6a3f428008fc2aChandler Carruth                                 llvm::FoldingSetVector<EntryType> &Specs,
1494048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne                                 const TemplateArgument *Args, unsigned NumArgs,
1504048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne                                 void *&InsertPos) {
1514048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne  typedef SpecEntryTraits<EntryType> SETraits;
1524048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne  llvm::FoldingSetNodeID ID;
1534048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne  EntryType::Profile(ID,Args,NumArgs, getASTContext());
1544048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne  EntryType *Entry = Specs.FindNodeOrInsertPos(ID, InsertPos);
155ef96ee0be5f100789f451641542a69cd719144d2Douglas Gregor  return Entry ? SETraits::getMostRecentDecl(Entry) : 0;
1564048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne}
1574048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne
158c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor/// \brief Generate the injected template arguments for the given template
159c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor/// parameter list, e.g., for the injected-class-name of a class template.
160c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregorstatic void GenerateInjectedTemplateArgs(ASTContext &Context,
161c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor                                        TemplateParameterList *Params,
162c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor                                         TemplateArgument *Args) {
163c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor  for (TemplateParameterList::iterator Param = Params->begin(),
164c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor                                    ParamEnd = Params->end();
165c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor       Param != ParamEnd; ++Param) {
166c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor    TemplateArgument Arg;
167c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor    if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(*Param)) {
168c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor      QualType ArgType = Context.getTypeDeclType(TTP);
169c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor      if (TTP->isParameterPack())
170c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor        ArgType = Context.getPackExpansionType(ArgType,
171c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor                                               llvm::Optional<unsigned>());
172c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor
173c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor      Arg = TemplateArgument(ArgType);
174c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor    } else if (NonTypeTemplateParmDecl *NTTP =
175c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor               dyn_cast<NonTypeTemplateParmDecl>(*Param)) {
176f4b88a45902af1802a1cb42ba48b1c474474f228John McCall      Expr *E = new (Context) DeclRefExpr(NTTP, /*enclosing*/ false,
177c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor                                  NTTP->getType().getNonLValueExprType(Context),
178c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor                                  Expr::getValueKindForType(NTTP->getType()),
179c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor                                          NTTP->getLocation());
180c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor
181c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor      if (NTTP->isParameterPack())
182c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor        E = new (Context) PackExpansionExpr(Context.DependentTy, E,
183c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor                                            NTTP->getLocation(),
184c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor                                            llvm::Optional<unsigned>());
185c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor      Arg = TemplateArgument(E);
186c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor    } else {
187c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor      TemplateTemplateParmDecl *TTP = cast<TemplateTemplateParmDecl>(*Param);
188c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor      if (TTP->isParameterPack())
189c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor        Arg = TemplateArgument(TemplateName(TTP), llvm::Optional<unsigned>());
190c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor      else
191c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor        Arg = TemplateArgument(TemplateName(TTP));
192c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor    }
193c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor
194c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor    if ((*Param)->isTemplateParameterPack())
195c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor      Arg = TemplateArgument::CreatePackCopy(Context, &Arg, 1);
196c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor
197c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor    *Args++ = Arg;
198c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor  }
199c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor}
200c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor
2019eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne//===----------------------------------------------------------------------===//
202aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// FunctionTemplateDecl Implementation
203aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
204aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
2050054531488928a424666ac11fcdc6bcc5112de52Douglas Gregorvoid FunctionTemplateDecl::DeallocateCommon(void *Ptr) {
2060054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor  static_cast<Common *>(Ptr)->~Common();
2070054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor}
2080054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor
209aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorFunctionTemplateDecl *FunctionTemplateDecl::Create(ASTContext &C,
210aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                                   DeclContext *DC,
211aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                                   SourceLocation L,
212aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                                   DeclarationName Name,
213127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor                                               TemplateParameterList *Params,
214aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                                   NamedDecl *Decl) {
215787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor  AdoptTemplateParameterList(Params, cast<DeclContext>(Decl));
216aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor  return new (C) FunctionTemplateDecl(DC, L, Name, Params, Decl);
217aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor}
218aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
2191e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorFunctionTemplateDecl *FunctionTemplateDecl::CreateDeserialized(ASTContext &C,
2201e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor                                                               unsigned ID) {
2211e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor  void *Mem = AllocateDeserializedDecl(C, ID, sizeof(FunctionTemplateDecl));
2221e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor  return new (Mem) FunctionTemplateDecl(0, SourceLocation(), DeclarationName(),
2231e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor                                        0, 0);
2249a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor}
2259a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor
2266b5415196327fa8ef00f028ba175fafef1738ae1Argyrios KyrtzidisRedeclarableTemplateDecl::CommonBase *
2276b5415196327fa8ef00f028ba175fafef1738ae1Argyrios KyrtzidisFunctionTemplateDecl::newCommon(ASTContext &C) {
2286b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis  Common *CommonPtr = new (C) Common;
2296b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis  C.AddDeallocation(DeallocateCommon, CommonPtr);
2309eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne  return CommonPtr;
2319eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne}
2329eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne
2332c853e401ca406d417eb916e867226050e7be06bArgyrios KyrtzidisFunctionDecl *
2342c853e401ca406d417eb916e867226050e7be06bArgyrios KyrtzidisFunctionTemplateDecl::findSpecialization(const TemplateArgument *Args,
2352c853e401ca406d417eb916e867226050e7be06bArgyrios Kyrtzidis                                         unsigned NumArgs, void *&InsertPos) {
2364048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne  return findSpecializationImpl(getSpecializations(), Args, NumArgs, InsertPos);
2372c853e401ca406d417eb916e867226050e7be06bArgyrios Kyrtzidis}
2382c853e401ca406d417eb916e867226050e7be06bArgyrios Kyrtzidis
2395bbcdbf36f8cf79d99703ef20848c55960065e43Sebastian Redlvoid FunctionTemplateDecl::addSpecialization(
2405bbcdbf36f8cf79d99703ef20848c55960065e43Sebastian Redl      FunctionTemplateSpecializationInfo *Info, void *InsertPos) {
2411e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor  if (InsertPos)
2421e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor    getSpecializations().InsertNode(Info, InsertPos);
2431e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor  else
2441e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor    getSpecializations().GetOrInsertNode(Info);
2455bbcdbf36f8cf79d99703ef20848c55960065e43Sebastian Redl  if (ASTMutationListener *L = getASTMutationListener())
2465bbcdbf36f8cf79d99703ef20848c55960065e43Sebastian Redl    L->AddedCXXTemplateSpecialization(this, Info->Function);
2475bbcdbf36f8cf79d99703ef20848c55960065e43Sebastian Redl}
2485bbcdbf36f8cf79d99703ef20848c55960065e43Sebastian Redl
249c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregorstd::pair<const TemplateArgument *, unsigned>
250c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas GregorFunctionTemplateDecl::getInjectedTemplateArgs() {
251c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor  TemplateParameterList *Params = getTemplateParameters();
252c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor  Common *CommonPtr = getCommonPtr();
253c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor  if (!CommonPtr->InjectedArgs) {
254c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor    CommonPtr->InjectedArgs
255c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor      = new (getASTContext()) TemplateArgument [Params->size()];
256c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor    GenerateInjectedTemplateArgs(getASTContext(), Params,
257c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor                                 CommonPtr->InjectedArgs);
258c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor  }
259c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor
260c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor  return std::make_pair(CommonPtr->InjectedArgs, Params->size());
261c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor}
262c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor
263aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
264aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// ClassTemplateDecl Implementation
265aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
266aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
2670054531488928a424666ac11fcdc6bcc5112de52Douglas Gregorvoid ClassTemplateDecl::DeallocateCommon(void *Ptr) {
2680054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor  static_cast<Common *>(Ptr)->~Common();
2690054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor}
2700054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor
2718731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios KyrtzidisClassTemplateDecl *ClassTemplateDecl::Create(ASTContext &C,
2728731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis                                             DeclContext *DC,
2738731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis                                             SourceLocation L,
2748731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis                                             DeclarationName Name,
2758731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis                                             TemplateParameterList *Params,
2768731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis                                             NamedDecl *Decl,
2778731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis                                             ClassTemplateDecl *PrevDecl) {
278787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor  AdoptTemplateParameterList(Params, cast<DeclContext>(Decl));
2798731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis  ClassTemplateDecl *New = new (C) ClassTemplateDecl(DC, L, Name, Params, Decl);
2805bf1bdc2fedb0c29b5fcdb4abc852aa85b4fe26aArgyrios Kyrtzidis  New->setPreviousDeclaration(PrevDecl);
2818731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis  return New;
2825953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor}
2835953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor
2841e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorClassTemplateDecl *ClassTemplateDecl::CreateDeserialized(ASTContext &C,
2851e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor                                                         unsigned ID) {
2861e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor  void *Mem = AllocateDeserializedDecl(C, ID, sizeof(ClassTemplateDecl));
2871e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor  return new (Mem) ClassTemplateDecl(EmptyShell());
2889a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor}
2899a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor
290c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregorvoid ClassTemplateDecl::LoadLazySpecializations() {
291c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor  Common *CommonPtr = getCommonPtr();
292c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor  if (CommonPtr->LazySpecializations) {
293c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor    ASTContext &Context = getASTContext();
294c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor    uint32_t *Specs = CommonPtr->LazySpecializations;
295c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor    CommonPtr->LazySpecializations = 0;
296c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor    for (uint32_t I = 0, N = *Specs++; I != N; ++I)
297c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor      (void)Context.getExternalSource()->GetExternalDecl(Specs[I]);
298c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor  }
299c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor}
300c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor
301d964d6380945e0505b623050fe6a3f428008fc2aChandler Carruthllvm::FoldingSetVector<ClassTemplateSpecializationDecl> &
302c8e5cf8f725e111965debb7130ef7466c0c73884Douglas GregorClassTemplateDecl::getSpecializations() {
303c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor  LoadLazySpecializations();
304c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor  return getCommonPtr()->Specializations;
305c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor}
306c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor
307d964d6380945e0505b623050fe6a3f428008fc2aChandler Carruthllvm::FoldingSetVector<ClassTemplatePartialSpecializationDecl> &
308c8e5cf8f725e111965debb7130ef7466c0c73884Douglas GregorClassTemplateDecl::getPartialSpecializations() {
309c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor  LoadLazySpecializations();
310c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor  return getCommonPtr()->PartialSpecializations;
311c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor}
312c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor
3136b5415196327fa8ef00f028ba175fafef1738ae1Argyrios KyrtzidisRedeclarableTemplateDecl::CommonBase *
3146b5415196327fa8ef00f028ba175fafef1738ae1Argyrios KyrtzidisClassTemplateDecl::newCommon(ASTContext &C) {
3156b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis  Common *CommonPtr = new (C) Common;
3166b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis  C.AddDeallocation(DeallocateCommon, CommonPtr);
3179eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne  return CommonPtr;
3189eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne}
3199eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne
320cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplateSpecializationDecl *
321cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplateDecl::findSpecialization(const TemplateArgument *Args,
322cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis                                      unsigned NumArgs, void *&InsertPos) {
3234048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne  return findSpecializationImpl(getSpecializations(), Args, NumArgs, InsertPos);
324cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis}
325cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis
326bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidisvoid ClassTemplateDecl::AddSpecialization(ClassTemplateSpecializationDecl *D,
327bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis                                          void *InsertPos) {
3281e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor  if (InsertPos)
3291e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor    getSpecializations().InsertNode(D, InsertPos);
3301e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor  else {
3311e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor    ClassTemplateSpecializationDecl *Existing
3321e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor      = getSpecializations().GetOrInsertNode(D);
3331e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor    (void)Existing;
3341e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor    assert(Existing->isCanonicalDecl() && "Non-canonical specialization?");
3351e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor  }
336bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis  if (ASTMutationListener *L = getASTMutationListener())
337bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis    L->AddedCXXTemplateSpecialization(this, D);
338bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis}
339bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis
340cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplatePartialSpecializationDecl *
341cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplateDecl::findPartialSpecialization(const TemplateArgument *Args,
342cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis                                             unsigned NumArgs,
343cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis                                             void *&InsertPos) {
3444048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne  return findSpecializationImpl(getPartialSpecializations(), Args, NumArgs,
3454048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne                                InsertPos);
346cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis}
347cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis
348bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidisvoid ClassTemplateDecl::AddPartialSpecialization(
349bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis                                      ClassTemplatePartialSpecializationDecl *D,
350bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis                                      void *InsertPos) {
3511e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor  if (InsertPos)
3521e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor    getPartialSpecializations().InsertNode(D, InsertPos);
3531e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor  else {
3541e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor    ClassTemplatePartialSpecializationDecl *Existing
3551e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor      = getPartialSpecializations().GetOrInsertNode(D);
3561e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor    (void)Existing;
3571e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor    assert(Existing->isCanonicalDecl() && "Non-canonical specialization?");
3581e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor  }
3591e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor
360bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis  if (ASTMutationListener *L = getASTMutationListener())
361bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis    L->AddedCXXTemplateSpecialization(this, D);
362bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis}
363bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis
364dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregorvoid ClassTemplateDecl::getPartialSpecializations(
3655f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner          SmallVectorImpl<ClassTemplatePartialSpecializationDecl *> &PS) {
366d964d6380945e0505b623050fe6a3f428008fc2aChandler Carruth  llvm::FoldingSetVector<ClassTemplatePartialSpecializationDecl> &PartialSpecs
3675bf1bdc2fedb0c29b5fcdb4abc852aa85b4fe26aArgyrios Kyrtzidis    = getPartialSpecializations();
368dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor  PS.clear();
369dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor  PS.resize(PartialSpecs.size());
370d964d6380945e0505b623050fe6a3f428008fc2aChandler Carruth  for (llvm::FoldingSetVector<ClassTemplatePartialSpecializationDecl>::iterator
371dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor       P = PartialSpecs.begin(), PEnd = PartialSpecs.end();
372dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor       P != PEnd; ++P) {
373dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor    assert(!PS[P->getSequenceNumber()]);
374ef96ee0be5f100789f451641542a69cd719144d2Douglas Gregor    PS[P->getSequenceNumber()] = P->getMostRecentDecl();
375dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor  }
376dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor}
377dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor
378b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas GregorClassTemplatePartialSpecializationDecl *
379b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas GregorClassTemplateDecl::findPartialSpecialization(QualType T) {
380b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor  ASTContext &Context = getASTContext();
381d964d6380945e0505b623050fe6a3f428008fc2aChandler Carruth  using llvm::FoldingSetVector;
382d964d6380945e0505b623050fe6a3f428008fc2aChandler Carruth  typedef FoldingSetVector<ClassTemplatePartialSpecializationDecl>::iterator
383b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor    partial_spec_iterator;
384b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor  for (partial_spec_iterator P = getPartialSpecializations().begin(),
385b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor                          PEnd = getPartialSpecializations().end();
386b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor       P != PEnd; ++P) {
38731f17ecbef57b5679c017c375db330546b7b5145John McCall    if (Context.hasSameType(P->getInjectedSpecializationType(), T))
388ef96ee0be5f100789f451641542a69cd719144d2Douglas Gregor      return P->getMostRecentDecl();
389cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis  }
390cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis
391cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis  return 0;
392cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis}
393cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis
394cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplatePartialSpecializationDecl *
395cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplateDecl::findPartialSpecInstantiatedFromMember(
396cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis                                    ClassTemplatePartialSpecializationDecl *D) {
397cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis  Decl *DCanon = D->getCanonicalDecl();
398d964d6380945e0505b623050fe6a3f428008fc2aChandler Carruth  for (llvm::FoldingSetVector<ClassTemplatePartialSpecializationDecl>::iterator
399cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis            P = getPartialSpecializations().begin(),
400cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis         PEnd = getPartialSpecializations().end();
401cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis       P != PEnd; ++P) {
402cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis    if (P->getInstantiatedFromMember()->getCanonicalDecl() == DCanon)
403ef96ee0be5f100789f451641542a69cd719144d2Douglas Gregor      return P->getMostRecentDecl();
404b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor  }
4051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
406b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor  return 0;
407b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor}
408b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor
4093cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCallQualType
41024bae92f08ae098cc50a602d8cf1273b423e14daDouglas GregorClassTemplateDecl::getInjectedClassNameSpecialization() {
4115bf1bdc2fedb0c29b5fcdb4abc852aa85b4fe26aArgyrios Kyrtzidis  Common *CommonPtr = getCommonPtr();
4127da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor  if (!CommonPtr->InjectedClassNameType.isNull())
4137da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor    return CommonPtr->InjectedClassNameType;
4147da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor
415b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor  // C++0x [temp.dep.type]p2:
416b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor  //  The template argument list of a primary template is a template argument
417b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor  //  list in which the nth template argument has the value of the nth template
418b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor  //  parameter of the class template. If the nth template parameter is a
419b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor  //  template parameter pack (14.5.3), the nth template argument is a pack
420b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor  //  expansion (14.5.3) whose pattern is the name of the template parameter
421b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor  //  pack.
42224bae92f08ae098cc50a602d8cf1273b423e14daDouglas Gregor  ASTContext &Context = getASTContext();
4237da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor  TemplateParameterList *Params = getTemplateParameters();
4245f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  SmallVector<TemplateArgument, 16> TemplateArgs;
425c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor  TemplateArgs.resize(Params->size());
426c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor  GenerateInjectedTemplateArgs(getASTContext(), Params, TemplateArgs.data());
4277da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor  CommonPtr->InjectedClassNameType
4281275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor    = Context.getTemplateSpecializationType(TemplateName(this),
4297da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor                                            &TemplateArgs[0],
4301275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor                                            TemplateArgs.size());
4317da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor  return CommonPtr->InjectedClassNameType;
4327da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor}
4337da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor
434aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
435aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// TemplateTypeParm Allocation/Deallocation Method Implementations
436aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
437aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
438aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorTemplateTypeParmDecl *
4394ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadTemplateTypeParmDecl::Create(const ASTContext &C, DeclContext *DC,
440344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara                             SourceLocation KeyLoc, SourceLocation NameLoc,
441344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara                             unsigned D, unsigned P, IdentifierInfo *Id,
442344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara                             bool Typename, bool ParameterPack) {
4434fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth  TemplateTypeParmDecl *TTPDecl =
4444fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth    new (C) TemplateTypeParmDecl(DC, KeyLoc, NameLoc, Id, Typename);
4454fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth  QualType TTPType = C.getTemplateTypeParmType(D, P, ParameterPack, TTPDecl);
4464fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth  TTPDecl->TypeForDecl = TTPType.getTypePtr();
4474fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth  return TTPDecl;
448aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor}
449aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
450b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios KyrtzidisTemplateTypeParmDecl *
4511e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorTemplateTypeParmDecl::CreateDeserialized(const ASTContext &C, unsigned ID) {
4521e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor  void *Mem = AllocateDeserializedDecl(C, ID, sizeof(TemplateTypeParmDecl));
4531e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor  return new (Mem) TemplateTypeParmDecl(0, SourceLocation(), SourceLocation(),
4541e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor                                        0, false);
455b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios Kyrtzidis}
456b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios Kyrtzidis
457833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallSourceLocation TemplateTypeParmDecl::getDefaultArgumentLoc() const {
45877d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara  return hasDefaultArgument()
45977d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara    ? DefaultArgument->getTypeLoc().getBeginLoc()
46077d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara    : SourceLocation();
46177d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara}
46277d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara
46377d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo BagnaraSourceRange TemplateTypeParmDecl::getSourceRange() const {
46477d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara  if (hasDefaultArgument() && !defaultArgumentWasInherited())
465344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara    return SourceRange(getLocStart(),
46677d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara                       DefaultArgument->getTypeLoc().getEndLoc());
46777d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara  else
468344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara    return TypeDecl::getSourceRange();
469833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall}
470833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
471ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregorunsigned TemplateTypeParmDecl::getDepth() const {
472ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor  return TypeForDecl->getAs<TemplateTypeParmType>()->getDepth();
473ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor}
474ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor
475ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregorunsigned TemplateTypeParmDecl::getIndex() const {
476ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor  return TypeForDecl->getAs<TemplateTypeParmType>()->getIndex();
477ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor}
478ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor
4794fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruthbool TemplateTypeParmDecl::isParameterPack() const {
4804fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth  return TypeForDecl->getAs<TemplateTypeParmType>()->isParameterPack();
4814fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth}
4824fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth
483aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
484aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// NonTypeTemplateParmDecl Method Implementations
485aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
486aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
4876952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas GregorNonTypeTemplateParmDecl::NonTypeTemplateParmDecl(DeclContext *DC,
488ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara                                                 SourceLocation StartLoc,
489ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara                                                 SourceLocation IdLoc,
490ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara                                                 unsigned D, unsigned P,
491ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara                                                 IdentifierInfo *Id,
4926952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                                 QualType T,
4936952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                                 TypeSourceInfo *TInfo,
4946952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                                 const QualType *ExpandedTypes,
4956952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                                 unsigned NumExpandedTypes,
4966952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                                TypeSourceInfo **ExpandedTInfos)
497ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara  : DeclaratorDecl(NonTypeTemplateParm, DC, IdLoc, Id, T, TInfo, StartLoc),
4986952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor    TemplateParmPosition(D, P), DefaultArgumentAndInherited(0, false),
4996952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor    ParameterPack(true), ExpandedParameterPack(true),
5006952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor    NumExpandedTypes(NumExpandedTypes)
5016952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor{
5026952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor  if (ExpandedTypes && ExpandedTInfos) {
5036952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor    void **TypesAndInfos = reinterpret_cast<void **>(this + 1);
5046952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor    for (unsigned I = 0; I != NumExpandedTypes; ++I) {
5056952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor      TypesAndInfos[2*I] = ExpandedTypes[I].getAsOpaquePtr();
5066952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor      TypesAndInfos[2*I + 1] = ExpandedTInfos[I];
5076952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor    }
5086952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor  }
5096952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor}
5106952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor
511aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorNonTypeTemplateParmDecl *
5124ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadNonTypeTemplateParmDecl::Create(const ASTContext &C, DeclContext *DC,
513ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara                                SourceLocation StartLoc, SourceLocation IdLoc,
514ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara                                unsigned D, unsigned P, IdentifierInfo *Id,
515ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara                                QualType T, bool ParameterPack,
516ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara                                TypeSourceInfo *TInfo) {
517ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara  return new (C) NonTypeTemplateParmDecl(DC, StartLoc, IdLoc, D, P, Id,
518ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara                                         T, ParameterPack, TInfo);
519aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor}
520aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
5216952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas GregorNonTypeTemplateParmDecl *
5226952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas GregorNonTypeTemplateParmDecl::Create(const ASTContext &C, DeclContext *DC,
523ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara                                SourceLocation StartLoc, SourceLocation IdLoc,
524ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara                                unsigned D, unsigned P,
5256952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                IdentifierInfo *Id, QualType T,
5266952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                TypeSourceInfo *TInfo,
5276952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                const QualType *ExpandedTypes,
5286952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                unsigned NumExpandedTypes,
5296952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                TypeSourceInfo **ExpandedTInfos) {
5306952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor  unsigned Size = sizeof(NonTypeTemplateParmDecl)
5316952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                + NumExpandedTypes * 2 * sizeof(void*);
5326952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor  void *Mem = C.Allocate(Size);
533ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara  return new (Mem) NonTypeTemplateParmDecl(DC, StartLoc, IdLoc,
534ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara                                           D, P, Id, T, TInfo,
5356952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                           ExpandedTypes, NumExpandedTypes,
5366952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                           ExpandedTInfos);
5376952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor}
5386952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor
5391e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorNonTypeTemplateParmDecl *
5401e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorNonTypeTemplateParmDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
5411e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor  void *Mem = AllocateDeserializedDecl(C, ID, sizeof(NonTypeTemplateParmDecl));
5421e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor  return new (Mem) NonTypeTemplateParmDecl(0, SourceLocation(),
5431e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor                                           SourceLocation(), 0, 0, 0,
5441e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor                                           QualType(), false, 0);
5451e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor}
5461e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor
5471e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorNonTypeTemplateParmDecl *
5481e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorNonTypeTemplateParmDecl::CreateDeserialized(ASTContext &C, unsigned ID,
5491e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor                                            unsigned NumExpandedTypes) {
5501e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor  unsigned Size = sizeof(NonTypeTemplateParmDecl)
5511e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor                + NumExpandedTypes * 2 * sizeof(void*);
5521e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor
5531e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor  void *Mem = AllocateDeserializedDecl(C, ID, Size);
5541e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor  return new (Mem) NonTypeTemplateParmDecl(0, SourceLocation(),
5551e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor                                           SourceLocation(), 0, 0, 0,
5561e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor                                           QualType(), 0, 0, NumExpandedTypes,
5571e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor                                           0);
5581e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor}
5591e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor
56076a40219ee5624d78aba167dce02bdbaa930955fJohn McCallSourceRange NonTypeTemplateParmDecl::getSourceRange() const {
561ee4bfd412db491c489fc2ee74916edd73f9c618aAbramo Bagnara  if (hasDefaultArgument() && !defaultArgumentWasInherited())
562a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara    return SourceRange(getOuterLocStart(),
563a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara                       getDefaultArgument()->getSourceRange().getEnd());
564a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara  return DeclaratorDecl::getSourceRange();
56576a40219ee5624d78aba167dce02bdbaa930955fJohn McCall}
56676a40219ee5624d78aba167dce02bdbaa930955fJohn McCall
567d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas GregorSourceLocation NonTypeTemplateParmDecl::getDefaultArgumentLoc() const {
568d92f7a297c0ed3f7d0ebcbb557e1d4c1925b8c72Abramo Bagnara  return hasDefaultArgument()
569d92f7a297c0ed3f7d0ebcbb557e1d4c1925b8c72Abramo Bagnara    ? getDefaultArgument()->getSourceRange().getBegin()
570d92f7a297c0ed3f7d0ebcbb557e1d4c1925b8c72Abramo Bagnara    : SourceLocation();
571d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas Gregor}
572d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas Gregor
573aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
574aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// TemplateTemplateParmDecl Method Implementations
575aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
576aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
57799ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid TemplateTemplateParmDecl::anchor() { }
57899ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie
579aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorTemplateTemplateParmDecl *
5804ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadTemplateTemplateParmDecl::Create(const ASTContext &C, DeclContext *DC,
581aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                 SourceLocation L, unsigned D, unsigned P,
58261c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor                                 bool ParameterPack, IdentifierInfo *Id,
583aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                 TemplateParameterList *Params) {
58461c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor  return new (C) TemplateTemplateParmDecl(DC, L, D, P, ParameterPack, Id,
58561c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor                                          Params);
586aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor}
587aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
5881e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorTemplateTemplateParmDecl *
5891e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorTemplateTemplateParmDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
5901e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor  void *Mem = AllocateDeserializedDecl(C, ID, sizeof(TemplateTemplateParmDecl));
5911e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor  return new (Mem) TemplateTemplateParmDecl(0, SourceLocation(), 0, 0, false,
5921e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor                                            0, 0);
5931e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor}
5941e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor
5953e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor//===----------------------------------------------------------------------===//
5967e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor// TemplateArgumentList Implementation
5977e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor//===----------------------------------------------------------------------===//
598910f8008fea79120489a53593fe971b0b8a4a740Douglas GregorTemplateArgumentList *
599910f8008fea79120489a53593fe971b0b8a4a740Douglas GregorTemplateArgumentList::CreateCopy(ASTContext &Context,
600910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor                                 const TemplateArgument *Args,
601910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor                                 unsigned NumArgs) {
602910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor  std::size_t Size = sizeof(TemplateArgumentList)
603910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor                   + NumArgs * sizeof(TemplateArgument);
604910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor  void *Mem = Context.Allocate(Size);
605910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor  TemplateArgument *StoredArgs
606910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor    = reinterpret_cast<TemplateArgument *>(
607910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor                                static_cast<TemplateArgumentList *>(Mem) + 1);
608910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor  std::uninitialized_copy(Args, Args + NumArgs, StoredArgs);
609910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor  return new (Mem) TemplateArgumentList(StoredArgs, NumArgs, true);
61094d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis}
61194d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis
61271a7605977113c795edd44fcbd2302ad49506653Argyrios KyrtzidisFunctionTemplateSpecializationInfo *
61371a7605977113c795edd44fcbd2302ad49506653Argyrios KyrtzidisFunctionTemplateSpecializationInfo::Create(ASTContext &C, FunctionDecl *FD,
61471a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis                                           FunctionTemplateDecl *Template,
61571a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis                                           TemplateSpecializationKind TSK,
61671a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis                                       const TemplateArgumentList *TemplateArgs,
61771a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis                          const TemplateArgumentListInfo *TemplateArgsAsWritten,
61871a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis                                           SourceLocation POI) {
61971a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis  const ASTTemplateArgumentListInfo *ArgsAsWritten = 0;
62071a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis  if (TemplateArgsAsWritten)
62171a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis    ArgsAsWritten = ASTTemplateArgumentListInfo::Create(C,
62271a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis                                                        *TemplateArgsAsWritten);
62371a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis
62471a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis  return new (C) FunctionTemplateSpecializationInfo(FD, Template, TSK,
62571a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis                                                    TemplateArgs,
62671a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis                                                    ArgsAsWritten,
62771a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis                                                    POI);
62871a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis}
62971a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis
6307e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor//===----------------------------------------------------------------------===//
63199ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie// TemplateDecl Implementation
63299ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie//===----------------------------------------------------------------------===//
63399ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie
63499ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid TemplateDecl::anchor() { }
63599ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie
63699ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie//===----------------------------------------------------------------------===//
6373e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor// ClassTemplateSpecializationDecl Implementation
6383e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor//===----------------------------------------------------------------------===//
6393e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas GregorClassTemplateSpecializationDecl::
64013c8577201e4fc0ddac5f09d05fd1778832137d1Douglas GregorClassTemplateSpecializationDecl(ASTContext &Context, Kind DK, TagKind TK,
641ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara                                DeclContext *DC, SourceLocation StartLoc,
642ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara                                SourceLocation IdLoc,
6433e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor                                ClassTemplateDecl *SpecializedTemplate,
644910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor                                const TemplateArgument *Args,
645910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor                                unsigned NumArgs,
6468e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor                                ClassTemplateSpecializationDecl *PrevDecl)
647ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara  : CXXRecordDecl(DK, TK, DC, StartLoc, IdLoc,
6488e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor                  SpecializedTemplate->getIdentifier(),
6498e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor                  PrevDecl),
6503e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor    SpecializedTemplate(SpecializedTemplate),
651c98971d5c994caed9452aeadd0122c855e0f4de1Abramo Bagnara    ExplicitInfo(0),
652910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor    TemplateArgs(TemplateArgumentList::CreateCopy(Context, Args, NumArgs)),
6537e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor    SpecializationKind(TSK_Undeclared) {
6543e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor}
6551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
65694d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios KyrtzidisClassTemplateSpecializationDecl::ClassTemplateSpecializationDecl(Kind DK)
657ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara  : CXXRecordDecl(DK, TTK_Struct, 0, SourceLocation(), SourceLocation(), 0, 0),
65894d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis    ExplicitInfo(0),
65994d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis    SpecializationKind(TSK_Undeclared) {
66094d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis}
66194d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis
6623e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas GregorClassTemplateSpecializationDecl *
66313c8577201e4fc0ddac5f09d05fd1778832137d1Douglas GregorClassTemplateSpecializationDecl::Create(ASTContext &Context, TagKind TK,
664ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara                                        DeclContext *DC,
665ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara                                        SourceLocation StartLoc,
666ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara                                        SourceLocation IdLoc,
6673e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor                                        ClassTemplateDecl *SpecializedTemplate,
668910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor                                        const TemplateArgument *Args,
669910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor                                        unsigned NumArgs,
670cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor                                   ClassTemplateSpecializationDecl *PrevDecl) {
671cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor  ClassTemplateSpecializationDecl *Result
6721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    = new (Context)ClassTemplateSpecializationDecl(Context,
673c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor                                                   ClassTemplateSpecialization,
674ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara                                                   TK, DC, StartLoc, IdLoc,
6757e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor                                                   SpecializedTemplate,
676910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor                                                   Args, NumArgs,
6778e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor                                                   PrevDecl);
678cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor  Context.getTypeDeclType(Result, PrevDecl);
679cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor  return Result;
6803e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor}
681c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor
68294d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios KyrtzidisClassTemplateSpecializationDecl *
6831e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorClassTemplateSpecializationDecl::CreateDeserialized(ASTContext &C,
6841e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor                                                    unsigned ID) {
6851e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor  void *Mem = AllocateDeserializedDecl(C, ID,
6861e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor                                       sizeof(ClassTemplateSpecializationDecl));
6871e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor  return new (Mem) ClassTemplateSpecializationDecl(ClassTemplateSpecialization);
68894d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis}
68994d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis
690da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregorvoid
691da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas GregorClassTemplateSpecializationDecl::getNameForDiagnostic(std::string &S,
692da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor                                                  const PrintingPolicy &Policy,
693da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor                                                      bool Qualified) const {
694da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor  NamedDecl::getNameForDiagnostic(S, Policy, Qualified);
695da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor
696da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor  const TemplateArgumentList &TemplateArgs = getTemplateArgs();
697da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor  S += TemplateSpecializationType::PrintTemplateArgumentList(
698da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor                                                          TemplateArgs.data(),
699da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor                                                          TemplateArgs.size(),
700da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor                                                             Policy);
701da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor}
702da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor
70337d93e9252026d4fb836d9c05d0122a2d46e56beDouglas GregorClassTemplateDecl *
7041eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpClassTemplateSpecializationDecl::getSpecializedTemplate() const {
7051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (SpecializedPartialSpecialization *PartialSpec
70637d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor      = SpecializedTemplate.dyn_cast<SpecializedPartialSpecialization*>())
70737d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor    return PartialSpec->PartialSpecialization->getSpecializedTemplate();
70837d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor  return SpecializedTemplate.get<ClassTemplateDecl*>();
70937d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor}
71037d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor
7114a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo BagnaraSourceRange
7124a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo BagnaraClassTemplateSpecializationDecl::getSourceRange() const {
71309d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara  if (ExplicitInfo) {
71409d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara    SourceLocation Begin = getExternLoc();
71509d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara    if (Begin.isInvalid())
71609d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara      Begin = getTemplateKeywordLoc();
71709d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara    SourceLocation End = getRBraceLoc();
71809d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara    if (End.isInvalid())
71909d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara      End = getTypeAsWritten()->getTypeLoc().getEndLoc();
72009d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara    return SourceRange(Begin, End);
72109d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara  }
72209d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara  else {
72309d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara    // No explicit info available.
72409d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara    llvm::PointerUnion<ClassTemplateDecl *,
72509d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara                       ClassTemplatePartialSpecializationDecl *>
72609d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara      inst_from = getInstantiatedFrom();
72709d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara    if (inst_from.isNull())
72809d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara      return getSpecializedTemplate()->getSourceRange();
72909d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara    if (ClassTemplateDecl *ctd = inst_from.dyn_cast<ClassTemplateDecl*>())
73009d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara      return ctd->getSourceRange();
73109d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara    return inst_from.get<ClassTemplatePartialSpecializationDecl*>()
73209d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara      ->getSourceRange();
73309d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara  }
7344a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo Bagnara}
7354a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo Bagnara
736c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor//===----------------------------------------------------------------------===//
737c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor// ClassTemplatePartialSpecializationDecl Implementation
738c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor//===----------------------------------------------------------------------===//
73999ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid ClassTemplatePartialSpecializationDecl::anchor() { }
74099ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie
7419a299e0575ce235f491014627c7267e2d2cd73deDouglas GregorClassTemplatePartialSpecializationDecl::
7429a299e0575ce235f491014627c7267e2d2cd73deDouglas GregorClassTemplatePartialSpecializationDecl(ASTContext &Context, TagKind TK,
743ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara                                       DeclContext *DC,
744ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara                                       SourceLocation StartLoc,
745ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara                                       SourceLocation IdLoc,
7469a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor                                       TemplateParameterList *Params,
7479a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor                                       ClassTemplateDecl *SpecializedTemplate,
7489a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor                                       const TemplateArgument *Args,
7499a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor                                       unsigned NumArgs,
7509a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor                                       TemplateArgumentLoc *ArgInfos,
7519a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor                                       unsigned NumArgInfos,
7529a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor                               ClassTemplatePartialSpecializationDecl *PrevDecl,
7539a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor                                       unsigned SequenceNumber)
7549a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor  : ClassTemplateSpecializationDecl(Context,
7559a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor                                    ClassTemplatePartialSpecialization,
756ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara                                    TK, DC, StartLoc, IdLoc,
757ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara                                    SpecializedTemplate,
7589a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor                                    Args, NumArgs, PrevDecl),
7599a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor    TemplateParams(Params), ArgsAsWritten(ArgInfos),
7609a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor    NumArgsAsWritten(NumArgInfos), SequenceNumber(SequenceNumber),
7619a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor    InstantiatedFromMember(0, false)
7629a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor{
763787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor  AdoptTemplateParameterList(Params, this);
7649a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor}
7659a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor
766c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas GregorClassTemplatePartialSpecializationDecl *
767c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas GregorClassTemplatePartialSpecializationDecl::
768ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo BagnaraCreate(ASTContext &Context, TagKind TK,DeclContext *DC,
769ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara       SourceLocation StartLoc, SourceLocation IdLoc,
770c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor       TemplateParameterList *Params,
771c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor       ClassTemplateDecl *SpecializedTemplate,
772910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor       const TemplateArgument *Args,
773910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor       unsigned NumArgs,
774d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall       const TemplateArgumentListInfo &ArgInfos,
7753cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall       QualType CanonInjectedType,
776dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor       ClassTemplatePartialSpecializationDecl *PrevDecl,
777dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor       unsigned SequenceNumber) {
778d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  unsigned N = ArgInfos.size();
779833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  TemplateArgumentLoc *ClonedArgs = new (Context) TemplateArgumentLoc[N];
780833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  for (unsigned I = 0; I != N; ++I)
781833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    ClonedArgs[I] = ArgInfos[I];
782833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
783c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor  ClassTemplatePartialSpecializationDecl *Result
784ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara    = new (Context)ClassTemplatePartialSpecializationDecl(Context, TK, DC,
785ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara                                                          StartLoc, IdLoc,
786ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara                                                          Params,
787c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor                                                          SpecializedTemplate,
788910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor                                                          Args, NumArgs,
789833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                                          ClonedArgs, N,
790dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor                                                          PrevDecl,
791dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor                                                          SequenceNumber);
792c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor  Result->setSpecializationKind(TSK_ExplicitSpecialization);
7933cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall
7943cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  Context.getInjectedClassNameType(Result, CanonInjectedType);
795c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor  return Result;
796c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor}
797dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall
79894d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios KyrtzidisClassTemplatePartialSpecializationDecl *
7991e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorClassTemplatePartialSpecializationDecl::CreateDeserialized(ASTContext &C,
8001e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor                                                           unsigned ID) {
8011e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor  void *Mem = AllocateDeserializedDecl(C, ID,
8021e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor                sizeof(ClassTemplatePartialSpecializationDecl));
8031e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor  return new (Mem) ClassTemplatePartialSpecializationDecl();
80494d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis}
80594d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis
806dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall//===----------------------------------------------------------------------===//
807dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall// FriendTemplateDecl Implementation
808dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall//===----------------------------------------------------------------------===//
809dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall
81099ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid FriendTemplateDecl::anchor() { }
81199ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie
812dd4a3b0065b9a7e7b00073df415a798886c090f3John McCallFriendTemplateDecl *FriendTemplateDecl::Create(ASTContext &Context,
813dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall                                               DeclContext *DC,
814dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall                                               SourceLocation L,
815dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall                                               unsigned NParams,
816dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall                                               TemplateParameterList **Params,
817dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall                                               FriendUnion Friend,
818dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall                                               SourceLocation FLoc) {
819dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall  FriendTemplateDecl *Result
820dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall    = new (Context) FriendTemplateDecl(DC, L, NParams, Params, Friend, FLoc);
821dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall  return Result;
822dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall}
823554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis
8241e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorFriendTemplateDecl *FriendTemplateDecl::CreateDeserialized(ASTContext &C,
8251e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor                                                           unsigned ID) {
8261e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor  void *Mem = AllocateDeserializedDecl(C, ID, sizeof(FriendTemplateDecl));
8271e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor  return new (Mem) FriendTemplateDecl(EmptyShell());
828554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis}
8293e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith
8303e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith//===----------------------------------------------------------------------===//
8313e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith// TypeAliasTemplateDecl Implementation
8323e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith//===----------------------------------------------------------------------===//
8333e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith
8343e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard SmithTypeAliasTemplateDecl *TypeAliasTemplateDecl::Create(ASTContext &C,
8353e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith                                                     DeclContext *DC,
8363e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith                                                     SourceLocation L,
8373e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith                                                     DeclarationName Name,
8383e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith                                                  TemplateParameterList *Params,
8393e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith                                                     NamedDecl *Decl) {
8403e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith  AdoptTemplateParameterList(Params, DC);
8413e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith  return new (C) TypeAliasTemplateDecl(DC, L, Name, Params, Decl);
8423e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith}
8433e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith
8441e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorTypeAliasTemplateDecl *TypeAliasTemplateDecl::CreateDeserialized(ASTContext &C,
8451e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor                                                                 unsigned ID) {
8461e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor  void *Mem = AllocateDeserializedDecl(C, ID, sizeof(TypeAliasTemplateDecl));
8471e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor  return new (Mem) TypeAliasTemplateDecl(0, SourceLocation(), DeclarationName(),
8481e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor                                         0, 0);
8493e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith}
8503e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith
8513e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smithvoid TypeAliasTemplateDecl::DeallocateCommon(void *Ptr) {
8523e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith  static_cast<Common *>(Ptr)->~Common();
8533e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith}
8543e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard SmithRedeclarableTemplateDecl::CommonBase *
8553e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard SmithTypeAliasTemplateDecl::newCommon(ASTContext &C) {
8563e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith  Common *CommonPtr = new (C) Common;
8573e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith  C.AddDeallocation(DeallocateCommon, CommonPtr);
8583e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith  return CommonPtr;
8593e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith}
8603e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith
86199ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie//===----------------------------------------------------------------------===//
86299ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie// ClassScopeFunctionSpecializationDecl Implementation
86399ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie//===----------------------------------------------------------------------===//
86499ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie
86599ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid ClassScopeFunctionSpecializationDecl::anchor() { }
8661e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor
8671e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorClassScopeFunctionSpecializationDecl *
8681e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorClassScopeFunctionSpecializationDecl::CreateDeserialized(ASTContext &C,
8691e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor                                                         unsigned ID) {
8701e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor  void *Mem = AllocateDeserializedDecl(C, ID,
8711e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor                sizeof(ClassScopeFunctionSpecializationDecl));
8726b02009359a462ffe633696a4441313b462e6566Nico Weber  return new (Mem) ClassScopeFunctionSpecializationDecl(0, SourceLocation(), 0,
8736b02009359a462ffe633696a4441313b462e6566Nico Weber                                             false, TemplateArgumentListInfo());
8741e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor}
875