DeclTemplate.cpp revision 1e68ecc4fcce12f683c4fd38acfd1a004001b04f
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
2271e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorFunctionTemplateDecl *FunctionTemplateDecl::CreateDeserialized(ASTContext &C,
2281e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor                                                               unsigned ID) {
2291e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor  void *Mem = AllocateDeserializedDecl(C, ID, sizeof(FunctionTemplateDecl));
2301e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor  return new (Mem) FunctionTemplateDecl(0, SourceLocation(), DeclarationName(),
2311e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor                                        0, 0);
2329a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor}
2339a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor
2346b5415196327fa8ef00f028ba175fafef1738ae1Argyrios KyrtzidisRedeclarableTemplateDecl::CommonBase *
2356b5415196327fa8ef00f028ba175fafef1738ae1Argyrios KyrtzidisFunctionTemplateDecl::newCommon(ASTContext &C) {
2366b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis  Common *CommonPtr = new (C) Common;
2376b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis  C.AddDeallocation(DeallocateCommon, CommonPtr);
2389eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne  return CommonPtr;
2399eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne}
2409eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne
2412c853e401ca406d417eb916e867226050e7be06bArgyrios KyrtzidisFunctionDecl *
2422c853e401ca406d417eb916e867226050e7be06bArgyrios KyrtzidisFunctionTemplateDecl::findSpecialization(const TemplateArgument *Args,
2432c853e401ca406d417eb916e867226050e7be06bArgyrios Kyrtzidis                                         unsigned NumArgs, void *&InsertPos) {
2444048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne  return findSpecializationImpl(getSpecializations(), Args, NumArgs, InsertPos);
2452c853e401ca406d417eb916e867226050e7be06bArgyrios Kyrtzidis}
2462c853e401ca406d417eb916e867226050e7be06bArgyrios Kyrtzidis
2475bbcdbf36f8cf79d99703ef20848c55960065e43Sebastian Redlvoid FunctionTemplateDecl::addSpecialization(
2485bbcdbf36f8cf79d99703ef20848c55960065e43Sebastian Redl      FunctionTemplateSpecializationInfo *Info, void *InsertPos) {
2495bbcdbf36f8cf79d99703ef20848c55960065e43Sebastian Redl  getSpecializations().InsertNode(Info, InsertPos);
2505bbcdbf36f8cf79d99703ef20848c55960065e43Sebastian Redl  if (ASTMutationListener *L = getASTMutationListener())
2515bbcdbf36f8cf79d99703ef20848c55960065e43Sebastian Redl    L->AddedCXXTemplateSpecialization(this, Info->Function);
2525bbcdbf36f8cf79d99703ef20848c55960065e43Sebastian Redl}
2535bbcdbf36f8cf79d99703ef20848c55960065e43Sebastian Redl
254c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregorstd::pair<const TemplateArgument *, unsigned>
255c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas GregorFunctionTemplateDecl::getInjectedTemplateArgs() {
256c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor  TemplateParameterList *Params = getTemplateParameters();
257c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor  Common *CommonPtr = getCommonPtr();
258c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor  if (!CommonPtr->InjectedArgs) {
259c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor    CommonPtr->InjectedArgs
260c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor      = new (getASTContext()) TemplateArgument [Params->size()];
261c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor    GenerateInjectedTemplateArgs(getASTContext(), Params,
262c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor                                 CommonPtr->InjectedArgs);
263c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor  }
264c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor
265c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor  return std::make_pair(CommonPtr->InjectedArgs, Params->size());
266c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor}
267c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor
268aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
269aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// ClassTemplateDecl Implementation
270aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
271aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
2720054531488928a424666ac11fcdc6bcc5112de52Douglas Gregorvoid ClassTemplateDecl::DeallocateCommon(void *Ptr) {
2730054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor  static_cast<Common *>(Ptr)->~Common();
2740054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor}
2750054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor
2768731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios KyrtzidisClassTemplateDecl *ClassTemplateDecl::Create(ASTContext &C,
2778731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis                                             DeclContext *DC,
2788731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis                                             SourceLocation L,
2798731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis                                             DeclarationName Name,
2808731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis                                             TemplateParameterList *Params,
2818731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis                                             NamedDecl *Decl,
2828731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis                                             ClassTemplateDecl *PrevDecl) {
283787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor  AdoptTemplateParameterList(Params, cast<DeclContext>(Decl));
2848731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis  ClassTemplateDecl *New = new (C) ClassTemplateDecl(DC, L, Name, Params, Decl);
2855bf1bdc2fedb0c29b5fcdb4abc852aa85b4fe26aArgyrios Kyrtzidis  New->setPreviousDeclaration(PrevDecl);
2868731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis  return New;
2875953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor}
2885953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor
2891e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorClassTemplateDecl *ClassTemplateDecl::CreateDeserialized(ASTContext &C,
2901e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor                                                         unsigned ID) {
2911e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor  void *Mem = AllocateDeserializedDecl(C, ID, sizeof(ClassTemplateDecl));
2921e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor  return new (Mem) ClassTemplateDecl(EmptyShell());
2939a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor}
2949a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor
295c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregorvoid ClassTemplateDecl::LoadLazySpecializations() {
296c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor  Common *CommonPtr = getCommonPtr();
297c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor  if (CommonPtr->LazySpecializations) {
298c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor    ASTContext &Context = getASTContext();
299c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor    uint32_t *Specs = CommonPtr->LazySpecializations;
300c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor    CommonPtr->LazySpecializations = 0;
301c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor    for (uint32_t I = 0, N = *Specs++; I != N; ++I)
302c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor      (void)Context.getExternalSource()->GetExternalDecl(Specs[I]);
303c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor  }
304c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor}
305c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor
306c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregorllvm::FoldingSet<ClassTemplateSpecializationDecl> &
307c8e5cf8f725e111965debb7130ef7466c0c73884Douglas GregorClassTemplateDecl::getSpecializations() {
308c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor  LoadLazySpecializations();
309c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor  return getCommonPtr()->Specializations;
310c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor}
311c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor
312c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregorllvm::FoldingSet<ClassTemplatePartialSpecializationDecl> &
313c8e5cf8f725e111965debb7130ef7466c0c73884Douglas GregorClassTemplateDecl::getPartialSpecializations() {
314c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor  LoadLazySpecializations();
315c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor  return getCommonPtr()->PartialSpecializations;
316c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor}
317c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor
3186b5415196327fa8ef00f028ba175fafef1738ae1Argyrios KyrtzidisRedeclarableTemplateDecl::CommonBase *
3196b5415196327fa8ef00f028ba175fafef1738ae1Argyrios KyrtzidisClassTemplateDecl::newCommon(ASTContext &C) {
3206b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis  Common *CommonPtr = new (C) Common;
3216b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis  C.AddDeallocation(DeallocateCommon, CommonPtr);
3229eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne  return CommonPtr;
3239eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne}
3249eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne
325cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplateSpecializationDecl *
326cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplateDecl::findSpecialization(const TemplateArgument *Args,
327cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis                                      unsigned NumArgs, void *&InsertPos) {
3284048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne  return findSpecializationImpl(getSpecializations(), Args, NumArgs, InsertPos);
329cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis}
330cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis
331bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidisvoid ClassTemplateDecl::AddSpecialization(ClassTemplateSpecializationDecl *D,
332bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis                                          void *InsertPos) {
333bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis  getSpecializations().InsertNode(D, InsertPos);
334bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis  if (ASTMutationListener *L = getASTMutationListener())
335bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis    L->AddedCXXTemplateSpecialization(this, D);
336bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis}
337bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis
338cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplatePartialSpecializationDecl *
339cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplateDecl::findPartialSpecialization(const TemplateArgument *Args,
340cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis                                             unsigned NumArgs,
341cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis                                             void *&InsertPos) {
3424048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne  return findSpecializationImpl(getPartialSpecializations(), Args, NumArgs,
3434048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne                                InsertPos);
344cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis}
345cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis
346bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidisvoid ClassTemplateDecl::AddPartialSpecialization(
347bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis                                      ClassTemplatePartialSpecializationDecl *D,
348bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis                                      void *InsertPos) {
349bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis  getPartialSpecializations().InsertNode(D, InsertPos);
350bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis  if (ASTMutationListener *L = getASTMutationListener())
351bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis    L->AddedCXXTemplateSpecialization(this, D);
352bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis}
353bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis
354dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregorvoid ClassTemplateDecl::getPartialSpecializations(
3555f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner          SmallVectorImpl<ClassTemplatePartialSpecializationDecl *> &PS) {
356dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor  llvm::FoldingSet<ClassTemplatePartialSpecializationDecl> &PartialSpecs
3575bf1bdc2fedb0c29b5fcdb4abc852aa85b4fe26aArgyrios Kyrtzidis    = getPartialSpecializations();
358dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor  PS.clear();
359dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor  PS.resize(PartialSpecs.size());
360dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor  for (llvm::FoldingSet<ClassTemplatePartialSpecializationDecl>::iterator
361dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor       P = PartialSpecs.begin(), PEnd = PartialSpecs.end();
362dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor       P != PEnd; ++P) {
363dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor    assert(!PS[P->getSequenceNumber()]);
364cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis    PS[P->getSequenceNumber()] = P->getMostRecentDeclaration();
365dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor  }
366dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor}
367dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor
368b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas GregorClassTemplatePartialSpecializationDecl *
369b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas GregorClassTemplateDecl::findPartialSpecialization(QualType T) {
370b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor  ASTContext &Context = getASTContext();
371b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor  typedef llvm::FoldingSet<ClassTemplatePartialSpecializationDecl>::iterator
372b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor    partial_spec_iterator;
373b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor  for (partial_spec_iterator P = getPartialSpecializations().begin(),
374b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor                          PEnd = getPartialSpecializations().end();
375b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor       P != PEnd; ++P) {
37631f17ecbef57b5679c017c375db330546b7b5145John McCall    if (Context.hasSameType(P->getInjectedSpecializationType(), T))
377cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis      return P->getMostRecentDeclaration();
378cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis  }
379cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis
380cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis  return 0;
381cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis}
382cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis
383cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplatePartialSpecializationDecl *
384cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplateDecl::findPartialSpecInstantiatedFromMember(
385cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis                                    ClassTemplatePartialSpecializationDecl *D) {
386cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis  Decl *DCanon = D->getCanonicalDecl();
387cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis  for (llvm::FoldingSet<ClassTemplatePartialSpecializationDecl>::iterator
388cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis            P = getPartialSpecializations().begin(),
389cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis         PEnd = getPartialSpecializations().end();
390cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis       P != PEnd; ++P) {
391cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis    if (P->getInstantiatedFromMember()->getCanonicalDecl() == DCanon)
392cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis      return P->getMostRecentDeclaration();
393b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor  }
3941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
395b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor  return 0;
396b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor}
397b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor
3983cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCallQualType
39924bae92f08ae098cc50a602d8cf1273b423e14daDouglas GregorClassTemplateDecl::getInjectedClassNameSpecialization() {
4005bf1bdc2fedb0c29b5fcdb4abc852aa85b4fe26aArgyrios Kyrtzidis  Common *CommonPtr = getCommonPtr();
4017da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor  if (!CommonPtr->InjectedClassNameType.isNull())
4027da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor    return CommonPtr->InjectedClassNameType;
4037da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor
404b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor  // C++0x [temp.dep.type]p2:
405b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor  //  The template argument list of a primary template is a template argument
406b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor  //  list in which the nth template argument has the value of the nth template
407b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor  //  parameter of the class template. If the nth template parameter is a
408b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor  //  template parameter pack (14.5.3), the nth template argument is a pack
409b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor  //  expansion (14.5.3) whose pattern is the name of the template parameter
410b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor  //  pack.
41124bae92f08ae098cc50a602d8cf1273b423e14daDouglas Gregor  ASTContext &Context = getASTContext();
4127da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor  TemplateParameterList *Params = getTemplateParameters();
4135f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  SmallVector<TemplateArgument, 16> TemplateArgs;
414c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor  TemplateArgs.resize(Params->size());
415c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor  GenerateInjectedTemplateArgs(getASTContext(), Params, TemplateArgs.data());
4167da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor  CommonPtr->InjectedClassNameType
4171275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor    = Context.getTemplateSpecializationType(TemplateName(this),
4187da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor                                            &TemplateArgs[0],
4191275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor                                            TemplateArgs.size());
4207da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor  return CommonPtr->InjectedClassNameType;
4217da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor}
4227da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor
423aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
424aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// TemplateTypeParm Allocation/Deallocation Method Implementations
425aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
426aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
427aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorTemplateTypeParmDecl *
4284ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadTemplateTypeParmDecl::Create(const ASTContext &C, DeclContext *DC,
429344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara                             SourceLocation KeyLoc, SourceLocation NameLoc,
430344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara                             unsigned D, unsigned P, IdentifierInfo *Id,
431344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara                             bool Typename, bool ParameterPack) {
4324fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth  TemplateTypeParmDecl *TTPDecl =
4334fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth    new (C) TemplateTypeParmDecl(DC, KeyLoc, NameLoc, Id, Typename);
4344fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth  QualType TTPType = C.getTemplateTypeParmType(D, P, ParameterPack, TTPDecl);
4354fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth  TTPDecl->TypeForDecl = TTPType.getTypePtr();
4364fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth  return TTPDecl;
437aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor}
438aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
439b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios KyrtzidisTemplateTypeParmDecl *
4401e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorTemplateTypeParmDecl::CreateDeserialized(const ASTContext &C, unsigned ID) {
4411e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor  void *Mem = AllocateDeserializedDecl(C, ID, sizeof(TemplateTypeParmDecl));
4421e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor  return new (Mem) TemplateTypeParmDecl(0, SourceLocation(), SourceLocation(),
4431e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor                                        0, false);
444b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios Kyrtzidis}
445b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios Kyrtzidis
446833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallSourceLocation TemplateTypeParmDecl::getDefaultArgumentLoc() const {
44777d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara  return hasDefaultArgument()
44877d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara    ? DefaultArgument->getTypeLoc().getBeginLoc()
44977d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara    : SourceLocation();
45077d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara}
45177d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara
45277d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo BagnaraSourceRange TemplateTypeParmDecl::getSourceRange() const {
45377d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara  if (hasDefaultArgument() && !defaultArgumentWasInherited())
454344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara    return SourceRange(getLocStart(),
45577d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara                       DefaultArgument->getTypeLoc().getEndLoc());
45677d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara  else
457344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara    return TypeDecl::getSourceRange();
458833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall}
459833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
460ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregorunsigned TemplateTypeParmDecl::getDepth() const {
461ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor  return TypeForDecl->getAs<TemplateTypeParmType>()->getDepth();
462ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor}
463ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor
464ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregorunsigned TemplateTypeParmDecl::getIndex() const {
465ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor  return TypeForDecl->getAs<TemplateTypeParmType>()->getIndex();
466ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor}
467ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor
4684fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruthbool TemplateTypeParmDecl::isParameterPack() const {
4694fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth  return TypeForDecl->getAs<TemplateTypeParmType>()->isParameterPack();
4704fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth}
4714fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth
472aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
473aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// NonTypeTemplateParmDecl Method Implementations
474aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
475aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
4766952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas GregorNonTypeTemplateParmDecl::NonTypeTemplateParmDecl(DeclContext *DC,
477ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara                                                 SourceLocation StartLoc,
478ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara                                                 SourceLocation IdLoc,
479ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara                                                 unsigned D, unsigned P,
480ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara                                                 IdentifierInfo *Id,
4816952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                                 QualType T,
4826952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                                 TypeSourceInfo *TInfo,
4836952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                                 const QualType *ExpandedTypes,
4846952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                                 unsigned NumExpandedTypes,
4856952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                                TypeSourceInfo **ExpandedTInfos)
486ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara  : DeclaratorDecl(NonTypeTemplateParm, DC, IdLoc, Id, T, TInfo, StartLoc),
4876952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor    TemplateParmPosition(D, P), DefaultArgumentAndInherited(0, false),
4886952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor    ParameterPack(true), ExpandedParameterPack(true),
4896952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor    NumExpandedTypes(NumExpandedTypes)
4906952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor{
4916952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor  if (ExpandedTypes && ExpandedTInfos) {
4926952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor    void **TypesAndInfos = reinterpret_cast<void **>(this + 1);
4936952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor    for (unsigned I = 0; I != NumExpandedTypes; ++I) {
4946952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor      TypesAndInfos[2*I] = ExpandedTypes[I].getAsOpaquePtr();
4956952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor      TypesAndInfos[2*I + 1] = ExpandedTInfos[I];
4966952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor    }
4976952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor  }
4986952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor}
4996952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor
500aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorNonTypeTemplateParmDecl *
5014ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadNonTypeTemplateParmDecl::Create(const ASTContext &C, DeclContext *DC,
502ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara                                SourceLocation StartLoc, SourceLocation IdLoc,
503ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara                                unsigned D, unsigned P, IdentifierInfo *Id,
504ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara                                QualType T, bool ParameterPack,
505ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara                                TypeSourceInfo *TInfo) {
506ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara  return new (C) NonTypeTemplateParmDecl(DC, StartLoc, IdLoc, D, P, Id,
507ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara                                         T, ParameterPack, TInfo);
508aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor}
509aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
5106952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas GregorNonTypeTemplateParmDecl *
5116952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas GregorNonTypeTemplateParmDecl::Create(const ASTContext &C, DeclContext *DC,
512ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara                                SourceLocation StartLoc, SourceLocation IdLoc,
513ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara                                unsigned D, unsigned P,
5146952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                IdentifierInfo *Id, QualType T,
5156952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                TypeSourceInfo *TInfo,
5166952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                const QualType *ExpandedTypes,
5176952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                unsigned NumExpandedTypes,
5186952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                TypeSourceInfo **ExpandedTInfos) {
5196952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor  unsigned Size = sizeof(NonTypeTemplateParmDecl)
5206952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                + NumExpandedTypes * 2 * sizeof(void*);
5216952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor  void *Mem = C.Allocate(Size);
522ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara  return new (Mem) NonTypeTemplateParmDecl(DC, StartLoc, IdLoc,
523ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara                                           D, P, Id, T, TInfo,
5246952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                           ExpandedTypes, NumExpandedTypes,
5256952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                           ExpandedTInfos);
5266952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor}
5276952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor
5281e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorNonTypeTemplateParmDecl *
5291e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorNonTypeTemplateParmDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
5301e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor  void *Mem = AllocateDeserializedDecl(C, ID, sizeof(NonTypeTemplateParmDecl));
5311e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor  return new (Mem) NonTypeTemplateParmDecl(0, SourceLocation(),
5321e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor                                           SourceLocation(), 0, 0, 0,
5331e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor                                           QualType(), false, 0);
5341e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor}
5351e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor
5361e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorNonTypeTemplateParmDecl *
5371e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorNonTypeTemplateParmDecl::CreateDeserialized(ASTContext &C, unsigned ID,
5381e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor                                            unsigned NumExpandedTypes) {
5391e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor  unsigned Size = sizeof(NonTypeTemplateParmDecl)
5401e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor                + NumExpandedTypes * 2 * sizeof(void*);
5411e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor
5421e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor  void *Mem = AllocateDeserializedDecl(C, ID, Size);
5431e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor  return new (Mem) NonTypeTemplateParmDecl(0, SourceLocation(),
5441e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor                                           SourceLocation(), 0, 0, 0,
5451e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor                                           QualType(), 0, 0, NumExpandedTypes,
5461e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor                                           0);
5471e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor}
5481e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor
54976a40219ee5624d78aba167dce02bdbaa930955fJohn McCallSourceRange NonTypeTemplateParmDecl::getSourceRange() const {
550ee4bfd412db491c489fc2ee74916edd73f9c618aAbramo Bagnara  if (hasDefaultArgument() && !defaultArgumentWasInherited())
551a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara    return SourceRange(getOuterLocStart(),
552a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara                       getDefaultArgument()->getSourceRange().getEnd());
553a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara  return DeclaratorDecl::getSourceRange();
55476a40219ee5624d78aba167dce02bdbaa930955fJohn McCall}
55576a40219ee5624d78aba167dce02bdbaa930955fJohn McCall
556d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas GregorSourceLocation NonTypeTemplateParmDecl::getDefaultArgumentLoc() const {
557d92f7a297c0ed3f7d0ebcbb557e1d4c1925b8c72Abramo Bagnara  return hasDefaultArgument()
558d92f7a297c0ed3f7d0ebcbb557e1d4c1925b8c72Abramo Bagnara    ? getDefaultArgument()->getSourceRange().getBegin()
559d92f7a297c0ed3f7d0ebcbb557e1d4c1925b8c72Abramo Bagnara    : SourceLocation();
560d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas Gregor}
561d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas Gregor
562aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
563aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// TemplateTemplateParmDecl Method Implementations
564aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
565aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
56699ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid TemplateTemplateParmDecl::anchor() { }
56799ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie
568aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorTemplateTemplateParmDecl *
5694ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadTemplateTemplateParmDecl::Create(const ASTContext &C, DeclContext *DC,
570aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                 SourceLocation L, unsigned D, unsigned P,
57161c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor                                 bool ParameterPack, IdentifierInfo *Id,
572aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                 TemplateParameterList *Params) {
57361c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor  return new (C) TemplateTemplateParmDecl(DC, L, D, P, ParameterPack, Id,
57461c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor                                          Params);
575aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor}
576aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
5771e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorTemplateTemplateParmDecl *
5781e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorTemplateTemplateParmDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
5791e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor  void *Mem = AllocateDeserializedDecl(C, ID, sizeof(TemplateTemplateParmDecl));
5801e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor  return new (Mem) TemplateTemplateParmDecl(0, SourceLocation(), 0, 0, false,
5811e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor                                            0, 0);
5821e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor}
5831e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor
5843e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor//===----------------------------------------------------------------------===//
5857e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor// TemplateArgumentList Implementation
5867e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor//===----------------------------------------------------------------------===//
587910f8008fea79120489a53593fe971b0b8a4a740Douglas GregorTemplateArgumentList *
588910f8008fea79120489a53593fe971b0b8a4a740Douglas GregorTemplateArgumentList::CreateCopy(ASTContext &Context,
589910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor                                 const TemplateArgument *Args,
590910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor                                 unsigned NumArgs) {
591910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor  std::size_t Size = sizeof(TemplateArgumentList)
592910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor                   + NumArgs * sizeof(TemplateArgument);
593910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor  void *Mem = Context.Allocate(Size);
594910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor  TemplateArgument *StoredArgs
595910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor    = reinterpret_cast<TemplateArgument *>(
596910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor                                static_cast<TemplateArgumentList *>(Mem) + 1);
597910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor  std::uninitialized_copy(Args, Args + NumArgs, StoredArgs);
598910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor  return new (Mem) TemplateArgumentList(StoredArgs, NumArgs, true);
59994d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis}
60094d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis
60171a7605977113c795edd44fcbd2302ad49506653Argyrios KyrtzidisFunctionTemplateSpecializationInfo *
60271a7605977113c795edd44fcbd2302ad49506653Argyrios KyrtzidisFunctionTemplateSpecializationInfo::Create(ASTContext &C, FunctionDecl *FD,
60371a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis                                           FunctionTemplateDecl *Template,
60471a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis                                           TemplateSpecializationKind TSK,
60571a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis                                       const TemplateArgumentList *TemplateArgs,
60671a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis                          const TemplateArgumentListInfo *TemplateArgsAsWritten,
60771a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis                                           SourceLocation POI) {
60871a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis  const ASTTemplateArgumentListInfo *ArgsAsWritten = 0;
60971a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis  if (TemplateArgsAsWritten)
61071a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis    ArgsAsWritten = ASTTemplateArgumentListInfo::Create(C,
61171a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis                                                        *TemplateArgsAsWritten);
61271a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis
61371a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis  return new (C) FunctionTemplateSpecializationInfo(FD, Template, TSK,
61471a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis                                                    TemplateArgs,
61571a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis                                                    ArgsAsWritten,
61671a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis                                                    POI);
61771a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis}
61871a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis
6197e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor//===----------------------------------------------------------------------===//
62099ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie// TemplateDecl Implementation
62199ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie//===----------------------------------------------------------------------===//
62299ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie
62399ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid TemplateDecl::anchor() { }
62499ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie
62599ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie//===----------------------------------------------------------------------===//
6263e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor// ClassTemplateSpecializationDecl Implementation
6273e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor//===----------------------------------------------------------------------===//
6283e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas GregorClassTemplateSpecializationDecl::
62913c8577201e4fc0ddac5f09d05fd1778832137d1Douglas GregorClassTemplateSpecializationDecl(ASTContext &Context, Kind DK, TagKind TK,
630ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara                                DeclContext *DC, SourceLocation StartLoc,
631ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara                                SourceLocation IdLoc,
6323e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor                                ClassTemplateDecl *SpecializedTemplate,
633910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor                                const TemplateArgument *Args,
634910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor                                unsigned NumArgs,
6358e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor                                ClassTemplateSpecializationDecl *PrevDecl)
636ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara  : CXXRecordDecl(DK, TK, DC, StartLoc, IdLoc,
6378e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor                  SpecializedTemplate->getIdentifier(),
6388e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor                  PrevDecl),
6393e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor    SpecializedTemplate(SpecializedTemplate),
640c98971d5c994caed9452aeadd0122c855e0f4de1Abramo Bagnara    ExplicitInfo(0),
641910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor    TemplateArgs(TemplateArgumentList::CreateCopy(Context, Args, NumArgs)),
6427e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor    SpecializationKind(TSK_Undeclared) {
6433e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor}
6441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
64594d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios KyrtzidisClassTemplateSpecializationDecl::ClassTemplateSpecializationDecl(Kind DK)
646ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara  : CXXRecordDecl(DK, TTK_Struct, 0, SourceLocation(), SourceLocation(), 0, 0),
64794d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis    ExplicitInfo(0),
64894d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis    SpecializationKind(TSK_Undeclared) {
64994d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis}
65094d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis
6513e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas GregorClassTemplateSpecializationDecl *
65213c8577201e4fc0ddac5f09d05fd1778832137d1Douglas GregorClassTemplateSpecializationDecl::Create(ASTContext &Context, TagKind TK,
653ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara                                        DeclContext *DC,
654ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara                                        SourceLocation StartLoc,
655ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara                                        SourceLocation IdLoc,
6563e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor                                        ClassTemplateDecl *SpecializedTemplate,
657910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor                                        const TemplateArgument *Args,
658910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor                                        unsigned NumArgs,
659cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor                                   ClassTemplateSpecializationDecl *PrevDecl) {
660cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor  ClassTemplateSpecializationDecl *Result
6611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    = new (Context)ClassTemplateSpecializationDecl(Context,
662c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor                                                   ClassTemplateSpecialization,
663ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara                                                   TK, DC, StartLoc, IdLoc,
6647e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor                                                   SpecializedTemplate,
665910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor                                                   Args, NumArgs,
6668e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor                                                   PrevDecl);
667cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor  Context.getTypeDeclType(Result, PrevDecl);
668cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor  return Result;
6693e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor}
670c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor
67194d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios KyrtzidisClassTemplateSpecializationDecl *
6721e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorClassTemplateSpecializationDecl::CreateDeserialized(ASTContext &C,
6731e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor                                                    unsigned ID) {
6741e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor  void *Mem = AllocateDeserializedDecl(C, ID,
6751e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor                                       sizeof(ClassTemplateSpecializationDecl));
6761e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor  return new (Mem) ClassTemplateSpecializationDecl(ClassTemplateSpecialization);
67794d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis}
67894d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis
679da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregorvoid
680da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas GregorClassTemplateSpecializationDecl::getNameForDiagnostic(std::string &S,
681da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor                                                  const PrintingPolicy &Policy,
682da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor                                                      bool Qualified) const {
683da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor  NamedDecl::getNameForDiagnostic(S, Policy, Qualified);
684da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor
685da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor  const TemplateArgumentList &TemplateArgs = getTemplateArgs();
686da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor  S += TemplateSpecializationType::PrintTemplateArgumentList(
687da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor                                                          TemplateArgs.data(),
688da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor                                                          TemplateArgs.size(),
689da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor                                                             Policy);
690da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor}
691da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor
69237d93e9252026d4fb836d9c05d0122a2d46e56beDouglas GregorClassTemplateDecl *
6931eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpClassTemplateSpecializationDecl::getSpecializedTemplate() const {
6941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (SpecializedPartialSpecialization *PartialSpec
69537d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor      = SpecializedTemplate.dyn_cast<SpecializedPartialSpecialization*>())
69637d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor    return PartialSpec->PartialSpecialization->getSpecializedTemplate();
69737d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor  return SpecializedTemplate.get<ClassTemplateDecl*>();
69837d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor}
69937d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor
7004a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo BagnaraSourceRange
7014a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo BagnaraClassTemplateSpecializationDecl::getSourceRange() const {
70209d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara  if (ExplicitInfo) {
70309d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara    SourceLocation Begin = getExternLoc();
70409d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara    if (Begin.isInvalid())
70509d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara      Begin = getTemplateKeywordLoc();
70609d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara    SourceLocation End = getRBraceLoc();
70709d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara    if (End.isInvalid())
70809d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara      End = getTypeAsWritten()->getTypeLoc().getEndLoc();
70909d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara    return SourceRange(Begin, End);
71009d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara  }
71109d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara  else {
71209d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara    // No explicit info available.
71309d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara    llvm::PointerUnion<ClassTemplateDecl *,
71409d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara                       ClassTemplatePartialSpecializationDecl *>
71509d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara      inst_from = getInstantiatedFrom();
71609d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara    if (inst_from.isNull())
71709d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara      return getSpecializedTemplate()->getSourceRange();
71809d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara    if (ClassTemplateDecl *ctd = inst_from.dyn_cast<ClassTemplateDecl*>())
71909d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara      return ctd->getSourceRange();
72009d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara    return inst_from.get<ClassTemplatePartialSpecializationDecl*>()
72109d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara      ->getSourceRange();
72209d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara  }
7234a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo Bagnara}
7244a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo Bagnara
725c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor//===----------------------------------------------------------------------===//
726c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor// ClassTemplatePartialSpecializationDecl Implementation
727c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor//===----------------------------------------------------------------------===//
72899ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid ClassTemplatePartialSpecializationDecl::anchor() { }
72999ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie
7309a299e0575ce235f491014627c7267e2d2cd73deDouglas GregorClassTemplatePartialSpecializationDecl::
7319a299e0575ce235f491014627c7267e2d2cd73deDouglas GregorClassTemplatePartialSpecializationDecl(ASTContext &Context, TagKind TK,
732ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara                                       DeclContext *DC,
733ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara                                       SourceLocation StartLoc,
734ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara                                       SourceLocation IdLoc,
7359a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor                                       TemplateParameterList *Params,
7369a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor                                       ClassTemplateDecl *SpecializedTemplate,
7379a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor                                       const TemplateArgument *Args,
7389a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor                                       unsigned NumArgs,
7399a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor                                       TemplateArgumentLoc *ArgInfos,
7409a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor                                       unsigned NumArgInfos,
7419a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor                               ClassTemplatePartialSpecializationDecl *PrevDecl,
7429a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor                                       unsigned SequenceNumber)
7439a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor  : ClassTemplateSpecializationDecl(Context,
7449a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor                                    ClassTemplatePartialSpecialization,
745ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara                                    TK, DC, StartLoc, IdLoc,
746ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara                                    SpecializedTemplate,
7479a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor                                    Args, NumArgs, PrevDecl),
7489a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor    TemplateParams(Params), ArgsAsWritten(ArgInfos),
7499a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor    NumArgsAsWritten(NumArgInfos), SequenceNumber(SequenceNumber),
7509a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor    InstantiatedFromMember(0, false)
7519a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor{
752787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor  AdoptTemplateParameterList(Params, this);
7539a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor}
7549a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor
755c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas GregorClassTemplatePartialSpecializationDecl *
756c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas GregorClassTemplatePartialSpecializationDecl::
757ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo BagnaraCreate(ASTContext &Context, TagKind TK,DeclContext *DC,
758ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara       SourceLocation StartLoc, SourceLocation IdLoc,
759c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor       TemplateParameterList *Params,
760c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor       ClassTemplateDecl *SpecializedTemplate,
761910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor       const TemplateArgument *Args,
762910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor       unsigned NumArgs,
763d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall       const TemplateArgumentListInfo &ArgInfos,
7643cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall       QualType CanonInjectedType,
765dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor       ClassTemplatePartialSpecializationDecl *PrevDecl,
766dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor       unsigned SequenceNumber) {
767d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  unsigned N = ArgInfos.size();
768833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  TemplateArgumentLoc *ClonedArgs = new (Context) TemplateArgumentLoc[N];
769833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  for (unsigned I = 0; I != N; ++I)
770833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    ClonedArgs[I] = ArgInfos[I];
771833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
772c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor  ClassTemplatePartialSpecializationDecl *Result
773ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara    = new (Context)ClassTemplatePartialSpecializationDecl(Context, TK, DC,
774ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara                                                          StartLoc, IdLoc,
775ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara                                                          Params,
776c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor                                                          SpecializedTemplate,
777910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor                                                          Args, NumArgs,
778833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                                          ClonedArgs, N,
779dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor                                                          PrevDecl,
780dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor                                                          SequenceNumber);
781c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor  Result->setSpecializationKind(TSK_ExplicitSpecialization);
7823cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall
7833cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  Context.getInjectedClassNameType(Result, CanonInjectedType);
784c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor  return Result;
785c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor}
786dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall
78794d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios KyrtzidisClassTemplatePartialSpecializationDecl *
7881e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorClassTemplatePartialSpecializationDecl::CreateDeserialized(ASTContext &C,
7891e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor                                                           unsigned ID) {
7901e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor  void *Mem = AllocateDeserializedDecl(C, ID,
7911e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor                sizeof(ClassTemplatePartialSpecializationDecl));
7921e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor  return new (Mem) ClassTemplatePartialSpecializationDecl();
79394d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis}
79494d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis
795dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall//===----------------------------------------------------------------------===//
796dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall// FriendTemplateDecl Implementation
797dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall//===----------------------------------------------------------------------===//
798dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall
79999ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid FriendTemplateDecl::anchor() { }
80099ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie
801dd4a3b0065b9a7e7b00073df415a798886c090f3John McCallFriendTemplateDecl *FriendTemplateDecl::Create(ASTContext &Context,
802dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall                                               DeclContext *DC,
803dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall                                               SourceLocation L,
804dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall                                               unsigned NParams,
805dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall                                               TemplateParameterList **Params,
806dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall                                               FriendUnion Friend,
807dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall                                               SourceLocation FLoc) {
808dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall  FriendTemplateDecl *Result
809dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall    = new (Context) FriendTemplateDecl(DC, L, NParams, Params, Friend, FLoc);
810dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall  return Result;
811dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall}
812554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis
8131e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorFriendTemplateDecl *FriendTemplateDecl::CreateDeserialized(ASTContext &C,
8141e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor                                                           unsigned ID) {
8151e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor  void *Mem = AllocateDeserializedDecl(C, ID, sizeof(FriendTemplateDecl));
8161e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor  return new (Mem) FriendTemplateDecl(EmptyShell());
817554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis}
8183e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith
8193e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith//===----------------------------------------------------------------------===//
8203e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith// TypeAliasTemplateDecl Implementation
8213e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith//===----------------------------------------------------------------------===//
8223e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith
8233e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard SmithTypeAliasTemplateDecl *TypeAliasTemplateDecl::Create(ASTContext &C,
8243e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith                                                     DeclContext *DC,
8253e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith                                                     SourceLocation L,
8263e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith                                                     DeclarationName Name,
8273e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith                                                  TemplateParameterList *Params,
8283e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith                                                     NamedDecl *Decl) {
8293e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith  AdoptTemplateParameterList(Params, DC);
8303e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith  return new (C) TypeAliasTemplateDecl(DC, L, Name, Params, Decl);
8313e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith}
8323e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith
8331e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorTypeAliasTemplateDecl *TypeAliasTemplateDecl::CreateDeserialized(ASTContext &C,
8341e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor                                                                 unsigned ID) {
8351e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor  void *Mem = AllocateDeserializedDecl(C, ID, sizeof(TypeAliasTemplateDecl));
8361e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor  return new (Mem) TypeAliasTemplateDecl(0, SourceLocation(), DeclarationName(),
8371e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor                                         0, 0);
8383e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith}
8393e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith
8403e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smithvoid TypeAliasTemplateDecl::DeallocateCommon(void *Ptr) {
8413e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith  static_cast<Common *>(Ptr)->~Common();
8423e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith}
8433e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard SmithRedeclarableTemplateDecl::CommonBase *
8443e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard SmithTypeAliasTemplateDecl::newCommon(ASTContext &C) {
8453e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith  Common *CommonPtr = new (C) Common;
8463e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith  C.AddDeallocation(DeallocateCommon, CommonPtr);
8473e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith  return CommonPtr;
8483e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith}
8493e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith
85099ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie//===----------------------------------------------------------------------===//
85199ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie// ClassScopeFunctionSpecializationDecl Implementation
85299ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie//===----------------------------------------------------------------------===//
85399ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie
85499ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid ClassScopeFunctionSpecializationDecl::anchor() { }
8551e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor
8561e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorClassScopeFunctionSpecializationDecl *
8571e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorClassScopeFunctionSpecializationDecl::CreateDeserialized(ASTContext &C,
8581e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor                                                         unsigned ID) {
8591e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor  void *Mem = AllocateDeserializedDecl(C, ID,
8601e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor                sizeof(ClassScopeFunctionSpecializationDecl));
8611e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor  return new (Mem) ClassScopeFunctionSpecializationDecl(0, SourceLocation(), 0);
8621e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor}
863