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),
356964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith    NumParams(NumParams), ContainsUnexpandedParameterPack(false) {
366964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith  assert(this->NumParams == NumParams && "Too many template parameters");
376964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith  for (unsigned Idx = 0; Idx < NumParams; ++Idx) {
386964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith    NamedDecl *P = Params[Idx];
396964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith    begin()[Idx] = P;
406964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith
416964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith    if (!P->isTemplateParameterPack()) {
426964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith      if (NonTypeTemplateParmDecl *NTTP = dyn_cast<NonTypeTemplateParmDecl>(P))
436964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith        if (NTTP->getType()->containsUnexpandedParameterPack())
446964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith          ContainsUnexpandedParameterPack = true;
456964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith
466964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith      if (TemplateTemplateParmDecl *TTP = dyn_cast<TemplateTemplateParmDecl>(P))
476964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith        if (TTP->getTemplateParameters()->containsUnexpandedParameterPack())
486964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith          ContainsUnexpandedParameterPack = true;
496964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith
506964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith      // FIXME: If a default argument contains an unexpanded parameter pack, the
516964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith      // template parameter list does too.
526964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith    }
536964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith  }
54aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor}
55aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
56aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorTemplateParameterList *
574ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadTemplateParameterList::Create(const ASTContext &C, SourceLocation TemplateLoc,
58bf4ea56cdc376cef5a12abf6bf18dc34805c2226Douglas Gregor                              SourceLocation LAngleLoc, NamedDecl **Params,
59ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas Gregor                              unsigned NumParams, SourceLocation RAngleLoc) {
60bf4ea56cdc376cef5a12abf6bf18dc34805c2226Douglas Gregor  unsigned Size = sizeof(TemplateParameterList)
61bf4ea56cdc376cef5a12abf6bf18dc34805c2226Douglas Gregor                + sizeof(NamedDecl *) * NumParams;
621a30edb995924b007044ca7abd97d7fbea22007fRichard Smith  unsigned Align = std::max(llvm::alignOf<TemplateParameterList>(),
631a30edb995924b007044ca7abd97d7fbea22007fRichard Smith                            llvm::alignOf<NamedDecl*>());
64aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor  void *Mem = C.Allocate(Size, Align);
651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return new (Mem) TemplateParameterList(TemplateLoc, LAngleLoc, Params,
66ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas Gregor                                         NumParams, RAngleLoc);
67aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor}
68aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
6962cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregorunsigned TemplateParameterList::getMinRequiredArguments() const {
706952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor  unsigned NumRequiredArgs = 0;
716952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor  for (iterator P = const_cast<TemplateParameterList *>(this)->begin(),
726952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor             PEnd = const_cast<TemplateParameterList *>(this)->end();
736952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor       P != PEnd; ++P) {
746952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor    if ((*P)->isTemplateParameterPack()) {
756952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor      if (NonTypeTemplateParmDecl *NTTP = dyn_cast<NonTypeTemplateParmDecl>(*P))
766952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor        if (NTTP->isExpandedParameterPack()) {
776952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor          NumRequiredArgs += NTTP->getNumExpansionTypes();
786952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor          continue;
796952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor        }
806952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor
8162cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor      break;
826952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor    }
836952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor
846952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor    if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(*P)) {
856952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor      if (TTP->hasDefaultArgument())
866952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor        break;
876952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor    } else if (NonTypeTemplateParmDecl *NTTP
886952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                    = dyn_cast<NonTypeTemplateParmDecl>(*P)) {
896952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor      if (NTTP->hasDefaultArgument())
906952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor        break;
916952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor    } else if (cast<TemplateTemplateParmDecl>(*P)->hasDefaultArgument())
926952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor      break;
936952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor
946952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor    ++NumRequiredArgs;
9562cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor  }
966952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor
9762cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor  return NumRequiredArgs;
9862cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor}
9962cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor
100ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregorunsigned TemplateParameterList::getDepth() const {
101ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor  if (size() == 0)
102ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor    return 0;
103ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor
104ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor  const NamedDecl *FirstParm = getParam(0);
105ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor  if (const TemplateTypeParmDecl *TTP
106ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor        = dyn_cast<TemplateTypeParmDecl>(FirstParm))
107ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor    return TTP->getDepth();
108ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor  else if (const NonTypeTemplateParmDecl *NTTP
109ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor             = dyn_cast<NonTypeTemplateParmDecl>(FirstParm))
110ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor    return NTTP->getDepth();
111ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor  else
112ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor    return cast<TemplateTemplateParmDecl>(FirstParm)->getDepth();
113ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor}
114ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor
115787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregorstatic void AdoptTemplateParameterList(TemplateParameterList *Params,
116787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor                                       DeclContext *Owner) {
117787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor  for (TemplateParameterList::iterator P = Params->begin(),
118787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor                                    PEnd = Params->end();
119787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor       P != PEnd; ++P) {
120787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor    (*P)->setDeclContext(Owner);
121787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor
122787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor    if (TemplateTemplateParmDecl *TTP = dyn_cast<TemplateTemplateParmDecl>(*P))
123787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor      AdoptTemplateParameterList(TTP->getTemplateParameters(), Owner);
124787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor  }
125787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor}
126787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor
127aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
1289eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne// RedeclarableTemplateDecl Implementation
1299eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne//===----------------------------------------------------------------------===//
1309eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne
1319eabebafc165a67812eacc184806e7bf34c5f0a5Peter CollingbourneRedeclarableTemplateDecl::CommonBase *RedeclarableTemplateDecl::getCommonPtr() {
1327c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor  if (!Common) {
1337c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor    // Walk the previous-declaration chain until we either find a declaration
1347c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor    // with a common pointer or we run out of previous declarations.
1357c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor    llvm::SmallVector<RedeclarableTemplateDecl *, 2> PrevDecls;
136ef96ee0be5f100789f451641542a69cd719144d2Douglas Gregor    for (RedeclarableTemplateDecl *Prev = getPreviousDecl(); Prev;
137ef96ee0be5f100789f451641542a69cd719144d2Douglas Gregor         Prev = Prev->getPreviousDecl()) {
1387c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor      if (Prev->Common) {
1397c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor        Common = Prev->Common;
1407c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor        break;
1417c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor      }
1427c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor
1437c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor      PrevDecls.push_back(Prev);
1447c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor    }
1459eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne
1467c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor    // If we never found a common pointer, allocate one now.
1478a8950b13e4d438f732d24f22f63ebe1a9e0075eDouglas Gregor    if (!Common) {
1488a8950b13e4d438f732d24f22f63ebe1a9e0075eDouglas Gregor      // FIXME: If any of the declarations is from an AST file, we probably
1498a8950b13e4d438f732d24f22f63ebe1a9e0075eDouglas Gregor      // need an update record to add the common data.
1508a8950b13e4d438f732d24f22f63ebe1a9e0075eDouglas Gregor
1517c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor      Common = newCommon(getASTContext());
1528a8950b13e4d438f732d24f22f63ebe1a9e0075eDouglas Gregor    }
1537c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor
1547c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor    // Update any previous declarations we saw with the common pointer.
1557c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor    for (unsigned I = 0, N = PrevDecls.size(); I != N; ++I)
1567c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor      PrevDecls[I]->Common = Common;
1578a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne  }
1588a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne
1597c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor  return Common;
160f88718ea0ca0d64b7fd31d109f1d9ec769a9c45fPeter Collingbourne}
161f88718ea0ca0d64b7fd31d109f1d9ec769a9c45fPeter Collingbourne
1624048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbournetemplate <class EntryType>
1634048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbournetypename RedeclarableTemplateDecl::SpecEntryTraits<EntryType>::DeclType*
1644048590d5774fd4b08661b5cf59b6f90b62f283aPeter CollingbourneRedeclarableTemplateDecl::findSpecializationImpl(
165d964d6380945e0505b623050fe6a3f428008fc2aChandler Carruth                                 llvm::FoldingSetVector<EntryType> &Specs,
1664048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne                                 const TemplateArgument *Args, unsigned NumArgs,
1674048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne                                 void *&InsertPos) {
1684048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne  typedef SpecEntryTraits<EntryType> SETraits;
1694048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne  llvm::FoldingSetNodeID ID;
1704048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne  EntryType::Profile(ID,Args,NumArgs, getASTContext());
1714048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne  EntryType *Entry = Specs.FindNodeOrInsertPos(ID, InsertPos);
172ef96ee0be5f100789f451641542a69cd719144d2Douglas Gregor  return Entry ? SETraits::getMostRecentDecl(Entry) : 0;
1734048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne}
1744048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne
175c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor/// \brief Generate the injected template arguments for the given template
176c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor/// parameter list, e.g., for the injected-class-name of a class template.
177c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregorstatic void GenerateInjectedTemplateArgs(ASTContext &Context,
178c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor                                        TemplateParameterList *Params,
179c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor                                         TemplateArgument *Args) {
180c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor  for (TemplateParameterList::iterator Param = Params->begin(),
181c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor                                    ParamEnd = Params->end();
182c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor       Param != ParamEnd; ++Param) {
183c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor    TemplateArgument Arg;
184c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor    if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(*Param)) {
185c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor      QualType ArgType = Context.getTypeDeclType(TTP);
186c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor      if (TTP->isParameterPack())
187c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor        ArgType = Context.getPackExpansionType(ArgType,
188c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor                                               llvm::Optional<unsigned>());
189c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor
190c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor      Arg = TemplateArgument(ArgType);
191c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor    } else if (NonTypeTemplateParmDecl *NTTP =
192c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor               dyn_cast<NonTypeTemplateParmDecl>(*Param)) {
193f4b88a45902af1802a1cb42ba48b1c474474f228John McCall      Expr *E = new (Context) DeclRefExpr(NTTP, /*enclosing*/ false,
194c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor                                  NTTP->getType().getNonLValueExprType(Context),
195c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor                                  Expr::getValueKindForType(NTTP->getType()),
196c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor                                          NTTP->getLocation());
197c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor
198c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor      if (NTTP->isParameterPack())
199c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor        E = new (Context) PackExpansionExpr(Context.DependentTy, E,
200c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor                                            NTTP->getLocation(),
201c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor                                            llvm::Optional<unsigned>());
202c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor      Arg = TemplateArgument(E);
203c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor    } else {
204c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor      TemplateTemplateParmDecl *TTP = cast<TemplateTemplateParmDecl>(*Param);
205c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor      if (TTP->isParameterPack())
206c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor        Arg = TemplateArgument(TemplateName(TTP), llvm::Optional<unsigned>());
207c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor      else
208c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor        Arg = TemplateArgument(TemplateName(TTP));
209c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor    }
210c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor
211c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor    if ((*Param)->isTemplateParameterPack())
212c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor      Arg = TemplateArgument::CreatePackCopy(Context, &Arg, 1);
213c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor
214c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor    *Args++ = Arg;
215c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor  }
216c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor}
217c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor
2189eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne//===----------------------------------------------------------------------===//
219aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// FunctionTemplateDecl Implementation
220aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
221aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
2220054531488928a424666ac11fcdc6bcc5112de52Douglas Gregorvoid FunctionTemplateDecl::DeallocateCommon(void *Ptr) {
2230054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor  static_cast<Common *>(Ptr)->~Common();
2240054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor}
2250054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor
226aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorFunctionTemplateDecl *FunctionTemplateDecl::Create(ASTContext &C,
227aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                                   DeclContext *DC,
228aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                                   SourceLocation L,
229aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                                   DeclarationName Name,
230127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor                                               TemplateParameterList *Params,
231aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                                   NamedDecl *Decl) {
232787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor  AdoptTemplateParameterList(Params, cast<DeclContext>(Decl));
233aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor  return new (C) FunctionTemplateDecl(DC, L, Name, Params, Decl);
234aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor}
235aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
2361e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorFunctionTemplateDecl *FunctionTemplateDecl::CreateDeserialized(ASTContext &C,
2371e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor                                                               unsigned ID) {
2381e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor  void *Mem = AllocateDeserializedDecl(C, ID, sizeof(FunctionTemplateDecl));
2391e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor  return new (Mem) FunctionTemplateDecl(0, SourceLocation(), DeclarationName(),
2401e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor                                        0, 0);
2419a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor}
2429a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor
2436b5415196327fa8ef00f028ba175fafef1738ae1Argyrios KyrtzidisRedeclarableTemplateDecl::CommonBase *
2446b5415196327fa8ef00f028ba175fafef1738ae1Argyrios KyrtzidisFunctionTemplateDecl::newCommon(ASTContext &C) {
2456b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis  Common *CommonPtr = new (C) Common;
2466b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis  C.AddDeallocation(DeallocateCommon, CommonPtr);
2479eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne  return CommonPtr;
2489eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne}
2499eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne
2502c853e401ca406d417eb916e867226050e7be06bArgyrios KyrtzidisFunctionDecl *
2512c853e401ca406d417eb916e867226050e7be06bArgyrios KyrtzidisFunctionTemplateDecl::findSpecialization(const TemplateArgument *Args,
2522c853e401ca406d417eb916e867226050e7be06bArgyrios Kyrtzidis                                         unsigned NumArgs, void *&InsertPos) {
2534048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne  return findSpecializationImpl(getSpecializations(), Args, NumArgs, InsertPos);
2542c853e401ca406d417eb916e867226050e7be06bArgyrios Kyrtzidis}
2552c853e401ca406d417eb916e867226050e7be06bArgyrios Kyrtzidis
2565bbcdbf36f8cf79d99703ef20848c55960065e43Sebastian Redlvoid FunctionTemplateDecl::addSpecialization(
2575bbcdbf36f8cf79d99703ef20848c55960065e43Sebastian Redl      FunctionTemplateSpecializationInfo *Info, void *InsertPos) {
2581e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor  if (InsertPos)
2591e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor    getSpecializations().InsertNode(Info, InsertPos);
2601e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor  else
2611e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor    getSpecializations().GetOrInsertNode(Info);
2625bbcdbf36f8cf79d99703ef20848c55960065e43Sebastian Redl  if (ASTMutationListener *L = getASTMutationListener())
2635bbcdbf36f8cf79d99703ef20848c55960065e43Sebastian Redl    L->AddedCXXTemplateSpecialization(this, Info->Function);
2645bbcdbf36f8cf79d99703ef20848c55960065e43Sebastian Redl}
2655bbcdbf36f8cf79d99703ef20848c55960065e43Sebastian Redl
266c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregorstd::pair<const TemplateArgument *, unsigned>
267c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas GregorFunctionTemplateDecl::getInjectedTemplateArgs() {
268c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor  TemplateParameterList *Params = getTemplateParameters();
269c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor  Common *CommonPtr = getCommonPtr();
270c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor  if (!CommonPtr->InjectedArgs) {
271c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor    CommonPtr->InjectedArgs
272c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor      = new (getASTContext()) TemplateArgument [Params->size()];
273c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor    GenerateInjectedTemplateArgs(getASTContext(), Params,
274c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor                                 CommonPtr->InjectedArgs);
275c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor  }
276c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor
277c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor  return std::make_pair(CommonPtr->InjectedArgs, Params->size());
278c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor}
279c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor
280aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
281aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// ClassTemplateDecl Implementation
282aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
283aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
2840054531488928a424666ac11fcdc6bcc5112de52Douglas Gregorvoid ClassTemplateDecl::DeallocateCommon(void *Ptr) {
2850054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor  static_cast<Common *>(Ptr)->~Common();
2860054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor}
2870054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor
2888731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios KyrtzidisClassTemplateDecl *ClassTemplateDecl::Create(ASTContext &C,
2898731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis                                             DeclContext *DC,
2908731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis                                             SourceLocation L,
2918731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis                                             DeclarationName Name,
2928731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis                                             TemplateParameterList *Params,
2938731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis                                             NamedDecl *Decl,
2948731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis                                             ClassTemplateDecl *PrevDecl) {
295787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor  AdoptTemplateParameterList(Params, cast<DeclContext>(Decl));
2968731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis  ClassTemplateDecl *New = new (C) ClassTemplateDecl(DC, L, Name, Params, Decl);
2975bf1bdc2fedb0c29b5fcdb4abc852aa85b4fe26aArgyrios Kyrtzidis  New->setPreviousDeclaration(PrevDecl);
2988731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis  return New;
2995953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor}
3005953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor
3011e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorClassTemplateDecl *ClassTemplateDecl::CreateDeserialized(ASTContext &C,
3021e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor                                                         unsigned ID) {
3031e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor  void *Mem = AllocateDeserializedDecl(C, ID, sizeof(ClassTemplateDecl));
3041e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor  return new (Mem) ClassTemplateDecl(EmptyShell());
3059a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor}
3069a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor
307c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregorvoid ClassTemplateDecl::LoadLazySpecializations() {
308c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor  Common *CommonPtr = getCommonPtr();
309c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor  if (CommonPtr->LazySpecializations) {
310c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor    ASTContext &Context = getASTContext();
311c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor    uint32_t *Specs = CommonPtr->LazySpecializations;
312c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor    CommonPtr->LazySpecializations = 0;
313c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor    for (uint32_t I = 0, N = *Specs++; I != N; ++I)
314c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor      (void)Context.getExternalSource()->GetExternalDecl(Specs[I]);
315c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor  }
316c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor}
317c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor
318d964d6380945e0505b623050fe6a3f428008fc2aChandler Carruthllvm::FoldingSetVector<ClassTemplateSpecializationDecl> &
319c8e5cf8f725e111965debb7130ef7466c0c73884Douglas GregorClassTemplateDecl::getSpecializations() {
320c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor  LoadLazySpecializations();
321c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor  return getCommonPtr()->Specializations;
322c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor}
323c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor
324d964d6380945e0505b623050fe6a3f428008fc2aChandler Carruthllvm::FoldingSetVector<ClassTemplatePartialSpecializationDecl> &
325c8e5cf8f725e111965debb7130ef7466c0c73884Douglas GregorClassTemplateDecl::getPartialSpecializations() {
326c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor  LoadLazySpecializations();
327c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor  return getCommonPtr()->PartialSpecializations;
328c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor}
329c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor
3306b5415196327fa8ef00f028ba175fafef1738ae1Argyrios KyrtzidisRedeclarableTemplateDecl::CommonBase *
3316b5415196327fa8ef00f028ba175fafef1738ae1Argyrios KyrtzidisClassTemplateDecl::newCommon(ASTContext &C) {
3326b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis  Common *CommonPtr = new (C) Common;
3336b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis  C.AddDeallocation(DeallocateCommon, CommonPtr);
3349eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne  return CommonPtr;
3359eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne}
3369eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne
337cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplateSpecializationDecl *
338cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplateDecl::findSpecialization(const TemplateArgument *Args,
339cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis                                      unsigned NumArgs, void *&InsertPos) {
3404048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne  return findSpecializationImpl(getSpecializations(), Args, NumArgs, InsertPos);
341cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis}
342cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis
343bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidisvoid ClassTemplateDecl::AddSpecialization(ClassTemplateSpecializationDecl *D,
344bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis                                          void *InsertPos) {
3451e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor  if (InsertPos)
3461e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor    getSpecializations().InsertNode(D, InsertPos);
3471e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor  else {
3481e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor    ClassTemplateSpecializationDecl *Existing
3491e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor      = getSpecializations().GetOrInsertNode(D);
3501e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor    (void)Existing;
3511e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor    assert(Existing->isCanonicalDecl() && "Non-canonical specialization?");
3521e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor  }
353bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis  if (ASTMutationListener *L = getASTMutationListener())
354bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis    L->AddedCXXTemplateSpecialization(this, D);
355bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis}
356bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis
357cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplatePartialSpecializationDecl *
358cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplateDecl::findPartialSpecialization(const TemplateArgument *Args,
359cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis                                             unsigned NumArgs,
360cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis                                             void *&InsertPos) {
3614048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne  return findSpecializationImpl(getPartialSpecializations(), Args, NumArgs,
3624048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne                                InsertPos);
363cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis}
364cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis
365bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidisvoid ClassTemplateDecl::AddPartialSpecialization(
366bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis                                      ClassTemplatePartialSpecializationDecl *D,
367bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis                                      void *InsertPos) {
3681e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor  if (InsertPos)
3691e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor    getPartialSpecializations().InsertNode(D, InsertPos);
3701e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor  else {
3711e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor    ClassTemplatePartialSpecializationDecl *Existing
3721e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor      = getPartialSpecializations().GetOrInsertNode(D);
3731e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor    (void)Existing;
3741e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor    assert(Existing->isCanonicalDecl() && "Non-canonical specialization?");
3751e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor  }
3761e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor
377bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis  if (ASTMutationListener *L = getASTMutationListener())
378bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis    L->AddedCXXTemplateSpecialization(this, D);
379bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis}
380bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis
381dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregorvoid ClassTemplateDecl::getPartialSpecializations(
3825f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner          SmallVectorImpl<ClassTemplatePartialSpecializationDecl *> &PS) {
383d964d6380945e0505b623050fe6a3f428008fc2aChandler Carruth  llvm::FoldingSetVector<ClassTemplatePartialSpecializationDecl> &PartialSpecs
3845bf1bdc2fedb0c29b5fcdb4abc852aa85b4fe26aArgyrios Kyrtzidis    = getPartialSpecializations();
385dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor  PS.clear();
386dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor  PS.resize(PartialSpecs.size());
387d964d6380945e0505b623050fe6a3f428008fc2aChandler Carruth  for (llvm::FoldingSetVector<ClassTemplatePartialSpecializationDecl>::iterator
388dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor       P = PartialSpecs.begin(), PEnd = PartialSpecs.end();
389dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor       P != PEnd; ++P) {
390dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor    assert(!PS[P->getSequenceNumber()]);
391ef96ee0be5f100789f451641542a69cd719144d2Douglas Gregor    PS[P->getSequenceNumber()] = P->getMostRecentDecl();
392dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor  }
393dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor}
394dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor
395b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas GregorClassTemplatePartialSpecializationDecl *
396b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas GregorClassTemplateDecl::findPartialSpecialization(QualType T) {
397b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor  ASTContext &Context = getASTContext();
398d964d6380945e0505b623050fe6a3f428008fc2aChandler Carruth  using llvm::FoldingSetVector;
399d964d6380945e0505b623050fe6a3f428008fc2aChandler Carruth  typedef FoldingSetVector<ClassTemplatePartialSpecializationDecl>::iterator
400b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor    partial_spec_iterator;
401b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor  for (partial_spec_iterator P = getPartialSpecializations().begin(),
402b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor                          PEnd = getPartialSpecializations().end();
403b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor       P != PEnd; ++P) {
40431f17ecbef57b5679c017c375db330546b7b5145John McCall    if (Context.hasSameType(P->getInjectedSpecializationType(), T))
405ef96ee0be5f100789f451641542a69cd719144d2Douglas Gregor      return P->getMostRecentDecl();
406cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis  }
407cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis
408cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis  return 0;
409cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis}
410cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis
411cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplatePartialSpecializationDecl *
412cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplateDecl::findPartialSpecInstantiatedFromMember(
413cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis                                    ClassTemplatePartialSpecializationDecl *D) {
414cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis  Decl *DCanon = D->getCanonicalDecl();
415d964d6380945e0505b623050fe6a3f428008fc2aChandler Carruth  for (llvm::FoldingSetVector<ClassTemplatePartialSpecializationDecl>::iterator
416cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis            P = getPartialSpecializations().begin(),
417cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis         PEnd = getPartialSpecializations().end();
418cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis       P != PEnd; ++P) {
419cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis    if (P->getInstantiatedFromMember()->getCanonicalDecl() == DCanon)
420ef96ee0be5f100789f451641542a69cd719144d2Douglas Gregor      return P->getMostRecentDecl();
421b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor  }
4221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
423b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor  return 0;
424b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor}
425b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor
4263cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCallQualType
42724bae92f08ae098cc50a602d8cf1273b423e14daDouglas GregorClassTemplateDecl::getInjectedClassNameSpecialization() {
4285bf1bdc2fedb0c29b5fcdb4abc852aa85b4fe26aArgyrios Kyrtzidis  Common *CommonPtr = getCommonPtr();
4297da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor  if (!CommonPtr->InjectedClassNameType.isNull())
4307da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor    return CommonPtr->InjectedClassNameType;
4317da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor
432b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor  // C++0x [temp.dep.type]p2:
433b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor  //  The template argument list of a primary template is a template argument
434b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor  //  list in which the nth template argument has the value of the nth template
435b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor  //  parameter of the class template. If the nth template parameter is a
436b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor  //  template parameter pack (14.5.3), the nth template argument is a pack
437b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor  //  expansion (14.5.3) whose pattern is the name of the template parameter
438b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor  //  pack.
43924bae92f08ae098cc50a602d8cf1273b423e14daDouglas Gregor  ASTContext &Context = getASTContext();
4407da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor  TemplateParameterList *Params = getTemplateParameters();
4415f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  SmallVector<TemplateArgument, 16> TemplateArgs;
442c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor  TemplateArgs.resize(Params->size());
443c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor  GenerateInjectedTemplateArgs(getASTContext(), Params, TemplateArgs.data());
4447da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor  CommonPtr->InjectedClassNameType
4451275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor    = Context.getTemplateSpecializationType(TemplateName(this),
4467da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor                                            &TemplateArgs[0],
4471275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor                                            TemplateArgs.size());
4487da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor  return CommonPtr->InjectedClassNameType;
4497da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor}
4507da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor
451aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
452aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// TemplateTypeParm Allocation/Deallocation Method Implementations
453aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
454aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
455aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorTemplateTypeParmDecl *
4564ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadTemplateTypeParmDecl::Create(const ASTContext &C, DeclContext *DC,
457344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara                             SourceLocation KeyLoc, SourceLocation NameLoc,
458344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara                             unsigned D, unsigned P, IdentifierInfo *Id,
459344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara                             bool Typename, bool ParameterPack) {
4604fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth  TemplateTypeParmDecl *TTPDecl =
4614fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth    new (C) TemplateTypeParmDecl(DC, KeyLoc, NameLoc, Id, Typename);
4624fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth  QualType TTPType = C.getTemplateTypeParmType(D, P, ParameterPack, TTPDecl);
4634fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth  TTPDecl->TypeForDecl = TTPType.getTypePtr();
4644fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth  return TTPDecl;
465aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor}
466aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
467b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios KyrtzidisTemplateTypeParmDecl *
4681e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorTemplateTypeParmDecl::CreateDeserialized(const ASTContext &C, unsigned ID) {
4691e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor  void *Mem = AllocateDeserializedDecl(C, ID, sizeof(TemplateTypeParmDecl));
4701e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor  return new (Mem) TemplateTypeParmDecl(0, SourceLocation(), SourceLocation(),
4711e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor                                        0, false);
472b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios Kyrtzidis}
473b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios Kyrtzidis
474833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallSourceLocation TemplateTypeParmDecl::getDefaultArgumentLoc() const {
47577d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara  return hasDefaultArgument()
47677d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara    ? DefaultArgument->getTypeLoc().getBeginLoc()
47777d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara    : SourceLocation();
47877d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara}
47977d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara
48077d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo BagnaraSourceRange TemplateTypeParmDecl::getSourceRange() const {
48177d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara  if (hasDefaultArgument() && !defaultArgumentWasInherited())
482344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara    return SourceRange(getLocStart(),
48377d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara                       DefaultArgument->getTypeLoc().getEndLoc());
48477d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara  else
485344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara    return TypeDecl::getSourceRange();
486833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall}
487833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
488ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregorunsigned TemplateTypeParmDecl::getDepth() const {
489ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor  return TypeForDecl->getAs<TemplateTypeParmType>()->getDepth();
490ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor}
491ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor
492ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregorunsigned TemplateTypeParmDecl::getIndex() const {
493ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor  return TypeForDecl->getAs<TemplateTypeParmType>()->getIndex();
494ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor}
495ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor
4964fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruthbool TemplateTypeParmDecl::isParameterPack() const {
4974fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth  return TypeForDecl->getAs<TemplateTypeParmType>()->isParameterPack();
4984fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth}
4994fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth
500aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
501aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// NonTypeTemplateParmDecl Method Implementations
502aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
503aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
5046952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas GregorNonTypeTemplateParmDecl::NonTypeTemplateParmDecl(DeclContext *DC,
505ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara                                                 SourceLocation StartLoc,
506ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara                                                 SourceLocation IdLoc,
507ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara                                                 unsigned D, unsigned P,
508ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara                                                 IdentifierInfo *Id,
5096952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                                 QualType T,
5106952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                                 TypeSourceInfo *TInfo,
5116952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                                 const QualType *ExpandedTypes,
5126952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                                 unsigned NumExpandedTypes,
5136952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                                TypeSourceInfo **ExpandedTInfos)
514ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara  : DeclaratorDecl(NonTypeTemplateParm, DC, IdLoc, Id, T, TInfo, StartLoc),
5156952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor    TemplateParmPosition(D, P), DefaultArgumentAndInherited(0, false),
5166952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor    ParameterPack(true), ExpandedParameterPack(true),
5176952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor    NumExpandedTypes(NumExpandedTypes)
5186952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor{
5196952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor  if (ExpandedTypes && ExpandedTInfos) {
5206952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor    void **TypesAndInfos = reinterpret_cast<void **>(this + 1);
5216952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor    for (unsigned I = 0; I != NumExpandedTypes; ++I) {
5226952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor      TypesAndInfos[2*I] = ExpandedTypes[I].getAsOpaquePtr();
5236952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor      TypesAndInfos[2*I + 1] = ExpandedTInfos[I];
5246952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor    }
5256952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor  }
5266952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor}
5276952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor
528aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorNonTypeTemplateParmDecl *
5294ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadNonTypeTemplateParmDecl::Create(const ASTContext &C, DeclContext *DC,
530ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara                                SourceLocation StartLoc, SourceLocation IdLoc,
531ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara                                unsigned D, unsigned P, IdentifierInfo *Id,
532ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara                                QualType T, bool ParameterPack,
533ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara                                TypeSourceInfo *TInfo) {
534ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara  return new (C) NonTypeTemplateParmDecl(DC, StartLoc, IdLoc, D, P, Id,
535ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara                                         T, ParameterPack, TInfo);
536aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor}
537aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
5386952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas GregorNonTypeTemplateParmDecl *
5396952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas GregorNonTypeTemplateParmDecl::Create(const ASTContext &C, DeclContext *DC,
540ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara                                SourceLocation StartLoc, SourceLocation IdLoc,
541ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara                                unsigned D, unsigned P,
5426952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                IdentifierInfo *Id, QualType T,
5436952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                TypeSourceInfo *TInfo,
5446952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                const QualType *ExpandedTypes,
5456952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                unsigned NumExpandedTypes,
5466952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                TypeSourceInfo **ExpandedTInfos) {
5476952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor  unsigned Size = sizeof(NonTypeTemplateParmDecl)
5486952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                + NumExpandedTypes * 2 * sizeof(void*);
5496952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor  void *Mem = C.Allocate(Size);
550ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara  return new (Mem) NonTypeTemplateParmDecl(DC, StartLoc, IdLoc,
551ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara                                           D, P, Id, T, TInfo,
5526952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                           ExpandedTypes, NumExpandedTypes,
5536952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                           ExpandedTInfos);
5546952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor}
5556952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor
5561e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorNonTypeTemplateParmDecl *
5571e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorNonTypeTemplateParmDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
5581e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor  void *Mem = AllocateDeserializedDecl(C, ID, sizeof(NonTypeTemplateParmDecl));
5591e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor  return new (Mem) NonTypeTemplateParmDecl(0, SourceLocation(),
5601e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor                                           SourceLocation(), 0, 0, 0,
5611e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor                                           QualType(), false, 0);
5621e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor}
5631e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor
5641e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorNonTypeTemplateParmDecl *
5651e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorNonTypeTemplateParmDecl::CreateDeserialized(ASTContext &C, unsigned ID,
5661e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor                                            unsigned NumExpandedTypes) {
5671e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor  unsigned Size = sizeof(NonTypeTemplateParmDecl)
5681e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor                + NumExpandedTypes * 2 * sizeof(void*);
5691e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor
5701e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor  void *Mem = AllocateDeserializedDecl(C, ID, Size);
5711e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor  return new (Mem) NonTypeTemplateParmDecl(0, SourceLocation(),
5721e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor                                           SourceLocation(), 0, 0, 0,
5731e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor                                           QualType(), 0, 0, NumExpandedTypes,
5741e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor                                           0);
5751e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor}
5761e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor
57776a40219ee5624d78aba167dce02bdbaa930955fJohn McCallSourceRange NonTypeTemplateParmDecl::getSourceRange() const {
578ee4bfd412db491c489fc2ee74916edd73f9c618aAbramo Bagnara  if (hasDefaultArgument() && !defaultArgumentWasInherited())
579a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara    return SourceRange(getOuterLocStart(),
580a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara                       getDefaultArgument()->getSourceRange().getEnd());
581a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara  return DeclaratorDecl::getSourceRange();
58276a40219ee5624d78aba167dce02bdbaa930955fJohn McCall}
58376a40219ee5624d78aba167dce02bdbaa930955fJohn McCall
584d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas GregorSourceLocation NonTypeTemplateParmDecl::getDefaultArgumentLoc() const {
585d92f7a297c0ed3f7d0ebcbb557e1d4c1925b8c72Abramo Bagnara  return hasDefaultArgument()
586d92f7a297c0ed3f7d0ebcbb557e1d4c1925b8c72Abramo Bagnara    ? getDefaultArgument()->getSourceRange().getBegin()
587d92f7a297c0ed3f7d0ebcbb557e1d4c1925b8c72Abramo Bagnara    : SourceLocation();
588d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas Gregor}
589d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas Gregor
590aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
591aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// TemplateTemplateParmDecl Method Implementations
592aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
593aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
59499ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid TemplateTemplateParmDecl::anchor() { }
59599ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie
5966964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard SmithTemplateTemplateParmDecl::TemplateTemplateParmDecl(
5976964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith    DeclContext *DC, SourceLocation L, unsigned D, unsigned P,
5986964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith    IdentifierInfo *Id, TemplateParameterList *Params,
5996964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith    unsigned NumExpansions, TemplateParameterList * const *Expansions)
6006964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith  : TemplateDecl(TemplateTemplateParm, DC, L, Id, Params),
6016964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith    TemplateParmPosition(D, P), DefaultArgument(),
6026964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith    DefaultArgumentWasInherited(false), ParameterPack(true),
6036964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith    ExpandedParameterPack(true), NumExpandedParams(NumExpansions) {
6046964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith  if (Expansions)
6056964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith    std::memcpy(reinterpret_cast<void*>(this + 1), Expansions,
6066964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith                sizeof(TemplateParameterList*) * NumExpandedParams);
6076964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith}
6086964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith
609aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorTemplateTemplateParmDecl *
6104ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadTemplateTemplateParmDecl::Create(const ASTContext &C, DeclContext *DC,
611aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                 SourceLocation L, unsigned D, unsigned P,
61261c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor                                 bool ParameterPack, IdentifierInfo *Id,
613aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                 TemplateParameterList *Params) {
61461c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor  return new (C) TemplateTemplateParmDecl(DC, L, D, P, ParameterPack, Id,
61561c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor                                          Params);
616aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor}
617aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
6181e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorTemplateTemplateParmDecl *
6196964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard SmithTemplateTemplateParmDecl::Create(const ASTContext &C, DeclContext *DC,
6206964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith                                 SourceLocation L, unsigned D, unsigned P,
6216964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith                                 IdentifierInfo *Id,
6226964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith                                 TemplateParameterList *Params,
6236964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith                            llvm::ArrayRef<TemplateParameterList*> Expansions) {
6246964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith  void *Mem = C.Allocate(sizeof(TemplateTemplateParmDecl) +
6256964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith                         sizeof(TemplateParameterList*) * Expansions.size());
6266964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith  return new (Mem) TemplateTemplateParmDecl(DC, L, D, P, Id, Params,
6276964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith                                            Expansions.size(),
6286964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith                                            Expansions.data());
6296964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith}
6306964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith
6316964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard SmithTemplateTemplateParmDecl *
6321e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorTemplateTemplateParmDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
6331e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor  void *Mem = AllocateDeserializedDecl(C, ID, sizeof(TemplateTemplateParmDecl));
6341e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor  return new (Mem) TemplateTemplateParmDecl(0, SourceLocation(), 0, 0, false,
6351e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor                                            0, 0);
6361e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor}
6371e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor
6386964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard SmithTemplateTemplateParmDecl *
6396964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard SmithTemplateTemplateParmDecl::CreateDeserialized(ASTContext &C, unsigned ID,
6406964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith                                             unsigned NumExpansions) {
6416964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith  unsigned Size = sizeof(TemplateTemplateParmDecl) +
6426964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith                  sizeof(TemplateParameterList*) * NumExpansions;
6436964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith  void *Mem = AllocateDeserializedDecl(C, ID, Size);
6446964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith  return new (Mem) TemplateTemplateParmDecl(0, SourceLocation(), 0, 0, 0, 0,
6456964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith                                            NumExpansions, 0);
6466964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith}
6476964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith
6483e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor//===----------------------------------------------------------------------===//
6497e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor// TemplateArgumentList Implementation
6507e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor//===----------------------------------------------------------------------===//
651910f8008fea79120489a53593fe971b0b8a4a740Douglas GregorTemplateArgumentList *
652910f8008fea79120489a53593fe971b0b8a4a740Douglas GregorTemplateArgumentList::CreateCopy(ASTContext &Context,
653910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor                                 const TemplateArgument *Args,
654910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor                                 unsigned NumArgs) {
655910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor  std::size_t Size = sizeof(TemplateArgumentList)
656910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor                   + NumArgs * sizeof(TemplateArgument);
657910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor  void *Mem = Context.Allocate(Size);
658910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor  TemplateArgument *StoredArgs
659910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor    = reinterpret_cast<TemplateArgument *>(
660910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor                                static_cast<TemplateArgumentList *>(Mem) + 1);
661910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor  std::uninitialized_copy(Args, Args + NumArgs, StoredArgs);
662910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor  return new (Mem) TemplateArgumentList(StoredArgs, NumArgs, true);
66394d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis}
66494d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis
66571a7605977113c795edd44fcbd2302ad49506653Argyrios KyrtzidisFunctionTemplateSpecializationInfo *
66671a7605977113c795edd44fcbd2302ad49506653Argyrios KyrtzidisFunctionTemplateSpecializationInfo::Create(ASTContext &C, FunctionDecl *FD,
66771a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis                                           FunctionTemplateDecl *Template,
66871a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis                                           TemplateSpecializationKind TSK,
66971a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis                                       const TemplateArgumentList *TemplateArgs,
67071a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis                          const TemplateArgumentListInfo *TemplateArgsAsWritten,
67171a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis                                           SourceLocation POI) {
67271a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis  const ASTTemplateArgumentListInfo *ArgsAsWritten = 0;
67371a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis  if (TemplateArgsAsWritten)
67471a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis    ArgsAsWritten = ASTTemplateArgumentListInfo::Create(C,
67571a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis                                                        *TemplateArgsAsWritten);
67671a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis
67771a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis  return new (C) FunctionTemplateSpecializationInfo(FD, Template, TSK,
67871a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis                                                    TemplateArgs,
67971a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis                                                    ArgsAsWritten,
68071a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis                                                    POI);
68171a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis}
68271a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis
6837e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor//===----------------------------------------------------------------------===//
68499ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie// TemplateDecl Implementation
68599ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie//===----------------------------------------------------------------------===//
68699ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie
68799ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid TemplateDecl::anchor() { }
68899ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie
68999ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie//===----------------------------------------------------------------------===//
6903e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor// ClassTemplateSpecializationDecl Implementation
6913e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor//===----------------------------------------------------------------------===//
6923e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas GregorClassTemplateSpecializationDecl::
69313c8577201e4fc0ddac5f09d05fd1778832137d1Douglas GregorClassTemplateSpecializationDecl(ASTContext &Context, Kind DK, TagKind TK,
694ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara                                DeclContext *DC, SourceLocation StartLoc,
695ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara                                SourceLocation IdLoc,
6963e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor                                ClassTemplateDecl *SpecializedTemplate,
697910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor                                const TemplateArgument *Args,
698910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor                                unsigned NumArgs,
6998e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor                                ClassTemplateSpecializationDecl *PrevDecl)
700ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara  : CXXRecordDecl(DK, TK, DC, StartLoc, IdLoc,
7018e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor                  SpecializedTemplate->getIdentifier(),
7028e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor                  PrevDecl),
7033e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor    SpecializedTemplate(SpecializedTemplate),
704c98971d5c994caed9452aeadd0122c855e0f4de1Abramo Bagnara    ExplicitInfo(0),
705910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor    TemplateArgs(TemplateArgumentList::CreateCopy(Context, Args, NumArgs)),
7067e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor    SpecializationKind(TSK_Undeclared) {
7073e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor}
7081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
70994d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios KyrtzidisClassTemplateSpecializationDecl::ClassTemplateSpecializationDecl(Kind DK)
710ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara  : CXXRecordDecl(DK, TTK_Struct, 0, SourceLocation(), SourceLocation(), 0, 0),
71194d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis    ExplicitInfo(0),
71294d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis    SpecializationKind(TSK_Undeclared) {
71394d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis}
71494d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis
7153e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas GregorClassTemplateSpecializationDecl *
71613c8577201e4fc0ddac5f09d05fd1778832137d1Douglas GregorClassTemplateSpecializationDecl::Create(ASTContext &Context, TagKind TK,
717ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara                                        DeclContext *DC,
718ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara                                        SourceLocation StartLoc,
719ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara                                        SourceLocation IdLoc,
7203e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor                                        ClassTemplateDecl *SpecializedTemplate,
721910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor                                        const TemplateArgument *Args,
722910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor                                        unsigned NumArgs,
723cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor                                   ClassTemplateSpecializationDecl *PrevDecl) {
724cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor  ClassTemplateSpecializationDecl *Result
7251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    = new (Context)ClassTemplateSpecializationDecl(Context,
726c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor                                                   ClassTemplateSpecialization,
727ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara                                                   TK, DC, StartLoc, IdLoc,
7287e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor                                                   SpecializedTemplate,
729910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor                                                   Args, NumArgs,
7308e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor                                                   PrevDecl);
731cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor  Context.getTypeDeclType(Result, PrevDecl);
732cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor  return Result;
7333e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor}
734c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor
73594d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios KyrtzidisClassTemplateSpecializationDecl *
7361e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorClassTemplateSpecializationDecl::CreateDeserialized(ASTContext &C,
7371e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor                                                    unsigned ID) {
7381e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor  void *Mem = AllocateDeserializedDecl(C, ID,
7391e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor                                       sizeof(ClassTemplateSpecializationDecl));
7401e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor  return new (Mem) ClassTemplateSpecializationDecl(ClassTemplateSpecialization);
74194d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis}
74294d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis
743da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregorvoid
744da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas GregorClassTemplateSpecializationDecl::getNameForDiagnostic(std::string &S,
745da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor                                                  const PrintingPolicy &Policy,
746da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor                                                      bool Qualified) const {
747da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor  NamedDecl::getNameForDiagnostic(S, Policy, Qualified);
748da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor
749da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor  const TemplateArgumentList &TemplateArgs = getTemplateArgs();
750da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor  S += TemplateSpecializationType::PrintTemplateArgumentList(
751da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor                                                          TemplateArgs.data(),
752da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor                                                          TemplateArgs.size(),
753da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor                                                             Policy);
754da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor}
755da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor
75637d93e9252026d4fb836d9c05d0122a2d46e56beDouglas GregorClassTemplateDecl *
7571eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpClassTemplateSpecializationDecl::getSpecializedTemplate() const {
7581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (SpecializedPartialSpecialization *PartialSpec
75937d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor      = SpecializedTemplate.dyn_cast<SpecializedPartialSpecialization*>())
76037d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor    return PartialSpec->PartialSpecialization->getSpecializedTemplate();
76137d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor  return SpecializedTemplate.get<ClassTemplateDecl*>();
76237d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor}
76337d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor
7644a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo BagnaraSourceRange
7654a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo BagnaraClassTemplateSpecializationDecl::getSourceRange() const {
76609d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara  if (ExplicitInfo) {
76709d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara    SourceLocation Begin = getExternLoc();
76809d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara    if (Begin.isInvalid())
76909d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara      Begin = getTemplateKeywordLoc();
77009d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara    SourceLocation End = getRBraceLoc();
77109d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara    if (End.isInvalid())
77209d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara      End = getTypeAsWritten()->getTypeLoc().getEndLoc();
77309d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara    return SourceRange(Begin, End);
77409d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara  }
77509d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara  else {
77609d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara    // No explicit info available.
77709d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara    llvm::PointerUnion<ClassTemplateDecl *,
77809d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara                       ClassTemplatePartialSpecializationDecl *>
77909d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara      inst_from = getInstantiatedFrom();
78009d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara    if (inst_from.isNull())
78109d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara      return getSpecializedTemplate()->getSourceRange();
78209d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara    if (ClassTemplateDecl *ctd = inst_from.dyn_cast<ClassTemplateDecl*>())
78309d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara      return ctd->getSourceRange();
78409d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara    return inst_from.get<ClassTemplatePartialSpecializationDecl*>()
78509d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara      ->getSourceRange();
78609d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara  }
7874a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo Bagnara}
7884a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo Bagnara
789c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor//===----------------------------------------------------------------------===//
790c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor// ClassTemplatePartialSpecializationDecl Implementation
791c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor//===----------------------------------------------------------------------===//
79299ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid ClassTemplatePartialSpecializationDecl::anchor() { }
79399ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie
7949a299e0575ce235f491014627c7267e2d2cd73deDouglas GregorClassTemplatePartialSpecializationDecl::
7959a299e0575ce235f491014627c7267e2d2cd73deDouglas GregorClassTemplatePartialSpecializationDecl(ASTContext &Context, TagKind TK,
796ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara                                       DeclContext *DC,
797ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara                                       SourceLocation StartLoc,
798ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara                                       SourceLocation IdLoc,
7999a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor                                       TemplateParameterList *Params,
8009a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor                                       ClassTemplateDecl *SpecializedTemplate,
8019a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor                                       const TemplateArgument *Args,
8029a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor                                       unsigned NumArgs,
8039a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor                                       TemplateArgumentLoc *ArgInfos,
8049a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor                                       unsigned NumArgInfos,
8059a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor                               ClassTemplatePartialSpecializationDecl *PrevDecl,
8069a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor                                       unsigned SequenceNumber)
8079a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor  : ClassTemplateSpecializationDecl(Context,
8089a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor                                    ClassTemplatePartialSpecialization,
809ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara                                    TK, DC, StartLoc, IdLoc,
810ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara                                    SpecializedTemplate,
8119a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor                                    Args, NumArgs, PrevDecl),
8129a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor    TemplateParams(Params), ArgsAsWritten(ArgInfos),
8139a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor    NumArgsAsWritten(NumArgInfos), SequenceNumber(SequenceNumber),
8149a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor    InstantiatedFromMember(0, false)
8159a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor{
816787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor  AdoptTemplateParameterList(Params, this);
8179a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor}
8189a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor
819c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas GregorClassTemplatePartialSpecializationDecl *
820c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas GregorClassTemplatePartialSpecializationDecl::
821ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo BagnaraCreate(ASTContext &Context, TagKind TK,DeclContext *DC,
822ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara       SourceLocation StartLoc, SourceLocation IdLoc,
823c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor       TemplateParameterList *Params,
824c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor       ClassTemplateDecl *SpecializedTemplate,
825910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor       const TemplateArgument *Args,
826910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor       unsigned NumArgs,
827d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall       const TemplateArgumentListInfo &ArgInfos,
8283cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall       QualType CanonInjectedType,
829dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor       ClassTemplatePartialSpecializationDecl *PrevDecl,
830dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor       unsigned SequenceNumber) {
831d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  unsigned N = ArgInfos.size();
832833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  TemplateArgumentLoc *ClonedArgs = new (Context) TemplateArgumentLoc[N];
833833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  for (unsigned I = 0; I != N; ++I)
834833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    ClonedArgs[I] = ArgInfos[I];
835833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
836c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor  ClassTemplatePartialSpecializationDecl *Result
837ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara    = new (Context)ClassTemplatePartialSpecializationDecl(Context, TK, DC,
838ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara                                                          StartLoc, IdLoc,
839ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara                                                          Params,
840c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor                                                          SpecializedTemplate,
841910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor                                                          Args, NumArgs,
842833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                                          ClonedArgs, N,
843dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor                                                          PrevDecl,
844dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor                                                          SequenceNumber);
845c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor  Result->setSpecializationKind(TSK_ExplicitSpecialization);
8463cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall
8473cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  Context.getInjectedClassNameType(Result, CanonInjectedType);
848c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor  return Result;
849c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor}
850dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall
85194d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios KyrtzidisClassTemplatePartialSpecializationDecl *
8521e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorClassTemplatePartialSpecializationDecl::CreateDeserialized(ASTContext &C,
8531e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor                                                           unsigned ID) {
8541e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor  void *Mem = AllocateDeserializedDecl(C, ID,
8551e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor                sizeof(ClassTemplatePartialSpecializationDecl));
8561e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor  return new (Mem) ClassTemplatePartialSpecializationDecl();
85794d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis}
85894d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis
859dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall//===----------------------------------------------------------------------===//
860dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall// FriendTemplateDecl Implementation
861dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall//===----------------------------------------------------------------------===//
862dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall
86399ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid FriendTemplateDecl::anchor() { }
86499ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie
865dd4a3b0065b9a7e7b00073df415a798886c090f3John McCallFriendTemplateDecl *FriendTemplateDecl::Create(ASTContext &Context,
866dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall                                               DeclContext *DC,
867dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall                                               SourceLocation L,
868dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall                                               unsigned NParams,
869dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall                                               TemplateParameterList **Params,
870dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall                                               FriendUnion Friend,
871dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall                                               SourceLocation FLoc) {
872dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall  FriendTemplateDecl *Result
873dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall    = new (Context) FriendTemplateDecl(DC, L, NParams, Params, Friend, FLoc);
874dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall  return Result;
875dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall}
876554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis
8771e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorFriendTemplateDecl *FriendTemplateDecl::CreateDeserialized(ASTContext &C,
8781e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor                                                           unsigned ID) {
8791e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor  void *Mem = AllocateDeserializedDecl(C, ID, sizeof(FriendTemplateDecl));
8801e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor  return new (Mem) FriendTemplateDecl(EmptyShell());
881554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis}
8823e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith
8833e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith//===----------------------------------------------------------------------===//
8843e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith// TypeAliasTemplateDecl Implementation
8853e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith//===----------------------------------------------------------------------===//
8863e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith
8873e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard SmithTypeAliasTemplateDecl *TypeAliasTemplateDecl::Create(ASTContext &C,
8883e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith                                                     DeclContext *DC,
8893e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith                                                     SourceLocation L,
8903e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith                                                     DeclarationName Name,
8913e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith                                                  TemplateParameterList *Params,
8923e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith                                                     NamedDecl *Decl) {
8933e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith  AdoptTemplateParameterList(Params, DC);
8943e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith  return new (C) TypeAliasTemplateDecl(DC, L, Name, Params, Decl);
8953e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith}
8963e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith
8971e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorTypeAliasTemplateDecl *TypeAliasTemplateDecl::CreateDeserialized(ASTContext &C,
8981e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor                                                                 unsigned ID) {
8991e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor  void *Mem = AllocateDeserializedDecl(C, ID, sizeof(TypeAliasTemplateDecl));
9001e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor  return new (Mem) TypeAliasTemplateDecl(0, SourceLocation(), DeclarationName(),
9011e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor                                         0, 0);
9023e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith}
9033e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith
9043e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smithvoid TypeAliasTemplateDecl::DeallocateCommon(void *Ptr) {
9053e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith  static_cast<Common *>(Ptr)->~Common();
9063e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith}
9073e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard SmithRedeclarableTemplateDecl::CommonBase *
9083e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard SmithTypeAliasTemplateDecl::newCommon(ASTContext &C) {
9093e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith  Common *CommonPtr = new (C) Common;
9103e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith  C.AddDeallocation(DeallocateCommon, CommonPtr);
9113e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith  return CommonPtr;
9123e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith}
9133e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith
91499ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie//===----------------------------------------------------------------------===//
91599ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie// ClassScopeFunctionSpecializationDecl Implementation
91699ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie//===----------------------------------------------------------------------===//
91799ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie
91899ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid ClassScopeFunctionSpecializationDecl::anchor() { }
9191e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor
9201e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorClassScopeFunctionSpecializationDecl *
9211e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorClassScopeFunctionSpecializationDecl::CreateDeserialized(ASTContext &C,
9221e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor                                                         unsigned ID) {
9231e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor  void *Mem = AllocateDeserializedDecl(C, ID,
9241e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor                sizeof(ClassScopeFunctionSpecializationDecl));
9256b02009359a462ffe633696a4441313b462e6566Nico Weber  return new (Mem) ClassScopeFunctionSpecializationDecl(0, SourceLocation(), 0,
9266b02009359a462ffe633696a4441313b462e6566Nico Weber                                             false, TemplateArgumentListInfo());
9271e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor}
928