DeclTemplate.cpp revision 344577e6b58f42d18dc8118c8903b49a85dc005e
106a59bb8260ce3d52de761865dee90f90054a5ccSebastian Redl//===--- DeclTemplate.cpp - Template Declaration AST Node Implementation --===//
2aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//
3aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//                     The LLVM Compiler Infrastructure
4aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//
5aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// This file is distributed under the University of Illinois Open Source
6aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// License. See LICENSE.TXT for details.
7aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//
8aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
9aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//
10aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// This file implements the C++ related Decl classes for templates.
11aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//
12aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
13aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
14aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor#include "clang/AST/DeclCXX.h"
15aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor#include "clang/AST/DeclTemplate.h"
1655f6b14230c94272efbbcdd89a92224c8db9f225Douglas Gregor#include "clang/AST/Expr.h"
17b95cc97b2023d00cd3fbae8455bc9d728eab5e5dDouglas Gregor#include "clang/AST/ExprCXX.h"
18aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor#include "clang/AST/ASTContext.h"
19833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall#include "clang/AST/TypeLoc.h"
20bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis#include "clang/AST/ASTMutationListener.h"
21aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor#include "clang/Basic/IdentifierTable.h"
22aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor#include "llvm/ADT/STLExtras.h"
23910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor#include <memory>
24aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregorusing namespace clang;
25aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
26aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
27aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// TemplateParameterList Implementation
28aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
29aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
30ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas GregorTemplateParameterList::TemplateParameterList(SourceLocation TemplateLoc,
31ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas Gregor                                             SourceLocation LAngleLoc,
32bf4ea56cdc376cef5a12abf6bf18dc34805c2226Douglas Gregor                                             NamedDecl **Params, unsigned NumParams,
33ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas Gregor                                             SourceLocation RAngleLoc)
34ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas Gregor  : TemplateLoc(TemplateLoc), LAngleLoc(LAngleLoc), RAngleLoc(RAngleLoc),
35ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas Gregor    NumParams(NumParams) {
36aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor  for (unsigned Idx = 0; Idx < NumParams; ++Idx)
37aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor    begin()[Idx] = Params[Idx];
38aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor}
39aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
40aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorTemplateParameterList *
414ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadTemplateParameterList::Create(const ASTContext &C, SourceLocation TemplateLoc,
42bf4ea56cdc376cef5a12abf6bf18dc34805c2226Douglas Gregor                              SourceLocation LAngleLoc, NamedDecl **Params,
43ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas Gregor                              unsigned NumParams, SourceLocation RAngleLoc) {
44bf4ea56cdc376cef5a12abf6bf18dc34805c2226Douglas Gregor  unsigned Size = sizeof(TemplateParameterList)
45bf4ea56cdc376cef5a12abf6bf18dc34805c2226Douglas Gregor                + sizeof(NamedDecl *) * NumParams;
46aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor  unsigned Align = llvm::AlignOf<TemplateParameterList>::Alignment;
47aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor  void *Mem = C.Allocate(Size, Align);
481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return new (Mem) TemplateParameterList(TemplateLoc, LAngleLoc, Params,
49ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas Gregor                                         NumParams, RAngleLoc);
50aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor}
51aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
5262cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregorunsigned TemplateParameterList::getMinRequiredArguments() const {
536952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor  unsigned NumRequiredArgs = 0;
546952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor  for (iterator P = const_cast<TemplateParameterList *>(this)->begin(),
556952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor             PEnd = const_cast<TemplateParameterList *>(this)->end();
566952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor       P != PEnd; ++P) {
576952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor    if ((*P)->isTemplateParameterPack()) {
586952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor      if (NonTypeTemplateParmDecl *NTTP = dyn_cast<NonTypeTemplateParmDecl>(*P))
596952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor        if (NTTP->isExpandedParameterPack()) {
606952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor          NumRequiredArgs += NTTP->getNumExpansionTypes();
616952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor          continue;
626952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor        }
636952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor
6462cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor      break;
656952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor    }
666952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor
676952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor    if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(*P)) {
686952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor      if (TTP->hasDefaultArgument())
696952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor        break;
706952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor    } else if (NonTypeTemplateParmDecl *NTTP
716952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                    = dyn_cast<NonTypeTemplateParmDecl>(*P)) {
726952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor      if (NTTP->hasDefaultArgument())
736952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor        break;
746952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor    } else if (cast<TemplateTemplateParmDecl>(*P)->hasDefaultArgument())
756952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor      break;
766952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor
776952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor    ++NumRequiredArgs;
7862cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor  }
796952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor
8062cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor  return NumRequiredArgs;
8162cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor}
8262cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor
83ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregorunsigned TemplateParameterList::getDepth() const {
84ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor  if (size() == 0)
85ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor    return 0;
86ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor
87ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor  const NamedDecl *FirstParm = getParam(0);
88ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor  if (const TemplateTypeParmDecl *TTP
89ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor        = dyn_cast<TemplateTypeParmDecl>(FirstParm))
90ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor    return TTP->getDepth();
91ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor  else if (const NonTypeTemplateParmDecl *NTTP
92ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor             = dyn_cast<NonTypeTemplateParmDecl>(FirstParm))
93ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor    return NTTP->getDepth();
94ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor  else
95ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor    return cast<TemplateTemplateParmDecl>(FirstParm)->getDepth();
96ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor}
97ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor
98787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregorstatic void AdoptTemplateParameterList(TemplateParameterList *Params,
99787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor                                       DeclContext *Owner) {
100787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor  for (TemplateParameterList::iterator P = Params->begin(),
101787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor                                    PEnd = Params->end();
102787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor       P != PEnd; ++P) {
103787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor    (*P)->setDeclContext(Owner);
104787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor
105787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor    if (TemplateTemplateParmDecl *TTP = dyn_cast<TemplateTemplateParmDecl>(*P))
106787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor      AdoptTemplateParameterList(TTP->getTemplateParameters(), Owner);
107787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor  }
108787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor}
109787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor
110aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
1119eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne// RedeclarableTemplateDecl Implementation
1129eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne//===----------------------------------------------------------------------===//
1139eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne
1149eabebafc165a67812eacc184806e7bf34c5f0a5Peter CollingbourneRedeclarableTemplateDecl::CommonBase *RedeclarableTemplateDecl::getCommonPtr() {
1159eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne  // Find the first declaration of this function template.
1169eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne  RedeclarableTemplateDecl *First = getCanonicalDecl();
1179eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne
1189eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne  if (First->CommonOrPrev.isNull()) {
1196b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis    CommonBase *CommonPtr = First->newCommon(getASTContext());
1209eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne    First->CommonOrPrev = CommonPtr;
1218a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne    CommonPtr->Latest = First;
1229eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne  }
1239eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne  return First->CommonOrPrev.get<CommonBase*>();
1249eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne}
1259eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne
1269eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne
1279eabebafc165a67812eacc184806e7bf34c5f0a5Peter CollingbourneRedeclarableTemplateDecl *RedeclarableTemplateDecl::getCanonicalDeclImpl() {
1289eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne  RedeclarableTemplateDecl *Tmpl = this;
1299eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne  while (Tmpl->getPreviousDeclaration())
1309eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne    Tmpl = Tmpl->getPreviousDeclaration();
1319eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne  return Tmpl;
1329eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne}
1339eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne
1348a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbournevoid RedeclarableTemplateDecl::setPreviousDeclarationImpl(
1358a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne                                               RedeclarableTemplateDecl *Prev) {
1368a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne  if (Prev) {
1378a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne    CommonBase *Common = Prev->getCommonPtr();
1388a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne    Prev = Common->Latest;
1398a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne    Common->Latest = this;
1408a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne    CommonOrPrev = Prev;
1418a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne  } else {
1428a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne    assert(CommonOrPrev.is<CommonBase*>() && "Cannot reset TemplateDecl Prev");
1438a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne  }
1448a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne}
1458a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne
146f88718ea0ca0d64b7fd31d109f1d9ec769a9c45fPeter CollingbourneRedeclarableTemplateDecl *RedeclarableTemplateDecl::getNextRedeclaration() {
147f88718ea0ca0d64b7fd31d109f1d9ec769a9c45fPeter Collingbourne  if (CommonOrPrev.is<RedeclarableTemplateDecl*>())
148f88718ea0ca0d64b7fd31d109f1d9ec769a9c45fPeter Collingbourne    return CommonOrPrev.get<RedeclarableTemplateDecl*>();
149f88718ea0ca0d64b7fd31d109f1d9ec769a9c45fPeter Collingbourne  CommonBase *Common = CommonOrPrev.get<CommonBase*>();
150f88718ea0ca0d64b7fd31d109f1d9ec769a9c45fPeter Collingbourne  return Common ? Common->Latest : this;
151f88718ea0ca0d64b7fd31d109f1d9ec769a9c45fPeter Collingbourne}
152f88718ea0ca0d64b7fd31d109f1d9ec769a9c45fPeter Collingbourne
1534048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbournetemplate <class EntryType>
1544048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbournetypename RedeclarableTemplateDecl::SpecEntryTraits<EntryType>::DeclType*
1554048590d5774fd4b08661b5cf59b6f90b62f283aPeter CollingbourneRedeclarableTemplateDecl::findSpecializationImpl(
1564048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne                                 llvm::FoldingSet<EntryType> &Specs,
1574048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne                                 const TemplateArgument *Args, unsigned NumArgs,
1584048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne                                 void *&InsertPos) {
1594048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne  typedef SpecEntryTraits<EntryType> SETraits;
1604048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne  llvm::FoldingSetNodeID ID;
1614048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne  EntryType::Profile(ID,Args,NumArgs, getASTContext());
1624048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne  EntryType *Entry = Specs.FindNodeOrInsertPos(ID, InsertPos);
1634048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne  return Entry ? SETraits::getMostRecentDeclaration(Entry) : 0;
1644048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne}
1654048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne
166c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor/// \brief Generate the injected template arguments for the given template
167c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor/// parameter list, e.g., for the injected-class-name of a class template.
168c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregorstatic void GenerateInjectedTemplateArgs(ASTContext &Context,
169c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor                                        TemplateParameterList *Params,
170c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor                                         TemplateArgument *Args) {
171c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor  for (TemplateParameterList::iterator Param = Params->begin(),
172c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor                                    ParamEnd = Params->end();
173c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor       Param != ParamEnd; ++Param) {
174c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor    TemplateArgument Arg;
175c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor    if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(*Param)) {
176c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor      QualType ArgType = Context.getTypeDeclType(TTP);
177c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor      if (TTP->isParameterPack())
178c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor        ArgType = Context.getPackExpansionType(ArgType,
179c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor                                               llvm::Optional<unsigned>());
180c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor
181c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor      Arg = TemplateArgument(ArgType);
182c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor    } else if (NonTypeTemplateParmDecl *NTTP =
183c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor               dyn_cast<NonTypeTemplateParmDecl>(*Param)) {
184c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor      Expr *E = new (Context) DeclRefExpr(NTTP,
185c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor                                  NTTP->getType().getNonLValueExprType(Context),
186c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor                                  Expr::getValueKindForType(NTTP->getType()),
187c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor                                          NTTP->getLocation());
188c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor
189c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor      if (NTTP->isParameterPack())
190c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor        E = new (Context) PackExpansionExpr(Context.DependentTy, E,
191c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor                                            NTTP->getLocation(),
192c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor                                            llvm::Optional<unsigned>());
193c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor      Arg = TemplateArgument(E);
194c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor    } else {
195c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor      TemplateTemplateParmDecl *TTP = cast<TemplateTemplateParmDecl>(*Param);
196c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor      if (TTP->isParameterPack())
197c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor        Arg = TemplateArgument(TemplateName(TTP), llvm::Optional<unsigned>());
198c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor      else
199c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor        Arg = TemplateArgument(TemplateName(TTP));
200c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor    }
201c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor
202c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor    if ((*Param)->isTemplateParameterPack())
203c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor      Arg = TemplateArgument::CreatePackCopy(Context, &Arg, 1);
204c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor
205c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor    *Args++ = Arg;
206c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor  }
207c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor}
208c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor
2099eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne//===----------------------------------------------------------------------===//
210aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// FunctionTemplateDecl Implementation
211aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
212aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
2130054531488928a424666ac11fcdc6bcc5112de52Douglas Gregorvoid FunctionTemplateDecl::DeallocateCommon(void *Ptr) {
2140054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor  static_cast<Common *>(Ptr)->~Common();
2150054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor}
2160054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor
217aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorFunctionTemplateDecl *FunctionTemplateDecl::Create(ASTContext &C,
218aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                                   DeclContext *DC,
219aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                                   SourceLocation L,
220aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                                   DeclarationName Name,
221127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor                                               TemplateParameterList *Params,
222aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                                   NamedDecl *Decl) {
223787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor  AdoptTemplateParameterList(Params, cast<DeclContext>(Decl));
224aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor  return new (C) FunctionTemplateDecl(DC, L, Name, Params, Decl);
225aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor}
226aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
2279a299e0575ce235f491014627c7267e2d2cd73deDouglas GregorFunctionTemplateDecl *FunctionTemplateDecl::Create(ASTContext &C, EmptyShell) {
2289a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor  return new (C) FunctionTemplateDecl(0, SourceLocation(), DeclarationName(),
2299a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor                                      0, 0);
2309a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor}
2319a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor
2326b5415196327fa8ef00f028ba175fafef1738ae1Argyrios KyrtzidisRedeclarableTemplateDecl::CommonBase *
2336b5415196327fa8ef00f028ba175fafef1738ae1Argyrios KyrtzidisFunctionTemplateDecl::newCommon(ASTContext &C) {
2346b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis  Common *CommonPtr = new (C) Common;
2356b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis  C.AddDeallocation(DeallocateCommon, CommonPtr);
2369eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne  return CommonPtr;
2379eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne}
2389eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne
2392c853e401ca406d417eb916e867226050e7be06bArgyrios KyrtzidisFunctionDecl *
2402c853e401ca406d417eb916e867226050e7be06bArgyrios KyrtzidisFunctionTemplateDecl::findSpecialization(const TemplateArgument *Args,
2412c853e401ca406d417eb916e867226050e7be06bArgyrios Kyrtzidis                                         unsigned NumArgs, void *&InsertPos) {
2424048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne  return findSpecializationImpl(getSpecializations(), Args, NumArgs, InsertPos);
2432c853e401ca406d417eb916e867226050e7be06bArgyrios Kyrtzidis}
2442c853e401ca406d417eb916e867226050e7be06bArgyrios Kyrtzidis
245c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregorstd::pair<const TemplateArgument *, unsigned>
246c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas GregorFunctionTemplateDecl::getInjectedTemplateArgs() {
247c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor  TemplateParameterList *Params = getTemplateParameters();
248c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor  Common *CommonPtr = getCommonPtr();
249c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor  if (!CommonPtr->InjectedArgs) {
250c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor    CommonPtr->InjectedArgs
251c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor      = new (getASTContext()) TemplateArgument [Params->size()];
252c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor    GenerateInjectedTemplateArgs(getASTContext(), Params,
253c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor                                 CommonPtr->InjectedArgs);
254c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor  }
255c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor
256c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor  return std::make_pair(CommonPtr->InjectedArgs, Params->size());
257c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor}
258c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor
259aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
260aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// ClassTemplateDecl Implementation
261aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
262aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
2630054531488928a424666ac11fcdc6bcc5112de52Douglas Gregorvoid ClassTemplateDecl::DeallocateCommon(void *Ptr) {
2640054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor  static_cast<Common *>(Ptr)->~Common();
2650054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor}
2660054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor
2678731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios KyrtzidisClassTemplateDecl *ClassTemplateDecl::Create(ASTContext &C,
2688731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis                                             DeclContext *DC,
2698731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis                                             SourceLocation L,
2708731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis                                             DeclarationName Name,
2718731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis                                             TemplateParameterList *Params,
2728731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis                                             NamedDecl *Decl,
2738731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis                                             ClassTemplateDecl *PrevDecl) {
274787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor  AdoptTemplateParameterList(Params, cast<DeclContext>(Decl));
2758731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis  ClassTemplateDecl *New = new (C) ClassTemplateDecl(DC, L, Name, Params, Decl);
2765bf1bdc2fedb0c29b5fcdb4abc852aa85b4fe26aArgyrios Kyrtzidis  New->setPreviousDeclaration(PrevDecl);
2778731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis  return New;
2785953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor}
2795953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor
2809a299e0575ce235f491014627c7267e2d2cd73deDouglas GregorClassTemplateDecl *ClassTemplateDecl::Create(ASTContext &C, EmptyShell Empty) {
2819a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor  return new (C) ClassTemplateDecl(Empty);
2829a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor}
2839a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor
284c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregorvoid ClassTemplateDecl::LoadLazySpecializations() {
285c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor  Common *CommonPtr = getCommonPtr();
286c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor  if (CommonPtr->LazySpecializations) {
287c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor    ASTContext &Context = getASTContext();
288c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor    uint32_t *Specs = CommonPtr->LazySpecializations;
289c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor    CommonPtr->LazySpecializations = 0;
290c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor    for (uint32_t I = 0, N = *Specs++; I != N; ++I)
291c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor      (void)Context.getExternalSource()->GetExternalDecl(Specs[I]);
292c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor  }
293c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor}
294c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor
295c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregorllvm::FoldingSet<ClassTemplateSpecializationDecl> &
296c8e5cf8f725e111965debb7130ef7466c0c73884Douglas GregorClassTemplateDecl::getSpecializations() {
297c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor  LoadLazySpecializations();
298c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor  return getCommonPtr()->Specializations;
299c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor}
300c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor
301c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregorllvm::FoldingSet<ClassTemplatePartialSpecializationDecl> &
302c8e5cf8f725e111965debb7130ef7466c0c73884Douglas GregorClassTemplateDecl::getPartialSpecializations() {
303c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor  LoadLazySpecializations();
304c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor  return getCommonPtr()->PartialSpecializations;
305c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor}
306c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor
3076b5415196327fa8ef00f028ba175fafef1738ae1Argyrios KyrtzidisRedeclarableTemplateDecl::CommonBase *
3086b5415196327fa8ef00f028ba175fafef1738ae1Argyrios KyrtzidisClassTemplateDecl::newCommon(ASTContext &C) {
3096b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis  Common *CommonPtr = new (C) Common;
3106b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis  C.AddDeallocation(DeallocateCommon, CommonPtr);
3119eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne  return CommonPtr;
3129eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne}
3139eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne
314cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplateSpecializationDecl *
315cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplateDecl::findSpecialization(const TemplateArgument *Args,
316cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis                                      unsigned NumArgs, void *&InsertPos) {
3174048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne  return findSpecializationImpl(getSpecializations(), Args, NumArgs, InsertPos);
318cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis}
319cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis
320bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidisvoid ClassTemplateDecl::AddSpecialization(ClassTemplateSpecializationDecl *D,
321bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis                                          void *InsertPos) {
322bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis  getSpecializations().InsertNode(D, InsertPos);
323bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis  if (ASTMutationListener *L = getASTMutationListener())
324bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis    L->AddedCXXTemplateSpecialization(this, D);
325bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis}
326bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis
327cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplatePartialSpecializationDecl *
328cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplateDecl::findPartialSpecialization(const TemplateArgument *Args,
329cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis                                             unsigned NumArgs,
330cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis                                             void *&InsertPos) {
3314048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne  return findSpecializationImpl(getPartialSpecializations(), Args, NumArgs,
3324048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne                                InsertPos);
333cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis}
334cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis
335bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidisvoid ClassTemplateDecl::AddPartialSpecialization(
336bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis                                      ClassTemplatePartialSpecializationDecl *D,
337bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis                                      void *InsertPos) {
338bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis  getPartialSpecializations().InsertNode(D, InsertPos);
339bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis  if (ASTMutationListener *L = getASTMutationListener())
340bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis    L->AddedCXXTemplateSpecialization(this, D);
341bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis}
342bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis
343dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregorvoid ClassTemplateDecl::getPartialSpecializations(
344dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor          llvm::SmallVectorImpl<ClassTemplatePartialSpecializationDecl *> &PS) {
345dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor  llvm::FoldingSet<ClassTemplatePartialSpecializationDecl> &PartialSpecs
3465bf1bdc2fedb0c29b5fcdb4abc852aa85b4fe26aArgyrios Kyrtzidis    = getPartialSpecializations();
347dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor  PS.clear();
348dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor  PS.resize(PartialSpecs.size());
349dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor  for (llvm::FoldingSet<ClassTemplatePartialSpecializationDecl>::iterator
350dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor       P = PartialSpecs.begin(), PEnd = PartialSpecs.end();
351dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor       P != PEnd; ++P) {
352dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor    assert(!PS[P->getSequenceNumber()]);
353cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis    PS[P->getSequenceNumber()] = P->getMostRecentDeclaration();
354dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor  }
355dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor}
356dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor
357b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas GregorClassTemplatePartialSpecializationDecl *
358b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas GregorClassTemplateDecl::findPartialSpecialization(QualType T) {
359b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor  ASTContext &Context = getASTContext();
360b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor  typedef llvm::FoldingSet<ClassTemplatePartialSpecializationDecl>::iterator
361b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor    partial_spec_iterator;
362b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor  for (partial_spec_iterator P = getPartialSpecializations().begin(),
363b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor                          PEnd = getPartialSpecializations().end();
364b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor       P != PEnd; ++P) {
36531f17ecbef57b5679c017c375db330546b7b5145John McCall    if (Context.hasSameType(P->getInjectedSpecializationType(), T))
366cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis      return P->getMostRecentDeclaration();
367cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis  }
368cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis
369cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis  return 0;
370cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis}
371cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis
372cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplatePartialSpecializationDecl *
373cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplateDecl::findPartialSpecInstantiatedFromMember(
374cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis                                    ClassTemplatePartialSpecializationDecl *D) {
375cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis  Decl *DCanon = D->getCanonicalDecl();
376cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis  for (llvm::FoldingSet<ClassTemplatePartialSpecializationDecl>::iterator
377cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis            P = getPartialSpecializations().begin(),
378cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis         PEnd = getPartialSpecializations().end();
379cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis       P != PEnd; ++P) {
380cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis    if (P->getInstantiatedFromMember()->getCanonicalDecl() == DCanon)
381cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis      return P->getMostRecentDeclaration();
382b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor  }
3831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
384b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor  return 0;
385b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor}
386b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor
3873cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCallQualType
38824bae92f08ae098cc50a602d8cf1273b423e14daDouglas GregorClassTemplateDecl::getInjectedClassNameSpecialization() {
3895bf1bdc2fedb0c29b5fcdb4abc852aa85b4fe26aArgyrios Kyrtzidis  Common *CommonPtr = getCommonPtr();
3907da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor  if (!CommonPtr->InjectedClassNameType.isNull())
3917da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor    return CommonPtr->InjectedClassNameType;
3927da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor
393b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor  // C++0x [temp.dep.type]p2:
394b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor  //  The template argument list of a primary template is a template argument
395b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor  //  list in which the nth template argument has the value of the nth template
396b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor  //  parameter of the class template. If the nth template parameter is a
397b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor  //  template parameter pack (14.5.3), the nth template argument is a pack
398b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor  //  expansion (14.5.3) whose pattern is the name of the template parameter
399b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor  //  pack.
40024bae92f08ae098cc50a602d8cf1273b423e14daDouglas Gregor  ASTContext &Context = getASTContext();
4017da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor  TemplateParameterList *Params = getTemplateParameters();
4027da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor  llvm::SmallVector<TemplateArgument, 16> TemplateArgs;
403c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor  TemplateArgs.resize(Params->size());
404c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor  GenerateInjectedTemplateArgs(getASTContext(), Params, TemplateArgs.data());
4057da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor  CommonPtr->InjectedClassNameType
4061275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor    = Context.getTemplateSpecializationType(TemplateName(this),
4077da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor                                            &TemplateArgs[0],
4081275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor                                            TemplateArgs.size());
4097da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor  return CommonPtr->InjectedClassNameType;
4107da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor}
4117da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor
412aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
413aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// TemplateTypeParm Allocation/Deallocation Method Implementations
414aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
415aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
416aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorTemplateTypeParmDecl *
4174ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadTemplateTypeParmDecl::Create(const ASTContext &C, DeclContext *DC,
418344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara                             SourceLocation KeyLoc, SourceLocation NameLoc,
419344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara                             unsigned D, unsigned P, IdentifierInfo *Id,
420344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara                             bool Typename, bool ParameterPack) {
421efed5c832de630715dd42211dd3b2aab5dd97a1bDouglas Gregor  QualType Type = C.getTemplateTypeParmType(D, P, ParameterPack, Id);
422344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara  return new (C) TemplateTypeParmDecl(DC, KeyLoc, NameLoc, Id, Typename,
423344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara                                      Type, ParameterPack);
424aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor}
425aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
426b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios KyrtzidisTemplateTypeParmDecl *
4274ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadTemplateTypeParmDecl::Create(const ASTContext &C, EmptyShell Empty) {
428344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara  return new (C) TemplateTypeParmDecl(0, SourceLocation(), SourceLocation(),
429344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara                                      0, false, QualType(), false);
430b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios Kyrtzidis}
431b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios Kyrtzidis
432833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallSourceLocation TemplateTypeParmDecl::getDefaultArgumentLoc() const {
43377d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara  return hasDefaultArgument()
43477d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara    ? DefaultArgument->getTypeLoc().getBeginLoc()
43577d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara    : SourceLocation();
43677d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara}
43777d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara
43877d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo BagnaraSourceRange TemplateTypeParmDecl::getSourceRange() const {
43977d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara  if (hasDefaultArgument() && !defaultArgumentWasInherited())
440344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara    return SourceRange(getLocStart(),
44177d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara                       DefaultArgument->getTypeLoc().getEndLoc());
44277d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara  else
443344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara    return TypeDecl::getSourceRange();
444833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall}
445833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
446ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregorunsigned TemplateTypeParmDecl::getDepth() const {
447ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor  return TypeForDecl->getAs<TemplateTypeParmType>()->getDepth();
448ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor}
449ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor
450ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregorunsigned TemplateTypeParmDecl::getIndex() const {
451ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor  return TypeForDecl->getAs<TemplateTypeParmType>()->getIndex();
452ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor}
453ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor
454aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
455aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// NonTypeTemplateParmDecl Method Implementations
456aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
457aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
4586952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas GregorNonTypeTemplateParmDecl::NonTypeTemplateParmDecl(DeclContext *DC,
4596952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                                 SourceLocation L, unsigned D,
4606952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                                 unsigned P, IdentifierInfo *Id,
4616952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                                 QualType T,
4626952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                                 TypeSourceInfo *TInfo,
4636952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                                 const QualType *ExpandedTypes,
4646952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                                 unsigned NumExpandedTypes,
4656952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                                TypeSourceInfo **ExpandedTInfos)
46676a40219ee5624d78aba167dce02bdbaa930955fJohn McCall  : DeclaratorDecl(NonTypeTemplateParm, DC, L, Id, T, TInfo),
4676952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor    TemplateParmPosition(D, P), DefaultArgumentAndInherited(0, false),
4686952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor    ParameterPack(true), ExpandedParameterPack(true),
4696952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor    NumExpandedTypes(NumExpandedTypes)
4706952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor{
4716952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor  if (ExpandedTypes && ExpandedTInfos) {
4726952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor    void **TypesAndInfos = reinterpret_cast<void **>(this + 1);
4736952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor    for (unsigned I = 0; I != NumExpandedTypes; ++I) {
4746952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor      TypesAndInfos[2*I] = ExpandedTypes[I].getAsOpaquePtr();
4756952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor      TypesAndInfos[2*I + 1] = ExpandedTInfos[I];
4766952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor    }
4776952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor  }
4786952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor}
4796952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor
480aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorNonTypeTemplateParmDecl *
4814ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadNonTypeTemplateParmDecl::Create(const ASTContext &C, DeclContext *DC,
482aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                SourceLocation L, unsigned D, unsigned P,
483aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                IdentifierInfo *Id, QualType T,
48410738d36b150aa65206890c1c845cdba076e4200Douglas Gregor                                bool ParameterPack, TypeSourceInfo *TInfo) {
48510738d36b150aa65206890c1c845cdba076e4200Douglas Gregor  return new (C) NonTypeTemplateParmDecl(DC, L, D, P, Id, T, ParameterPack,
48610738d36b150aa65206890c1c845cdba076e4200Douglas Gregor                                         TInfo);
487aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor}
488aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
4896952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas GregorNonTypeTemplateParmDecl *
4906952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas GregorNonTypeTemplateParmDecl::Create(const ASTContext &C, DeclContext *DC,
4916952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                SourceLocation L, unsigned D, unsigned P,
4926952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                IdentifierInfo *Id, QualType T,
4936952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                TypeSourceInfo *TInfo,
4946952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                const QualType *ExpandedTypes,
4956952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                unsigned NumExpandedTypes,
4966952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                TypeSourceInfo **ExpandedTInfos) {
4976952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor  unsigned Size = sizeof(NonTypeTemplateParmDecl)
4986952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                + NumExpandedTypes * 2 * sizeof(void*);
4996952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor  void *Mem = C.Allocate(Size);
5006952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor  return new (Mem) NonTypeTemplateParmDecl(DC, L, D, P, Id, T, TInfo,
5016952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                           ExpandedTypes, NumExpandedTypes,
5026952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                           ExpandedTInfos);
5036952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor}
5046952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor
505da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas GregorSourceLocation NonTypeTemplateParmDecl::getInnerLocStart() const {
506da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor  SourceLocation Start = getTypeSpecStartLoc();
507da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor  if (Start.isInvalid())
508da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor    Start = getLocation();
509da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor  return Start;
510da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor}
511da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor
51276a40219ee5624d78aba167dce02bdbaa930955fJohn McCallSourceRange NonTypeTemplateParmDecl::getSourceRange() const {
513ee4bfd412db491c489fc2ee74916edd73f9c618aAbramo Bagnara  SourceLocation End = getLocation();
514ee4bfd412db491c489fc2ee74916edd73f9c618aAbramo Bagnara  if (hasDefaultArgument() && !defaultArgumentWasInherited())
515ee4bfd412db491c489fc2ee74916edd73f9c618aAbramo Bagnara    End = getDefaultArgument()->getSourceRange().getEnd();
516ee4bfd412db491c489fc2ee74916edd73f9c618aAbramo Bagnara  return SourceRange(getOuterLocStart(), End);
51776a40219ee5624d78aba167dce02bdbaa930955fJohn McCall}
51876a40219ee5624d78aba167dce02bdbaa930955fJohn McCall
519d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas GregorSourceLocation NonTypeTemplateParmDecl::getDefaultArgumentLoc() const {
520d92f7a297c0ed3f7d0ebcbb557e1d4c1925b8c72Abramo Bagnara  return hasDefaultArgument()
521d92f7a297c0ed3f7d0ebcbb557e1d4c1925b8c72Abramo Bagnara    ? getDefaultArgument()->getSourceRange().getBegin()
522d92f7a297c0ed3f7d0ebcbb557e1d4c1925b8c72Abramo Bagnara    : SourceLocation();
523d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas Gregor}
524d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas Gregor
525aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
526aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// TemplateTemplateParmDecl Method Implementations
527aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
528aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
529aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorTemplateTemplateParmDecl *
5304ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadTemplateTemplateParmDecl::Create(const ASTContext &C, DeclContext *DC,
531aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                 SourceLocation L, unsigned D, unsigned P,
53261c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor                                 bool ParameterPack, IdentifierInfo *Id,
533aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                 TemplateParameterList *Params) {
53461c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor  return new (C) TemplateTemplateParmDecl(DC, L, D, P, ParameterPack, Id,
53561c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor                                          Params);
536aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor}
537aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
5383e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor//===----------------------------------------------------------------------===//
5397e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor// TemplateArgumentList Implementation
5407e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor//===----------------------------------------------------------------------===//
541910f8008fea79120489a53593fe971b0b8a4a740Douglas GregorTemplateArgumentList *
542910f8008fea79120489a53593fe971b0b8a4a740Douglas GregorTemplateArgumentList::CreateCopy(ASTContext &Context,
543910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor                                 const TemplateArgument *Args,
544910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor                                 unsigned NumArgs) {
545910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor  std::size_t Size = sizeof(TemplateArgumentList)
546910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor                   + NumArgs * sizeof(TemplateArgument);
547910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor  void *Mem = Context.Allocate(Size);
548910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor  TemplateArgument *StoredArgs
549910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor    = reinterpret_cast<TemplateArgument *>(
550910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor                                static_cast<TemplateArgumentList *>(Mem) + 1);
551910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor  std::uninitialized_copy(Args, Args + NumArgs, StoredArgs);
552910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor  return new (Mem) TemplateArgumentList(StoredArgs, NumArgs, true);
55394d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis}
55494d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis
5557e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor//===----------------------------------------------------------------------===//
5563e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor// ClassTemplateSpecializationDecl Implementation
5573e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor//===----------------------------------------------------------------------===//
5583e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas GregorClassTemplateSpecializationDecl::
55913c8577201e4fc0ddac5f09d05fd1778832137d1Douglas GregorClassTemplateSpecializationDecl(ASTContext &Context, Kind DK, TagKind TK,
5607e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor                                DeclContext *DC, SourceLocation L,
5613e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor                                ClassTemplateDecl *SpecializedTemplate,
562910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor                                const TemplateArgument *Args,
563910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor                                unsigned NumArgs,
5648e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor                                ClassTemplateSpecializationDecl *PrevDecl)
56513c8577201e4fc0ddac5f09d05fd1778832137d1Douglas Gregor  : CXXRecordDecl(DK, TK, DC, L,
5668e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor                  SpecializedTemplate->getIdentifier(),
5678e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor                  PrevDecl),
5683e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor    SpecializedTemplate(SpecializedTemplate),
569c98971d5c994caed9452aeadd0122c855e0f4de1Abramo Bagnara    ExplicitInfo(0),
570910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor    TemplateArgs(TemplateArgumentList::CreateCopy(Context, Args, NumArgs)),
5717e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor    SpecializationKind(TSK_Undeclared) {
5723e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor}
5731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
57494d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios KyrtzidisClassTemplateSpecializationDecl::ClassTemplateSpecializationDecl(Kind DK)
57594d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis  : CXXRecordDecl(DK, TTK_Struct, 0, SourceLocation(), 0, 0),
57694d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis    ExplicitInfo(0),
57794d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis    SpecializationKind(TSK_Undeclared) {
57894d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis}
57994d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis
5803e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas GregorClassTemplateSpecializationDecl *
58113c8577201e4fc0ddac5f09d05fd1778832137d1Douglas GregorClassTemplateSpecializationDecl::Create(ASTContext &Context, TagKind TK,
5823e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor                                        DeclContext *DC, SourceLocation L,
5833e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor                                        ClassTemplateDecl *SpecializedTemplate,
584910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor                                        const TemplateArgument *Args,
585910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor                                        unsigned NumArgs,
586cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor                                   ClassTemplateSpecializationDecl *PrevDecl) {
587cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor  ClassTemplateSpecializationDecl *Result
5881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    = new (Context)ClassTemplateSpecializationDecl(Context,
589c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor                                                   ClassTemplateSpecialization,
59013c8577201e4fc0ddac5f09d05fd1778832137d1Douglas Gregor                                                   TK, DC, L,
5917e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor                                                   SpecializedTemplate,
592910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor                                                   Args, NumArgs,
5938e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor                                                   PrevDecl);
594cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor  Context.getTypeDeclType(Result, PrevDecl);
595cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor  return Result;
5963e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor}
597c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor
59894d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios KyrtzidisClassTemplateSpecializationDecl *
599b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios KyrtzidisClassTemplateSpecializationDecl::Create(ASTContext &Context, EmptyShell Empty) {
60094d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis  return
60194d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis    new (Context)ClassTemplateSpecializationDecl(ClassTemplateSpecialization);
60294d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis}
60394d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis
604da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregorvoid
605da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas GregorClassTemplateSpecializationDecl::getNameForDiagnostic(std::string &S,
606da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor                                                  const PrintingPolicy &Policy,
607da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor                                                      bool Qualified) const {
608da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor  NamedDecl::getNameForDiagnostic(S, Policy, Qualified);
609da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor
610da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor  const TemplateArgumentList &TemplateArgs = getTemplateArgs();
611da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor  S += TemplateSpecializationType::PrintTemplateArgumentList(
612da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor                                                          TemplateArgs.data(),
613da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor                                                          TemplateArgs.size(),
614da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor                                                             Policy);
615da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor}
616da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor
61737d93e9252026d4fb836d9c05d0122a2d46e56beDouglas GregorClassTemplateDecl *
6181eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpClassTemplateSpecializationDecl::getSpecializedTemplate() const {
6191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (SpecializedPartialSpecialization *PartialSpec
62037d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor      = SpecializedTemplate.dyn_cast<SpecializedPartialSpecialization*>())
62137d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor    return PartialSpec->PartialSpecialization->getSpecializedTemplate();
62237d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor  return SpecializedTemplate.get<ClassTemplateDecl*>();
62337d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor}
62437d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor
6254a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo BagnaraSourceRange
6264a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo BagnaraClassTemplateSpecializationDecl::getSourceRange() const {
6274a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo Bagnara  if (!ExplicitInfo)
6284a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo Bagnara    return SourceRange();
6294a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo Bagnara  SourceLocation Begin = getExternLoc();
6304a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo Bagnara  if (Begin.isInvalid())
6314a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo Bagnara    Begin = getTemplateKeywordLoc();
6324a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo Bagnara  SourceLocation End = getRBraceLoc();
6334a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo Bagnara  if (End.isInvalid())
6344a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo Bagnara    End = getTypeAsWritten()->getTypeLoc().getEndLoc();
6354a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo Bagnara  return SourceRange(Begin, End);
6364a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo Bagnara}
6374a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo Bagnara
638c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor//===----------------------------------------------------------------------===//
639c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor// ClassTemplatePartialSpecializationDecl Implementation
640c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor//===----------------------------------------------------------------------===//
6419a299e0575ce235f491014627c7267e2d2cd73deDouglas GregorClassTemplatePartialSpecializationDecl::
6429a299e0575ce235f491014627c7267e2d2cd73deDouglas GregorClassTemplatePartialSpecializationDecl(ASTContext &Context, TagKind TK,
6439a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor                                       DeclContext *DC, SourceLocation L,
6449a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor                                       TemplateParameterList *Params,
6459a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor                                       ClassTemplateDecl *SpecializedTemplate,
6469a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor                                       const TemplateArgument *Args,
6479a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor                                       unsigned NumArgs,
6489a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor                                       TemplateArgumentLoc *ArgInfos,
6499a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor                                       unsigned NumArgInfos,
6509a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor                               ClassTemplatePartialSpecializationDecl *PrevDecl,
6519a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor                                       unsigned SequenceNumber)
6529a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor  : ClassTemplateSpecializationDecl(Context,
6539a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor                                    ClassTemplatePartialSpecialization,
6549a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor                                    TK, DC, L, SpecializedTemplate,
6559a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor                                    Args, NumArgs, PrevDecl),
6569a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor    TemplateParams(Params), ArgsAsWritten(ArgInfos),
6579a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor    NumArgsAsWritten(NumArgInfos), SequenceNumber(SequenceNumber),
6589a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor    InstantiatedFromMember(0, false)
6599a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor{
660787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor  AdoptTemplateParameterList(Params, this);
6619a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor}
6629a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor
663c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas GregorClassTemplatePartialSpecializationDecl *
664c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas GregorClassTemplatePartialSpecializationDecl::
66513c8577201e4fc0ddac5f09d05fd1778832137d1Douglas GregorCreate(ASTContext &Context, TagKind TK,DeclContext *DC, SourceLocation L,
666c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor       TemplateParameterList *Params,
667c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor       ClassTemplateDecl *SpecializedTemplate,
668910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor       const TemplateArgument *Args,
669910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor       unsigned NumArgs,
670d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall       const TemplateArgumentListInfo &ArgInfos,
6713cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall       QualType CanonInjectedType,
672dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor       ClassTemplatePartialSpecializationDecl *PrevDecl,
673dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor       unsigned SequenceNumber) {
674d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  unsigned N = ArgInfos.size();
675833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  TemplateArgumentLoc *ClonedArgs = new (Context) TemplateArgumentLoc[N];
676833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  for (unsigned I = 0; I != N; ++I)
677833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    ClonedArgs[I] = ArgInfos[I];
678833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
679c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor  ClassTemplatePartialSpecializationDecl *Result
68013c8577201e4fc0ddac5f09d05fd1778832137d1Douglas Gregor    = new (Context)ClassTemplatePartialSpecializationDecl(Context, TK,
681c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor                                                          DC, L, Params,
682c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor                                                          SpecializedTemplate,
683910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor                                                          Args, NumArgs,
684833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                                          ClonedArgs, N,
685dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor                                                          PrevDecl,
686dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor                                                          SequenceNumber);
687c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor  Result->setSpecializationKind(TSK_ExplicitSpecialization);
6883cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall
6893cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  Context.getInjectedClassNameType(Result, CanonInjectedType);
690c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor  return Result;
691c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor}
692dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall
69394d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios KyrtzidisClassTemplatePartialSpecializationDecl *
694b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios KyrtzidisClassTemplatePartialSpecializationDecl::Create(ASTContext &Context,
695b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios Kyrtzidis                                               EmptyShell Empty) {
69694d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis  return new (Context)ClassTemplatePartialSpecializationDecl();
69794d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis}
69894d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis
699dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall//===----------------------------------------------------------------------===//
700dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall// FriendTemplateDecl Implementation
701dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall//===----------------------------------------------------------------------===//
702dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall
703dd4a3b0065b9a7e7b00073df415a798886c090f3John McCallFriendTemplateDecl *FriendTemplateDecl::Create(ASTContext &Context,
704dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall                                               DeclContext *DC,
705dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall                                               SourceLocation L,
706dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall                                               unsigned NParams,
707dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall                                               TemplateParameterList **Params,
708dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall                                               FriendUnion Friend,
709dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall                                               SourceLocation FLoc) {
710dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall  FriendTemplateDecl *Result
711dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall    = new (Context) FriendTemplateDecl(DC, L, NParams, Params, Friend, FLoc);
712dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall  return Result;
713dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall}
714554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis
715554e6aa2da082575514607c3639c246c04b3232aArgyrios KyrtzidisFriendTemplateDecl *FriendTemplateDecl::Create(ASTContext &Context,
716554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis                                               EmptyShell Empty) {
717554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis  return new (Context) FriendTemplateDecl(Empty);
718554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis}
719