DeclTemplate.cpp revision 1a30edb995924b007044ca7abd97d7fbea22007f
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;
461a30edb995924b007044ca7abd97d7fbea22007fRichard Smith  unsigned Align = std::max(llvm::alignOf<TemplateParameterList>(),
471a30edb995924b007044ca7abd97d7fbea22007fRichard Smith                            llvm::alignOf<NamedDecl*>());
48aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor  void *Mem = C.Allocate(Size, Align);
491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return new (Mem) TemplateParameterList(TemplateLoc, LAngleLoc, Params,
50ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas Gregor                                         NumParams, RAngleLoc);
51aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor}
52aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
5362cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregorunsigned TemplateParameterList::getMinRequiredArguments() const {
546952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor  unsigned NumRequiredArgs = 0;
556952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor  for (iterator P = const_cast<TemplateParameterList *>(this)->begin(),
566952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor             PEnd = const_cast<TemplateParameterList *>(this)->end();
576952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor       P != PEnd; ++P) {
586952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor    if ((*P)->isTemplateParameterPack()) {
596952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor      if (NonTypeTemplateParmDecl *NTTP = dyn_cast<NonTypeTemplateParmDecl>(*P))
606952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor        if (NTTP->isExpandedParameterPack()) {
616952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor          NumRequiredArgs += NTTP->getNumExpansionTypes();
626952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor          continue;
636952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor        }
646952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor
6562cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor      break;
666952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor    }
676952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor
686952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor    if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(*P)) {
696952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor      if (TTP->hasDefaultArgument())
706952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor        break;
716952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor    } else if (NonTypeTemplateParmDecl *NTTP
726952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                    = dyn_cast<NonTypeTemplateParmDecl>(*P)) {
736952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor      if (NTTP->hasDefaultArgument())
746952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor        break;
756952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor    } else if (cast<TemplateTemplateParmDecl>(*P)->hasDefaultArgument())
766952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor      break;
776952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor
786952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor    ++NumRequiredArgs;
7962cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor  }
806952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor
8162cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor  return NumRequiredArgs;
8262cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor}
8362cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor
84ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregorunsigned TemplateParameterList::getDepth() const {
85ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor  if (size() == 0)
86ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor    return 0;
87ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor
88ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor  const NamedDecl *FirstParm = getParam(0);
89ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor  if (const TemplateTypeParmDecl *TTP
90ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor        = dyn_cast<TemplateTypeParmDecl>(FirstParm))
91ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor    return TTP->getDepth();
92ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor  else if (const NonTypeTemplateParmDecl *NTTP
93ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor             = dyn_cast<NonTypeTemplateParmDecl>(FirstParm))
94ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor    return NTTP->getDepth();
95ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor  else
96ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor    return cast<TemplateTemplateParmDecl>(FirstParm)->getDepth();
97ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor}
98ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor
99787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregorstatic void AdoptTemplateParameterList(TemplateParameterList *Params,
100787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor                                       DeclContext *Owner) {
101787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor  for (TemplateParameterList::iterator P = Params->begin(),
102787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor                                    PEnd = Params->end();
103787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor       P != PEnd; ++P) {
104787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor    (*P)->setDeclContext(Owner);
105787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor
106787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor    if (TemplateTemplateParmDecl *TTP = dyn_cast<TemplateTemplateParmDecl>(*P))
107787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor      AdoptTemplateParameterList(TTP->getTemplateParameters(), Owner);
108787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor  }
109787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor}
110787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor
111aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
1129eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne// RedeclarableTemplateDecl Implementation
1139eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne//===----------------------------------------------------------------------===//
1149eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne
1159eabebafc165a67812eacc184806e7bf34c5f0a5Peter CollingbourneRedeclarableTemplateDecl::CommonBase *RedeclarableTemplateDecl::getCommonPtr() {
1167c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor  if (!Common) {
1177c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor    // Walk the previous-declaration chain until we either find a declaration
1187c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor    // with a common pointer or we run out of previous declarations.
1197c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor    llvm::SmallVector<RedeclarableTemplateDecl *, 2> PrevDecls;
120ef96ee0be5f100789f451641542a69cd719144d2Douglas Gregor    for (RedeclarableTemplateDecl *Prev = getPreviousDecl(); Prev;
121ef96ee0be5f100789f451641542a69cd719144d2Douglas Gregor         Prev = Prev->getPreviousDecl()) {
1227c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor      if (Prev->Common) {
1237c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor        Common = Prev->Common;
1247c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor        break;
1257c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor      }
1267c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor
1277c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor      PrevDecls.push_back(Prev);
1287c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor    }
1299eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne
1307c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor    // If we never found a common pointer, allocate one now.
1318a8950b13e4d438f732d24f22f63ebe1a9e0075eDouglas Gregor    if (!Common) {
1328a8950b13e4d438f732d24f22f63ebe1a9e0075eDouglas Gregor      // FIXME: If any of the declarations is from an AST file, we probably
1338a8950b13e4d438f732d24f22f63ebe1a9e0075eDouglas Gregor      // need an update record to add the common data.
1348a8950b13e4d438f732d24f22f63ebe1a9e0075eDouglas Gregor
1357c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor      Common = newCommon(getASTContext());
1368a8950b13e4d438f732d24f22f63ebe1a9e0075eDouglas Gregor    }
1377c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor
1387c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor    // Update any previous declarations we saw with the common pointer.
1397c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor    for (unsigned I = 0, N = PrevDecls.size(); I != N; ++I)
1407c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor      PrevDecls[I]->Common = Common;
1418a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne  }
1428a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne
1437c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor  return Common;
144f88718ea0ca0d64b7fd31d109f1d9ec769a9c45fPeter Collingbourne}
145f88718ea0ca0d64b7fd31d109f1d9ec769a9c45fPeter Collingbourne
1464048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbournetemplate <class EntryType>
1474048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbournetypename RedeclarableTemplateDecl::SpecEntryTraits<EntryType>::DeclType*
1484048590d5774fd4b08661b5cf59b6f90b62f283aPeter CollingbourneRedeclarableTemplateDecl::findSpecializationImpl(
149d964d6380945e0505b623050fe6a3f428008fc2aChandler Carruth                                 llvm::FoldingSetVector<EntryType> &Specs,
1504048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne                                 const TemplateArgument *Args, unsigned NumArgs,
1514048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne                                 void *&InsertPos) {
1524048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne  typedef SpecEntryTraits<EntryType> SETraits;
1534048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne  llvm::FoldingSetNodeID ID;
1544048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne  EntryType::Profile(ID,Args,NumArgs, getASTContext());
1554048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne  EntryType *Entry = Specs.FindNodeOrInsertPos(ID, InsertPos);
156ef96ee0be5f100789f451641542a69cd719144d2Douglas Gregor  return Entry ? SETraits::getMostRecentDecl(Entry) : 0;
1574048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne}
1584048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne
159c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor/// \brief Generate the injected template arguments for the given template
160c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor/// parameter list, e.g., for the injected-class-name of a class template.
161c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregorstatic void GenerateInjectedTemplateArgs(ASTContext &Context,
162c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor                                        TemplateParameterList *Params,
163c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor                                         TemplateArgument *Args) {
164c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor  for (TemplateParameterList::iterator Param = Params->begin(),
165c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor                                    ParamEnd = Params->end();
166c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor       Param != ParamEnd; ++Param) {
167c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor    TemplateArgument Arg;
168c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor    if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(*Param)) {
169c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor      QualType ArgType = Context.getTypeDeclType(TTP);
170c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor      if (TTP->isParameterPack())
171c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor        ArgType = Context.getPackExpansionType(ArgType,
172c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor                                               llvm::Optional<unsigned>());
173c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor
174c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor      Arg = TemplateArgument(ArgType);
175c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor    } else if (NonTypeTemplateParmDecl *NTTP =
176c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor               dyn_cast<NonTypeTemplateParmDecl>(*Param)) {
177f4b88a45902af1802a1cb42ba48b1c474474f228John McCall      Expr *E = new (Context) DeclRefExpr(NTTP, /*enclosing*/ false,
178c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor                                  NTTP->getType().getNonLValueExprType(Context),
179c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor                                  Expr::getValueKindForType(NTTP->getType()),
180c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor                                          NTTP->getLocation());
181c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor
182c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor      if (NTTP->isParameterPack())
183c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor        E = new (Context) PackExpansionExpr(Context.DependentTy, E,
184c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor                                            NTTP->getLocation(),
185c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor                                            llvm::Optional<unsigned>());
186c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor      Arg = TemplateArgument(E);
187c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor    } else {
188c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor      TemplateTemplateParmDecl *TTP = cast<TemplateTemplateParmDecl>(*Param);
189c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor      if (TTP->isParameterPack())
190c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor        Arg = TemplateArgument(TemplateName(TTP), llvm::Optional<unsigned>());
191c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor      else
192c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor        Arg = TemplateArgument(TemplateName(TTP));
193c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor    }
194c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor
195c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor    if ((*Param)->isTemplateParameterPack())
196c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor      Arg = TemplateArgument::CreatePackCopy(Context, &Arg, 1);
197c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor
198c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor    *Args++ = Arg;
199c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor  }
200c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor}
201c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor
2029eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne//===----------------------------------------------------------------------===//
203aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// FunctionTemplateDecl Implementation
204aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
205aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
2060054531488928a424666ac11fcdc6bcc5112de52Douglas Gregorvoid FunctionTemplateDecl::DeallocateCommon(void *Ptr) {
2070054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor  static_cast<Common *>(Ptr)->~Common();
2080054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor}
2090054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor
210aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorFunctionTemplateDecl *FunctionTemplateDecl::Create(ASTContext &C,
211aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                                   DeclContext *DC,
212aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                                   SourceLocation L,
213aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                                   DeclarationName Name,
214127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor                                               TemplateParameterList *Params,
215aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                                   NamedDecl *Decl) {
216787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor  AdoptTemplateParameterList(Params, cast<DeclContext>(Decl));
217aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor  return new (C) FunctionTemplateDecl(DC, L, Name, Params, Decl);
218aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor}
219aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
2201e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorFunctionTemplateDecl *FunctionTemplateDecl::CreateDeserialized(ASTContext &C,
2211e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor                                                               unsigned ID) {
2221e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor  void *Mem = AllocateDeserializedDecl(C, ID, sizeof(FunctionTemplateDecl));
2231e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor  return new (Mem) FunctionTemplateDecl(0, SourceLocation(), DeclarationName(),
2241e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor                                        0, 0);
2259a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor}
2269a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor
2276b5415196327fa8ef00f028ba175fafef1738ae1Argyrios KyrtzidisRedeclarableTemplateDecl::CommonBase *
2286b5415196327fa8ef00f028ba175fafef1738ae1Argyrios KyrtzidisFunctionTemplateDecl::newCommon(ASTContext &C) {
2296b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis  Common *CommonPtr = new (C) Common;
2306b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis  C.AddDeallocation(DeallocateCommon, CommonPtr);
2319eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne  return CommonPtr;
2329eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne}
2339eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne
2342c853e401ca406d417eb916e867226050e7be06bArgyrios KyrtzidisFunctionDecl *
2352c853e401ca406d417eb916e867226050e7be06bArgyrios KyrtzidisFunctionTemplateDecl::findSpecialization(const TemplateArgument *Args,
2362c853e401ca406d417eb916e867226050e7be06bArgyrios Kyrtzidis                                         unsigned NumArgs, void *&InsertPos) {
2374048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne  return findSpecializationImpl(getSpecializations(), Args, NumArgs, InsertPos);
2382c853e401ca406d417eb916e867226050e7be06bArgyrios Kyrtzidis}
2392c853e401ca406d417eb916e867226050e7be06bArgyrios Kyrtzidis
2405bbcdbf36f8cf79d99703ef20848c55960065e43Sebastian Redlvoid FunctionTemplateDecl::addSpecialization(
2415bbcdbf36f8cf79d99703ef20848c55960065e43Sebastian Redl      FunctionTemplateSpecializationInfo *Info, void *InsertPos) {
2421e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor  if (InsertPos)
2431e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor    getSpecializations().InsertNode(Info, InsertPos);
2441e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor  else
2451e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor    getSpecializations().GetOrInsertNode(Info);
2465bbcdbf36f8cf79d99703ef20848c55960065e43Sebastian Redl  if (ASTMutationListener *L = getASTMutationListener())
2475bbcdbf36f8cf79d99703ef20848c55960065e43Sebastian Redl    L->AddedCXXTemplateSpecialization(this, Info->Function);
2485bbcdbf36f8cf79d99703ef20848c55960065e43Sebastian Redl}
2495bbcdbf36f8cf79d99703ef20848c55960065e43Sebastian Redl
250c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregorstd::pair<const TemplateArgument *, unsigned>
251c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas GregorFunctionTemplateDecl::getInjectedTemplateArgs() {
252c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor  TemplateParameterList *Params = getTemplateParameters();
253c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor  Common *CommonPtr = getCommonPtr();
254c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor  if (!CommonPtr->InjectedArgs) {
255c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor    CommonPtr->InjectedArgs
256c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor      = new (getASTContext()) TemplateArgument [Params->size()];
257c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor    GenerateInjectedTemplateArgs(getASTContext(), Params,
258c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor                                 CommonPtr->InjectedArgs);
259c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor  }
260c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor
261c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor  return std::make_pair(CommonPtr->InjectedArgs, Params->size());
262c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor}
263c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor
264aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
265aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// ClassTemplateDecl Implementation
266aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
267aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
2680054531488928a424666ac11fcdc6bcc5112de52Douglas Gregorvoid ClassTemplateDecl::DeallocateCommon(void *Ptr) {
2690054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor  static_cast<Common *>(Ptr)->~Common();
2700054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor}
2710054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor
2728731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios KyrtzidisClassTemplateDecl *ClassTemplateDecl::Create(ASTContext &C,
2738731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis                                             DeclContext *DC,
2748731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis                                             SourceLocation L,
2758731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis                                             DeclarationName Name,
2768731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis                                             TemplateParameterList *Params,
2778731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis                                             NamedDecl *Decl,
2788731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis                                             ClassTemplateDecl *PrevDecl) {
279787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor  AdoptTemplateParameterList(Params, cast<DeclContext>(Decl));
2808731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis  ClassTemplateDecl *New = new (C) ClassTemplateDecl(DC, L, Name, Params, Decl);
2815bf1bdc2fedb0c29b5fcdb4abc852aa85b4fe26aArgyrios Kyrtzidis  New->setPreviousDeclaration(PrevDecl);
2828731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis  return New;
2835953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor}
2845953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor
2851e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorClassTemplateDecl *ClassTemplateDecl::CreateDeserialized(ASTContext &C,
2861e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor                                                         unsigned ID) {
2871e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor  void *Mem = AllocateDeserializedDecl(C, ID, sizeof(ClassTemplateDecl));
2881e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor  return new (Mem) ClassTemplateDecl(EmptyShell());
2899a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor}
2909a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor
291c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregorvoid ClassTemplateDecl::LoadLazySpecializations() {
292c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor  Common *CommonPtr = getCommonPtr();
293c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor  if (CommonPtr->LazySpecializations) {
294c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor    ASTContext &Context = getASTContext();
295c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor    uint32_t *Specs = CommonPtr->LazySpecializations;
296c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor    CommonPtr->LazySpecializations = 0;
297c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor    for (uint32_t I = 0, N = *Specs++; I != N; ++I)
298c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor      (void)Context.getExternalSource()->GetExternalDecl(Specs[I]);
299c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor  }
300c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor}
301c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor
302d964d6380945e0505b623050fe6a3f428008fc2aChandler Carruthllvm::FoldingSetVector<ClassTemplateSpecializationDecl> &
303c8e5cf8f725e111965debb7130ef7466c0c73884Douglas GregorClassTemplateDecl::getSpecializations() {
304c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor  LoadLazySpecializations();
305c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor  return getCommonPtr()->Specializations;
306c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor}
307c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor
308d964d6380945e0505b623050fe6a3f428008fc2aChandler Carruthllvm::FoldingSetVector<ClassTemplatePartialSpecializationDecl> &
309c8e5cf8f725e111965debb7130ef7466c0c73884Douglas GregorClassTemplateDecl::getPartialSpecializations() {
310c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor  LoadLazySpecializations();
311c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor  return getCommonPtr()->PartialSpecializations;
312c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor}
313c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor
3146b5415196327fa8ef00f028ba175fafef1738ae1Argyrios KyrtzidisRedeclarableTemplateDecl::CommonBase *
3156b5415196327fa8ef00f028ba175fafef1738ae1Argyrios KyrtzidisClassTemplateDecl::newCommon(ASTContext &C) {
3166b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis  Common *CommonPtr = new (C) Common;
3176b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis  C.AddDeallocation(DeallocateCommon, CommonPtr);
3189eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne  return CommonPtr;
3199eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne}
3209eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne
321cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplateSpecializationDecl *
322cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplateDecl::findSpecialization(const TemplateArgument *Args,
323cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis                                      unsigned NumArgs, void *&InsertPos) {
3244048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne  return findSpecializationImpl(getSpecializations(), Args, NumArgs, InsertPos);
325cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis}
326cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis
327bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidisvoid ClassTemplateDecl::AddSpecialization(ClassTemplateSpecializationDecl *D,
328bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis                                          void *InsertPos) {
3291e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor  if (InsertPos)
3301e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor    getSpecializations().InsertNode(D, InsertPos);
3311e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor  else {
3321e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor    ClassTemplateSpecializationDecl *Existing
3331e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor      = getSpecializations().GetOrInsertNode(D);
3341e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor    (void)Existing;
3351e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor    assert(Existing->isCanonicalDecl() && "Non-canonical specialization?");
3361e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor  }
337bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis  if (ASTMutationListener *L = getASTMutationListener())
338bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis    L->AddedCXXTemplateSpecialization(this, D);
339bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis}
340bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis
341cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplatePartialSpecializationDecl *
342cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplateDecl::findPartialSpecialization(const TemplateArgument *Args,
343cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis                                             unsigned NumArgs,
344cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis                                             void *&InsertPos) {
3454048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne  return findSpecializationImpl(getPartialSpecializations(), Args, NumArgs,
3464048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne                                InsertPos);
347cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis}
348cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis
349bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidisvoid ClassTemplateDecl::AddPartialSpecialization(
350bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis                                      ClassTemplatePartialSpecializationDecl *D,
351bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis                                      void *InsertPos) {
3521e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor  if (InsertPos)
3531e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor    getPartialSpecializations().InsertNode(D, InsertPos);
3541e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor  else {
3551e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor    ClassTemplatePartialSpecializationDecl *Existing
3561e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor      = getPartialSpecializations().GetOrInsertNode(D);
3571e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor    (void)Existing;
3581e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor    assert(Existing->isCanonicalDecl() && "Non-canonical specialization?");
3591e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor  }
3601e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor
361bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis  if (ASTMutationListener *L = getASTMutationListener())
362bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis    L->AddedCXXTemplateSpecialization(this, D);
363bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis}
364bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis
365dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregorvoid ClassTemplateDecl::getPartialSpecializations(
3665f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner          SmallVectorImpl<ClassTemplatePartialSpecializationDecl *> &PS) {
367d964d6380945e0505b623050fe6a3f428008fc2aChandler Carruth  llvm::FoldingSetVector<ClassTemplatePartialSpecializationDecl> &PartialSpecs
3685bf1bdc2fedb0c29b5fcdb4abc852aa85b4fe26aArgyrios Kyrtzidis    = getPartialSpecializations();
369dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor  PS.clear();
370dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor  PS.resize(PartialSpecs.size());
371d964d6380945e0505b623050fe6a3f428008fc2aChandler Carruth  for (llvm::FoldingSetVector<ClassTemplatePartialSpecializationDecl>::iterator
372dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor       P = PartialSpecs.begin(), PEnd = PartialSpecs.end();
373dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor       P != PEnd; ++P) {
374dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor    assert(!PS[P->getSequenceNumber()]);
375ef96ee0be5f100789f451641542a69cd719144d2Douglas Gregor    PS[P->getSequenceNumber()] = P->getMostRecentDecl();
376dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor  }
377dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor}
378dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor
379b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas GregorClassTemplatePartialSpecializationDecl *
380b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas GregorClassTemplateDecl::findPartialSpecialization(QualType T) {
381b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor  ASTContext &Context = getASTContext();
382d964d6380945e0505b623050fe6a3f428008fc2aChandler Carruth  using llvm::FoldingSetVector;
383d964d6380945e0505b623050fe6a3f428008fc2aChandler Carruth  typedef FoldingSetVector<ClassTemplatePartialSpecializationDecl>::iterator
384b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor    partial_spec_iterator;
385b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor  for (partial_spec_iterator P = getPartialSpecializations().begin(),
386b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor                          PEnd = getPartialSpecializations().end();
387b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor       P != PEnd; ++P) {
38831f17ecbef57b5679c017c375db330546b7b5145John McCall    if (Context.hasSameType(P->getInjectedSpecializationType(), T))
389ef96ee0be5f100789f451641542a69cd719144d2Douglas Gregor      return P->getMostRecentDecl();
390cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis  }
391cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis
392cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis  return 0;
393cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis}
394cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis
395cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplatePartialSpecializationDecl *
396cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplateDecl::findPartialSpecInstantiatedFromMember(
397cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis                                    ClassTemplatePartialSpecializationDecl *D) {
398cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis  Decl *DCanon = D->getCanonicalDecl();
399d964d6380945e0505b623050fe6a3f428008fc2aChandler Carruth  for (llvm::FoldingSetVector<ClassTemplatePartialSpecializationDecl>::iterator
400cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis            P = getPartialSpecializations().begin(),
401cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis         PEnd = getPartialSpecializations().end();
402cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis       P != PEnd; ++P) {
403cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis    if (P->getInstantiatedFromMember()->getCanonicalDecl() == DCanon)
404ef96ee0be5f100789f451641542a69cd719144d2Douglas Gregor      return P->getMostRecentDecl();
405b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor  }
4061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
407b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor  return 0;
408b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor}
409b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor
4103cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCallQualType
41124bae92f08ae098cc50a602d8cf1273b423e14daDouglas GregorClassTemplateDecl::getInjectedClassNameSpecialization() {
4125bf1bdc2fedb0c29b5fcdb4abc852aa85b4fe26aArgyrios Kyrtzidis  Common *CommonPtr = getCommonPtr();
4137da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor  if (!CommonPtr->InjectedClassNameType.isNull())
4147da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor    return CommonPtr->InjectedClassNameType;
4157da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor
416b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor  // C++0x [temp.dep.type]p2:
417b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor  //  The template argument list of a primary template is a template argument
418b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor  //  list in which the nth template argument has the value of the nth template
419b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor  //  parameter of the class template. If the nth template parameter is a
420b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor  //  template parameter pack (14.5.3), the nth template argument is a pack
421b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor  //  expansion (14.5.3) whose pattern is the name of the template parameter
422b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor  //  pack.
42324bae92f08ae098cc50a602d8cf1273b423e14daDouglas Gregor  ASTContext &Context = getASTContext();
4247da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor  TemplateParameterList *Params = getTemplateParameters();
4255f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  SmallVector<TemplateArgument, 16> TemplateArgs;
426c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor  TemplateArgs.resize(Params->size());
427c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor  GenerateInjectedTemplateArgs(getASTContext(), Params, TemplateArgs.data());
4287da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor  CommonPtr->InjectedClassNameType
4291275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor    = Context.getTemplateSpecializationType(TemplateName(this),
4307da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor                                            &TemplateArgs[0],
4311275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor                                            TemplateArgs.size());
4327da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor  return CommonPtr->InjectedClassNameType;
4337da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor}
4347da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor
435aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
436aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// TemplateTypeParm Allocation/Deallocation Method Implementations
437aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
438aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
439aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorTemplateTypeParmDecl *
4404ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadTemplateTypeParmDecl::Create(const ASTContext &C, DeclContext *DC,
441344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara                             SourceLocation KeyLoc, SourceLocation NameLoc,
442344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara                             unsigned D, unsigned P, IdentifierInfo *Id,
443344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara                             bool Typename, bool ParameterPack) {
4444fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth  TemplateTypeParmDecl *TTPDecl =
4454fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth    new (C) TemplateTypeParmDecl(DC, KeyLoc, NameLoc, Id, Typename);
4464fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth  QualType TTPType = C.getTemplateTypeParmType(D, P, ParameterPack, TTPDecl);
4474fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth  TTPDecl->TypeForDecl = TTPType.getTypePtr();
4484fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth  return TTPDecl;
449aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor}
450aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
451b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios KyrtzidisTemplateTypeParmDecl *
4521e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorTemplateTypeParmDecl::CreateDeserialized(const ASTContext &C, unsigned ID) {
4531e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor  void *Mem = AllocateDeserializedDecl(C, ID, sizeof(TemplateTypeParmDecl));
4541e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor  return new (Mem) TemplateTypeParmDecl(0, SourceLocation(), SourceLocation(),
4551e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor                                        0, false);
456b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios Kyrtzidis}
457b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios Kyrtzidis
458833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallSourceLocation TemplateTypeParmDecl::getDefaultArgumentLoc() const {
45977d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara  return hasDefaultArgument()
46077d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara    ? DefaultArgument->getTypeLoc().getBeginLoc()
46177d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara    : SourceLocation();
46277d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara}
46377d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara
46477d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo BagnaraSourceRange TemplateTypeParmDecl::getSourceRange() const {
46577d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara  if (hasDefaultArgument() && !defaultArgumentWasInherited())
466344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara    return SourceRange(getLocStart(),
46777d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara                       DefaultArgument->getTypeLoc().getEndLoc());
46877d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara  else
469344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara    return TypeDecl::getSourceRange();
470833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall}
471833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
472ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregorunsigned TemplateTypeParmDecl::getDepth() const {
473ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor  return TypeForDecl->getAs<TemplateTypeParmType>()->getDepth();
474ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor}
475ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor
476ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregorunsigned TemplateTypeParmDecl::getIndex() const {
477ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor  return TypeForDecl->getAs<TemplateTypeParmType>()->getIndex();
478ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor}
479ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor
4804fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruthbool TemplateTypeParmDecl::isParameterPack() const {
4814fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth  return TypeForDecl->getAs<TemplateTypeParmType>()->isParameterPack();
4824fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth}
4834fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth
484aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
485aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// NonTypeTemplateParmDecl Method Implementations
486aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
487aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
4886952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas GregorNonTypeTemplateParmDecl::NonTypeTemplateParmDecl(DeclContext *DC,
489ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara                                                 SourceLocation StartLoc,
490ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara                                                 SourceLocation IdLoc,
491ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara                                                 unsigned D, unsigned P,
492ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara                                                 IdentifierInfo *Id,
4936952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                                 QualType T,
4946952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                                 TypeSourceInfo *TInfo,
4956952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                                 const QualType *ExpandedTypes,
4966952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                                 unsigned NumExpandedTypes,
4976952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                                TypeSourceInfo **ExpandedTInfos)
498ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara  : DeclaratorDecl(NonTypeTemplateParm, DC, IdLoc, Id, T, TInfo, StartLoc),
4996952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor    TemplateParmPosition(D, P), DefaultArgumentAndInherited(0, false),
5006952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor    ParameterPack(true), ExpandedParameterPack(true),
5016952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor    NumExpandedTypes(NumExpandedTypes)
5026952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor{
5036952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor  if (ExpandedTypes && ExpandedTInfos) {
5046952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor    void **TypesAndInfos = reinterpret_cast<void **>(this + 1);
5056952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor    for (unsigned I = 0; I != NumExpandedTypes; ++I) {
5066952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor      TypesAndInfos[2*I] = ExpandedTypes[I].getAsOpaquePtr();
5076952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor      TypesAndInfos[2*I + 1] = ExpandedTInfos[I];
5086952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor    }
5096952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor  }
5106952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor}
5116952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor
512aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorNonTypeTemplateParmDecl *
5134ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadNonTypeTemplateParmDecl::Create(const ASTContext &C, DeclContext *DC,
514ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara                                SourceLocation StartLoc, SourceLocation IdLoc,
515ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara                                unsigned D, unsigned P, IdentifierInfo *Id,
516ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara                                QualType T, bool ParameterPack,
517ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara                                TypeSourceInfo *TInfo) {
518ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara  return new (C) NonTypeTemplateParmDecl(DC, StartLoc, IdLoc, D, P, Id,
519ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara                                         T, ParameterPack, TInfo);
520aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor}
521aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
5226952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas GregorNonTypeTemplateParmDecl *
5236952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas GregorNonTypeTemplateParmDecl::Create(const ASTContext &C, DeclContext *DC,
524ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara                                SourceLocation StartLoc, SourceLocation IdLoc,
525ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara                                unsigned D, unsigned P,
5266952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                IdentifierInfo *Id, QualType T,
5276952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                TypeSourceInfo *TInfo,
5286952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                const QualType *ExpandedTypes,
5296952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                unsigned NumExpandedTypes,
5306952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                TypeSourceInfo **ExpandedTInfos) {
5316952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor  unsigned Size = sizeof(NonTypeTemplateParmDecl)
5326952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                + NumExpandedTypes * 2 * sizeof(void*);
5336952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor  void *Mem = C.Allocate(Size);
534ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara  return new (Mem) NonTypeTemplateParmDecl(DC, StartLoc, IdLoc,
535ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara                                           D, P, Id, T, TInfo,
5366952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                           ExpandedTypes, NumExpandedTypes,
5376952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                           ExpandedTInfos);
5386952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor}
5396952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor
5401e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorNonTypeTemplateParmDecl *
5411e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorNonTypeTemplateParmDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
5421e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor  void *Mem = AllocateDeserializedDecl(C, ID, sizeof(NonTypeTemplateParmDecl));
5431e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor  return new (Mem) NonTypeTemplateParmDecl(0, SourceLocation(),
5441e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor                                           SourceLocation(), 0, 0, 0,
5451e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor                                           QualType(), false, 0);
5461e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor}
5471e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor
5481e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorNonTypeTemplateParmDecl *
5491e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorNonTypeTemplateParmDecl::CreateDeserialized(ASTContext &C, unsigned ID,
5501e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor                                            unsigned NumExpandedTypes) {
5511e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor  unsigned Size = sizeof(NonTypeTemplateParmDecl)
5521e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor                + NumExpandedTypes * 2 * sizeof(void*);
5531e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor
5541e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor  void *Mem = AllocateDeserializedDecl(C, ID, Size);
5551e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor  return new (Mem) NonTypeTemplateParmDecl(0, SourceLocation(),
5561e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor                                           SourceLocation(), 0, 0, 0,
5571e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor                                           QualType(), 0, 0, NumExpandedTypes,
5581e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor                                           0);
5591e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor}
5601e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor
56176a40219ee5624d78aba167dce02bdbaa930955fJohn McCallSourceRange NonTypeTemplateParmDecl::getSourceRange() const {
562ee4bfd412db491c489fc2ee74916edd73f9c618aAbramo Bagnara  if (hasDefaultArgument() && !defaultArgumentWasInherited())
563a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara    return SourceRange(getOuterLocStart(),
564a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara                       getDefaultArgument()->getSourceRange().getEnd());
565a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara  return DeclaratorDecl::getSourceRange();
56676a40219ee5624d78aba167dce02bdbaa930955fJohn McCall}
56776a40219ee5624d78aba167dce02bdbaa930955fJohn McCall
568d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas GregorSourceLocation NonTypeTemplateParmDecl::getDefaultArgumentLoc() const {
569d92f7a297c0ed3f7d0ebcbb557e1d4c1925b8c72Abramo Bagnara  return hasDefaultArgument()
570d92f7a297c0ed3f7d0ebcbb557e1d4c1925b8c72Abramo Bagnara    ? getDefaultArgument()->getSourceRange().getBegin()
571d92f7a297c0ed3f7d0ebcbb557e1d4c1925b8c72Abramo Bagnara    : SourceLocation();
572d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas Gregor}
573d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas Gregor
574aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
575aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// TemplateTemplateParmDecl Method Implementations
576aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
577aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
57899ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid TemplateTemplateParmDecl::anchor() { }
57999ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie
580aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorTemplateTemplateParmDecl *
5814ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadTemplateTemplateParmDecl::Create(const ASTContext &C, DeclContext *DC,
582aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                 SourceLocation L, unsigned D, unsigned P,
58361c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor                                 bool ParameterPack, IdentifierInfo *Id,
584aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                 TemplateParameterList *Params) {
58561c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor  return new (C) TemplateTemplateParmDecl(DC, L, D, P, ParameterPack, Id,
58661c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor                                          Params);
587aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor}
588aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
5891e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorTemplateTemplateParmDecl *
5901e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorTemplateTemplateParmDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
5911e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor  void *Mem = AllocateDeserializedDecl(C, ID, sizeof(TemplateTemplateParmDecl));
5921e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor  return new (Mem) TemplateTemplateParmDecl(0, SourceLocation(), 0, 0, false,
5931e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor                                            0, 0);
5941e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor}
5951e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor
5963e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor//===----------------------------------------------------------------------===//
5977e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor// TemplateArgumentList Implementation
5987e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor//===----------------------------------------------------------------------===//
599910f8008fea79120489a53593fe971b0b8a4a740Douglas GregorTemplateArgumentList *
600910f8008fea79120489a53593fe971b0b8a4a740Douglas GregorTemplateArgumentList::CreateCopy(ASTContext &Context,
601910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor                                 const TemplateArgument *Args,
602910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor                                 unsigned NumArgs) {
603910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor  std::size_t Size = sizeof(TemplateArgumentList)
604910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor                   + NumArgs * sizeof(TemplateArgument);
605910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor  void *Mem = Context.Allocate(Size);
606910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor  TemplateArgument *StoredArgs
607910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor    = reinterpret_cast<TemplateArgument *>(
608910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor                                static_cast<TemplateArgumentList *>(Mem) + 1);
609910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor  std::uninitialized_copy(Args, Args + NumArgs, StoredArgs);
610910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor  return new (Mem) TemplateArgumentList(StoredArgs, NumArgs, true);
61194d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis}
61294d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis
61371a7605977113c795edd44fcbd2302ad49506653Argyrios KyrtzidisFunctionTemplateSpecializationInfo *
61471a7605977113c795edd44fcbd2302ad49506653Argyrios KyrtzidisFunctionTemplateSpecializationInfo::Create(ASTContext &C, FunctionDecl *FD,
61571a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis                                           FunctionTemplateDecl *Template,
61671a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis                                           TemplateSpecializationKind TSK,
61771a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis                                       const TemplateArgumentList *TemplateArgs,
61871a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis                          const TemplateArgumentListInfo *TemplateArgsAsWritten,
61971a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis                                           SourceLocation POI) {
62071a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis  const ASTTemplateArgumentListInfo *ArgsAsWritten = 0;
62171a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis  if (TemplateArgsAsWritten)
62271a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis    ArgsAsWritten = ASTTemplateArgumentListInfo::Create(C,
62371a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis                                                        *TemplateArgsAsWritten);
62471a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis
62571a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis  return new (C) FunctionTemplateSpecializationInfo(FD, Template, TSK,
62671a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis                                                    TemplateArgs,
62771a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis                                                    ArgsAsWritten,
62871a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis                                                    POI);
62971a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis}
63071a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis
6317e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor//===----------------------------------------------------------------------===//
63299ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie// TemplateDecl Implementation
63399ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie//===----------------------------------------------------------------------===//
63499ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie
63599ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid TemplateDecl::anchor() { }
63699ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie
63799ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie//===----------------------------------------------------------------------===//
6383e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor// ClassTemplateSpecializationDecl Implementation
6393e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor//===----------------------------------------------------------------------===//
6403e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas GregorClassTemplateSpecializationDecl::
64113c8577201e4fc0ddac5f09d05fd1778832137d1Douglas GregorClassTemplateSpecializationDecl(ASTContext &Context, Kind DK, TagKind TK,
642ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara                                DeclContext *DC, SourceLocation StartLoc,
643ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara                                SourceLocation IdLoc,
6443e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor                                ClassTemplateDecl *SpecializedTemplate,
645910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor                                const TemplateArgument *Args,
646910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor                                unsigned NumArgs,
6478e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor                                ClassTemplateSpecializationDecl *PrevDecl)
648ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara  : CXXRecordDecl(DK, TK, DC, StartLoc, IdLoc,
6498e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor                  SpecializedTemplate->getIdentifier(),
6508e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor                  PrevDecl),
6513e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor    SpecializedTemplate(SpecializedTemplate),
652c98971d5c994caed9452aeadd0122c855e0f4de1Abramo Bagnara    ExplicitInfo(0),
653910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor    TemplateArgs(TemplateArgumentList::CreateCopy(Context, Args, NumArgs)),
6547e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor    SpecializationKind(TSK_Undeclared) {
6553e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor}
6561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
65794d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios KyrtzidisClassTemplateSpecializationDecl::ClassTemplateSpecializationDecl(Kind DK)
658ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara  : CXXRecordDecl(DK, TTK_Struct, 0, SourceLocation(), SourceLocation(), 0, 0),
65994d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis    ExplicitInfo(0),
66094d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis    SpecializationKind(TSK_Undeclared) {
66194d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis}
66294d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis
6633e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas GregorClassTemplateSpecializationDecl *
66413c8577201e4fc0ddac5f09d05fd1778832137d1Douglas GregorClassTemplateSpecializationDecl::Create(ASTContext &Context, TagKind TK,
665ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara                                        DeclContext *DC,
666ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara                                        SourceLocation StartLoc,
667ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara                                        SourceLocation IdLoc,
6683e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor                                        ClassTemplateDecl *SpecializedTemplate,
669910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor                                        const TemplateArgument *Args,
670910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor                                        unsigned NumArgs,
671cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor                                   ClassTemplateSpecializationDecl *PrevDecl) {
672cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor  ClassTemplateSpecializationDecl *Result
6731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    = new (Context)ClassTemplateSpecializationDecl(Context,
674c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor                                                   ClassTemplateSpecialization,
675ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara                                                   TK, DC, StartLoc, IdLoc,
6767e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor                                                   SpecializedTemplate,
677910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor                                                   Args, NumArgs,
6788e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor                                                   PrevDecl);
679cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor  Context.getTypeDeclType(Result, PrevDecl);
680cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor  return Result;
6813e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor}
682c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor
68394d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios KyrtzidisClassTemplateSpecializationDecl *
6841e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorClassTemplateSpecializationDecl::CreateDeserialized(ASTContext &C,
6851e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor                                                    unsigned ID) {
6861e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor  void *Mem = AllocateDeserializedDecl(C, ID,
6871e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor                                       sizeof(ClassTemplateSpecializationDecl));
6881e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor  return new (Mem) ClassTemplateSpecializationDecl(ClassTemplateSpecialization);
68994d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis}
69094d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis
691da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregorvoid
692da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas GregorClassTemplateSpecializationDecl::getNameForDiagnostic(std::string &S,
693da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor                                                  const PrintingPolicy &Policy,
694da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor                                                      bool Qualified) const {
695da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor  NamedDecl::getNameForDiagnostic(S, Policy, Qualified);
696da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor
697da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor  const TemplateArgumentList &TemplateArgs = getTemplateArgs();
698da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor  S += TemplateSpecializationType::PrintTemplateArgumentList(
699da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor                                                          TemplateArgs.data(),
700da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor                                                          TemplateArgs.size(),
701da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor                                                             Policy);
702da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor}
703da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor
70437d93e9252026d4fb836d9c05d0122a2d46e56beDouglas GregorClassTemplateDecl *
7051eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpClassTemplateSpecializationDecl::getSpecializedTemplate() const {
7061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (SpecializedPartialSpecialization *PartialSpec
70737d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor      = SpecializedTemplate.dyn_cast<SpecializedPartialSpecialization*>())
70837d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor    return PartialSpec->PartialSpecialization->getSpecializedTemplate();
70937d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor  return SpecializedTemplate.get<ClassTemplateDecl*>();
71037d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor}
71137d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor
7124a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo BagnaraSourceRange
7134a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo BagnaraClassTemplateSpecializationDecl::getSourceRange() const {
71409d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara  if (ExplicitInfo) {
71509d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara    SourceLocation Begin = getExternLoc();
71609d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara    if (Begin.isInvalid())
71709d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara      Begin = getTemplateKeywordLoc();
71809d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara    SourceLocation End = getRBraceLoc();
71909d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara    if (End.isInvalid())
72009d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara      End = getTypeAsWritten()->getTypeLoc().getEndLoc();
72109d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara    return SourceRange(Begin, End);
72209d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara  }
72309d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara  else {
72409d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara    // No explicit info available.
72509d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara    llvm::PointerUnion<ClassTemplateDecl *,
72609d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara                       ClassTemplatePartialSpecializationDecl *>
72709d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara      inst_from = getInstantiatedFrom();
72809d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara    if (inst_from.isNull())
72909d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara      return getSpecializedTemplate()->getSourceRange();
73009d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara    if (ClassTemplateDecl *ctd = inst_from.dyn_cast<ClassTemplateDecl*>())
73109d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara      return ctd->getSourceRange();
73209d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara    return inst_from.get<ClassTemplatePartialSpecializationDecl*>()
73309d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara      ->getSourceRange();
73409d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara  }
7354a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo Bagnara}
7364a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo Bagnara
737c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor//===----------------------------------------------------------------------===//
738c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor// ClassTemplatePartialSpecializationDecl Implementation
739c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor//===----------------------------------------------------------------------===//
74099ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid ClassTemplatePartialSpecializationDecl::anchor() { }
74199ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie
7429a299e0575ce235f491014627c7267e2d2cd73deDouglas GregorClassTemplatePartialSpecializationDecl::
7439a299e0575ce235f491014627c7267e2d2cd73deDouglas GregorClassTemplatePartialSpecializationDecl(ASTContext &Context, TagKind TK,
744ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara                                       DeclContext *DC,
745ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara                                       SourceLocation StartLoc,
746ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara                                       SourceLocation IdLoc,
7479a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor                                       TemplateParameterList *Params,
7489a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor                                       ClassTemplateDecl *SpecializedTemplate,
7499a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor                                       const TemplateArgument *Args,
7509a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor                                       unsigned NumArgs,
7519a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor                                       TemplateArgumentLoc *ArgInfos,
7529a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor                                       unsigned NumArgInfos,
7539a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor                               ClassTemplatePartialSpecializationDecl *PrevDecl,
7549a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor                                       unsigned SequenceNumber)
7559a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor  : ClassTemplateSpecializationDecl(Context,
7569a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor                                    ClassTemplatePartialSpecialization,
757ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara                                    TK, DC, StartLoc, IdLoc,
758ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara                                    SpecializedTemplate,
7599a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor                                    Args, NumArgs, PrevDecl),
7609a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor    TemplateParams(Params), ArgsAsWritten(ArgInfos),
7619a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor    NumArgsAsWritten(NumArgInfos), SequenceNumber(SequenceNumber),
7629a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor    InstantiatedFromMember(0, false)
7639a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor{
764787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor  AdoptTemplateParameterList(Params, this);
7659a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor}
7669a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor
767c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas GregorClassTemplatePartialSpecializationDecl *
768c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas GregorClassTemplatePartialSpecializationDecl::
769ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo BagnaraCreate(ASTContext &Context, TagKind TK,DeclContext *DC,
770ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara       SourceLocation StartLoc, SourceLocation IdLoc,
771c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor       TemplateParameterList *Params,
772c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor       ClassTemplateDecl *SpecializedTemplate,
773910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor       const TemplateArgument *Args,
774910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor       unsigned NumArgs,
775d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall       const TemplateArgumentListInfo &ArgInfos,
7763cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall       QualType CanonInjectedType,
777dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor       ClassTemplatePartialSpecializationDecl *PrevDecl,
778dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor       unsigned SequenceNumber) {
779d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  unsigned N = ArgInfos.size();
780833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  TemplateArgumentLoc *ClonedArgs = new (Context) TemplateArgumentLoc[N];
781833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  for (unsigned I = 0; I != N; ++I)
782833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    ClonedArgs[I] = ArgInfos[I];
783833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
784c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor  ClassTemplatePartialSpecializationDecl *Result
785ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara    = new (Context)ClassTemplatePartialSpecializationDecl(Context, TK, DC,
786ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara                                                          StartLoc, IdLoc,
787ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara                                                          Params,
788c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor                                                          SpecializedTemplate,
789910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor                                                          Args, NumArgs,
790833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                                          ClonedArgs, N,
791dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor                                                          PrevDecl,
792dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor                                                          SequenceNumber);
793c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor  Result->setSpecializationKind(TSK_ExplicitSpecialization);
7943cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall
7953cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  Context.getInjectedClassNameType(Result, CanonInjectedType);
796c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor  return Result;
797c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor}
798dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall
79994d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios KyrtzidisClassTemplatePartialSpecializationDecl *
8001e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorClassTemplatePartialSpecializationDecl::CreateDeserialized(ASTContext &C,
8011e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor                                                           unsigned ID) {
8021e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor  void *Mem = AllocateDeserializedDecl(C, ID,
8031e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor                sizeof(ClassTemplatePartialSpecializationDecl));
8041e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor  return new (Mem) ClassTemplatePartialSpecializationDecl();
80594d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis}
80694d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis
807dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall//===----------------------------------------------------------------------===//
808dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall// FriendTemplateDecl Implementation
809dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall//===----------------------------------------------------------------------===//
810dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall
81199ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid FriendTemplateDecl::anchor() { }
81299ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie
813dd4a3b0065b9a7e7b00073df415a798886c090f3John McCallFriendTemplateDecl *FriendTemplateDecl::Create(ASTContext &Context,
814dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall                                               DeclContext *DC,
815dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall                                               SourceLocation L,
816dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall                                               unsigned NParams,
817dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall                                               TemplateParameterList **Params,
818dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall                                               FriendUnion Friend,
819dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall                                               SourceLocation FLoc) {
820dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall  FriendTemplateDecl *Result
821dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall    = new (Context) FriendTemplateDecl(DC, L, NParams, Params, Friend, FLoc);
822dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall  return Result;
823dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall}
824554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis
8251e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorFriendTemplateDecl *FriendTemplateDecl::CreateDeserialized(ASTContext &C,
8261e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor                                                           unsigned ID) {
8271e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor  void *Mem = AllocateDeserializedDecl(C, ID, sizeof(FriendTemplateDecl));
8281e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor  return new (Mem) FriendTemplateDecl(EmptyShell());
829554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis}
8303e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith
8313e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith//===----------------------------------------------------------------------===//
8323e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith// TypeAliasTemplateDecl Implementation
8333e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith//===----------------------------------------------------------------------===//
8343e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith
8353e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard SmithTypeAliasTemplateDecl *TypeAliasTemplateDecl::Create(ASTContext &C,
8363e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith                                                     DeclContext *DC,
8373e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith                                                     SourceLocation L,
8383e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith                                                     DeclarationName Name,
8393e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith                                                  TemplateParameterList *Params,
8403e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith                                                     NamedDecl *Decl) {
8413e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith  AdoptTemplateParameterList(Params, DC);
8423e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith  return new (C) TypeAliasTemplateDecl(DC, L, Name, Params, Decl);
8433e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith}
8443e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith
8451e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorTypeAliasTemplateDecl *TypeAliasTemplateDecl::CreateDeserialized(ASTContext &C,
8461e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor                                                                 unsigned ID) {
8471e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor  void *Mem = AllocateDeserializedDecl(C, ID, sizeof(TypeAliasTemplateDecl));
8481e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor  return new (Mem) TypeAliasTemplateDecl(0, SourceLocation(), DeclarationName(),
8491e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor                                         0, 0);
8503e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith}
8513e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith
8523e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smithvoid TypeAliasTemplateDecl::DeallocateCommon(void *Ptr) {
8533e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith  static_cast<Common *>(Ptr)->~Common();
8543e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith}
8553e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard SmithRedeclarableTemplateDecl::CommonBase *
8563e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard SmithTypeAliasTemplateDecl::newCommon(ASTContext &C) {
8573e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith  Common *CommonPtr = new (C) Common;
8583e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith  C.AddDeallocation(DeallocateCommon, CommonPtr);
8593e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith  return CommonPtr;
8603e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith}
8613e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith
86299ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie//===----------------------------------------------------------------------===//
86399ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie// ClassScopeFunctionSpecializationDecl Implementation
86499ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie//===----------------------------------------------------------------------===//
86599ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie
86699ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid ClassScopeFunctionSpecializationDecl::anchor() { }
8671e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor
8681e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorClassScopeFunctionSpecializationDecl *
8691e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorClassScopeFunctionSpecializationDecl::CreateDeserialized(ASTContext &C,
8701e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor                                                         unsigned ID) {
8711e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor  void *Mem = AllocateDeserializedDecl(C, ID,
8721e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor                sizeof(ClassScopeFunctionSpecializationDecl));
8736b02009359a462ffe633696a4441313b462e6566Nico Weber  return new (Mem) ClassScopeFunctionSpecializationDecl(0, SourceLocation(), 0,
8746b02009359a462ffe633696a4441313b462e6566Nico Weber                                             false, TemplateArgumentListInfo());
8751e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor}
876