DeclTemplate.cpp revision 3e4c6c4c79a03f5cb0c4671d7c282d623c6dc35e
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
2455bbcdbf36f8cf79d99703ef20848c55960065e43Sebastian Redlvoid FunctionTemplateDecl::addSpecialization(
2465bbcdbf36f8cf79d99703ef20848c55960065e43Sebastian Redl      FunctionTemplateSpecializationInfo *Info, void *InsertPos) {
2475bbcdbf36f8cf79d99703ef20848c55960065e43Sebastian Redl  getSpecializations().InsertNode(Info, InsertPos);
2485bbcdbf36f8cf79d99703ef20848c55960065e43Sebastian Redl  if (ASTMutationListener *L = getASTMutationListener())
2495bbcdbf36f8cf79d99703ef20848c55960065e43Sebastian Redl    L->AddedCXXTemplateSpecialization(this, Info->Function);
2505bbcdbf36f8cf79d99703ef20848c55960065e43Sebastian Redl}
2515bbcdbf36f8cf79d99703ef20848c55960065e43Sebastian Redl
252c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregorstd::pair<const TemplateArgument *, unsigned>
253c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas GregorFunctionTemplateDecl::getInjectedTemplateArgs() {
254c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor  TemplateParameterList *Params = getTemplateParameters();
255c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor  Common *CommonPtr = getCommonPtr();
256c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor  if (!CommonPtr->InjectedArgs) {
257c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor    CommonPtr->InjectedArgs
258c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor      = new (getASTContext()) TemplateArgument [Params->size()];
259c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor    GenerateInjectedTemplateArgs(getASTContext(), Params,
260c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor                                 CommonPtr->InjectedArgs);
261c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor  }
262c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor
263c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor  return std::make_pair(CommonPtr->InjectedArgs, Params->size());
264c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor}
265c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor
266aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
267aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// ClassTemplateDecl Implementation
268aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
269aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
2700054531488928a424666ac11fcdc6bcc5112de52Douglas Gregorvoid ClassTemplateDecl::DeallocateCommon(void *Ptr) {
2710054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor  static_cast<Common *>(Ptr)->~Common();
2720054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor}
2730054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor
2748731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios KyrtzidisClassTemplateDecl *ClassTemplateDecl::Create(ASTContext &C,
2758731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis                                             DeclContext *DC,
2768731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis                                             SourceLocation L,
2778731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis                                             DeclarationName Name,
2788731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis                                             TemplateParameterList *Params,
2798731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis                                             NamedDecl *Decl,
2808731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis                                             ClassTemplateDecl *PrevDecl) {
281787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor  AdoptTemplateParameterList(Params, cast<DeclContext>(Decl));
2828731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis  ClassTemplateDecl *New = new (C) ClassTemplateDecl(DC, L, Name, Params, Decl);
2835bf1bdc2fedb0c29b5fcdb4abc852aa85b4fe26aArgyrios Kyrtzidis  New->setPreviousDeclaration(PrevDecl);
2848731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis  return New;
2855953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor}
2865953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor
2879a299e0575ce235f491014627c7267e2d2cd73deDouglas GregorClassTemplateDecl *ClassTemplateDecl::Create(ASTContext &C, EmptyShell Empty) {
2889a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor  return new (C) ClassTemplateDecl(Empty);
2899a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor}
2909a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor
291c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregorvoid ClassTemplateDecl::LoadLazySpecializations() {
292c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor  Common *CommonPtr = getCommonPtr();
293c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor  if (CommonPtr->LazySpecializations) {
294c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor    ASTContext &Context = getASTContext();
295c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor    uint32_t *Specs = CommonPtr->LazySpecializations;
296c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor    CommonPtr->LazySpecializations = 0;
297c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor    for (uint32_t I = 0, N = *Specs++; I != N; ++I)
298c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor      (void)Context.getExternalSource()->GetExternalDecl(Specs[I]);
299c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor  }
300c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor}
301c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor
302c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregorllvm::FoldingSet<ClassTemplateSpecializationDecl> &
303c8e5cf8f725e111965debb7130ef7466c0c73884Douglas GregorClassTemplateDecl::getSpecializations() {
304c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor  LoadLazySpecializations();
305c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor  return getCommonPtr()->Specializations;
306c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor}
307c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor
308c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregorllvm::FoldingSet<ClassTemplatePartialSpecializationDecl> &
309c8e5cf8f725e111965debb7130ef7466c0c73884Douglas GregorClassTemplateDecl::getPartialSpecializations() {
310c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor  LoadLazySpecializations();
311c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor  return getCommonPtr()->PartialSpecializations;
312c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor}
313c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor
3146b5415196327fa8ef00f028ba175fafef1738ae1Argyrios KyrtzidisRedeclarableTemplateDecl::CommonBase *
3156b5415196327fa8ef00f028ba175fafef1738ae1Argyrios KyrtzidisClassTemplateDecl::newCommon(ASTContext &C) {
3166b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis  Common *CommonPtr = new (C) Common;
3176b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis  C.AddDeallocation(DeallocateCommon, CommonPtr);
3189eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne  return CommonPtr;
3199eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne}
3209eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne
321cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplateSpecializationDecl *
322cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplateDecl::findSpecialization(const TemplateArgument *Args,
323cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis                                      unsigned NumArgs, void *&InsertPos) {
3244048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne  return findSpecializationImpl(getSpecializations(), Args, NumArgs, InsertPos);
325cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis}
326cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis
327bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidisvoid ClassTemplateDecl::AddSpecialization(ClassTemplateSpecializationDecl *D,
328bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis                                          void *InsertPos) {
329bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis  getSpecializations().InsertNode(D, InsertPos);
330bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis  if (ASTMutationListener *L = getASTMutationListener())
331bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis    L->AddedCXXTemplateSpecialization(this, D);
332bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis}
333bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis
334cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplatePartialSpecializationDecl *
335cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplateDecl::findPartialSpecialization(const TemplateArgument *Args,
336cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis                                             unsigned NumArgs,
337cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis                                             void *&InsertPos) {
3384048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne  return findSpecializationImpl(getPartialSpecializations(), Args, NumArgs,
3394048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne                                InsertPos);
340cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis}
341cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis
342bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidisvoid ClassTemplateDecl::AddPartialSpecialization(
343bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis                                      ClassTemplatePartialSpecializationDecl *D,
344bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis                                      void *InsertPos) {
345bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis  getPartialSpecializations().InsertNode(D, InsertPos);
346bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis  if (ASTMutationListener *L = getASTMutationListener())
347bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis    L->AddedCXXTemplateSpecialization(this, D);
348bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis}
349bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis
350dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregorvoid ClassTemplateDecl::getPartialSpecializations(
351dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor          llvm::SmallVectorImpl<ClassTemplatePartialSpecializationDecl *> &PS) {
352dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor  llvm::FoldingSet<ClassTemplatePartialSpecializationDecl> &PartialSpecs
3535bf1bdc2fedb0c29b5fcdb4abc852aa85b4fe26aArgyrios Kyrtzidis    = getPartialSpecializations();
354dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor  PS.clear();
355dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor  PS.resize(PartialSpecs.size());
356dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor  for (llvm::FoldingSet<ClassTemplatePartialSpecializationDecl>::iterator
357dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor       P = PartialSpecs.begin(), PEnd = PartialSpecs.end();
358dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor       P != PEnd; ++P) {
359dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor    assert(!PS[P->getSequenceNumber()]);
360cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis    PS[P->getSequenceNumber()] = P->getMostRecentDeclaration();
361dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor  }
362dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor}
363dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor
364b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas GregorClassTemplatePartialSpecializationDecl *
365b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas GregorClassTemplateDecl::findPartialSpecialization(QualType T) {
366b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor  ASTContext &Context = getASTContext();
367b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor  typedef llvm::FoldingSet<ClassTemplatePartialSpecializationDecl>::iterator
368b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor    partial_spec_iterator;
369b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor  for (partial_spec_iterator P = getPartialSpecializations().begin(),
370b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor                          PEnd = getPartialSpecializations().end();
371b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor       P != PEnd; ++P) {
37231f17ecbef57b5679c017c375db330546b7b5145John McCall    if (Context.hasSameType(P->getInjectedSpecializationType(), T))
373cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis      return P->getMostRecentDeclaration();
374cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis  }
375cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis
376cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis  return 0;
377cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis}
378cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis
379cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplatePartialSpecializationDecl *
380cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplateDecl::findPartialSpecInstantiatedFromMember(
381cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis                                    ClassTemplatePartialSpecializationDecl *D) {
382cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis  Decl *DCanon = D->getCanonicalDecl();
383cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis  for (llvm::FoldingSet<ClassTemplatePartialSpecializationDecl>::iterator
384cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis            P = getPartialSpecializations().begin(),
385cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis         PEnd = getPartialSpecializations().end();
386cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis       P != PEnd; ++P) {
387cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis    if (P->getInstantiatedFromMember()->getCanonicalDecl() == DCanon)
388cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis      return P->getMostRecentDeclaration();
389b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor  }
3901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
391b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor  return 0;
392b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor}
393b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor
3943cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCallQualType
39524bae92f08ae098cc50a602d8cf1273b423e14daDouglas GregorClassTemplateDecl::getInjectedClassNameSpecialization() {
3965bf1bdc2fedb0c29b5fcdb4abc852aa85b4fe26aArgyrios Kyrtzidis  Common *CommonPtr = getCommonPtr();
3977da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor  if (!CommonPtr->InjectedClassNameType.isNull())
3987da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor    return CommonPtr->InjectedClassNameType;
3997da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor
400b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor  // C++0x [temp.dep.type]p2:
401b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor  //  The template argument list of a primary template is a template argument
402b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor  //  list in which the nth template argument has the value of the nth template
403b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor  //  parameter of the class template. If the nth template parameter is a
404b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor  //  template parameter pack (14.5.3), the nth template argument is a pack
405b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor  //  expansion (14.5.3) whose pattern is the name of the template parameter
406b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor  //  pack.
40724bae92f08ae098cc50a602d8cf1273b423e14daDouglas Gregor  ASTContext &Context = getASTContext();
4087da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor  TemplateParameterList *Params = getTemplateParameters();
4097da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor  llvm::SmallVector<TemplateArgument, 16> TemplateArgs;
410c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor  TemplateArgs.resize(Params->size());
411c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor  GenerateInjectedTemplateArgs(getASTContext(), Params, TemplateArgs.data());
4127da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor  CommonPtr->InjectedClassNameType
4131275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor    = Context.getTemplateSpecializationType(TemplateName(this),
4147da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor                                            &TemplateArgs[0],
4151275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor                                            TemplateArgs.size());
4167da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor  return CommonPtr->InjectedClassNameType;
4177da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor}
4187da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor
419aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
420aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// TemplateTypeParm Allocation/Deallocation Method Implementations
421aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
422aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
423aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorTemplateTypeParmDecl *
4244ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadTemplateTypeParmDecl::Create(const ASTContext &C, DeclContext *DC,
425344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara                             SourceLocation KeyLoc, SourceLocation NameLoc,
426344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara                             unsigned D, unsigned P, IdentifierInfo *Id,
427344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara                             bool Typename, bool ParameterPack) {
4284fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth  TemplateTypeParmDecl *TTPDecl =
4294fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth    new (C) TemplateTypeParmDecl(DC, KeyLoc, NameLoc, Id, Typename);
4304fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth  QualType TTPType = C.getTemplateTypeParmType(D, P, ParameterPack, TTPDecl);
4314fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth  TTPDecl->TypeForDecl = TTPType.getTypePtr();
4324fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth  return TTPDecl;
433aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor}
434aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
435b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios KyrtzidisTemplateTypeParmDecl *
4364ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadTemplateTypeParmDecl::Create(const ASTContext &C, EmptyShell Empty) {
437344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara  return new (C) TemplateTypeParmDecl(0, SourceLocation(), SourceLocation(),
4384fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth                                      0, false);
439b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios Kyrtzidis}
440b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios Kyrtzidis
441833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallSourceLocation TemplateTypeParmDecl::getDefaultArgumentLoc() const {
44277d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara  return hasDefaultArgument()
44377d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara    ? DefaultArgument->getTypeLoc().getBeginLoc()
44477d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara    : SourceLocation();
44577d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara}
44677d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara
44777d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo BagnaraSourceRange TemplateTypeParmDecl::getSourceRange() const {
44877d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara  if (hasDefaultArgument() && !defaultArgumentWasInherited())
449344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara    return SourceRange(getLocStart(),
45077d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara                       DefaultArgument->getTypeLoc().getEndLoc());
45177d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara  else
452344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara    return TypeDecl::getSourceRange();
453833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall}
454833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
455ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregorunsigned TemplateTypeParmDecl::getDepth() const {
456ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor  return TypeForDecl->getAs<TemplateTypeParmType>()->getDepth();
457ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor}
458ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor
459ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregorunsigned TemplateTypeParmDecl::getIndex() const {
460ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor  return TypeForDecl->getAs<TemplateTypeParmType>()->getIndex();
461ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor}
462ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor
4634fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruthbool TemplateTypeParmDecl::isParameterPack() const {
4644fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth  return TypeForDecl->getAs<TemplateTypeParmType>()->isParameterPack();
4654fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth}
4664fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth
467aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
468aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// NonTypeTemplateParmDecl Method Implementations
469aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
470aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
4716952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas GregorNonTypeTemplateParmDecl::NonTypeTemplateParmDecl(DeclContext *DC,
472ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara                                                 SourceLocation StartLoc,
473ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara                                                 SourceLocation IdLoc,
474ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara                                                 unsigned D, unsigned P,
475ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara                                                 IdentifierInfo *Id,
4766952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                                 QualType T,
4776952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                                 TypeSourceInfo *TInfo,
4786952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                                 const QualType *ExpandedTypes,
4796952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                                 unsigned NumExpandedTypes,
4806952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                                TypeSourceInfo **ExpandedTInfos)
481ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara  : DeclaratorDecl(NonTypeTemplateParm, DC, IdLoc, Id, T, TInfo, StartLoc),
4826952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor    TemplateParmPosition(D, P), DefaultArgumentAndInherited(0, false),
4836952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor    ParameterPack(true), ExpandedParameterPack(true),
4846952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor    NumExpandedTypes(NumExpandedTypes)
4856952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor{
4866952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor  if (ExpandedTypes && ExpandedTInfos) {
4876952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor    void **TypesAndInfos = reinterpret_cast<void **>(this + 1);
4886952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor    for (unsigned I = 0; I != NumExpandedTypes; ++I) {
4896952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor      TypesAndInfos[2*I] = ExpandedTypes[I].getAsOpaquePtr();
4906952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor      TypesAndInfos[2*I + 1] = ExpandedTInfos[I];
4916952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor    }
4926952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor  }
4936952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor}
4946952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor
495aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorNonTypeTemplateParmDecl *
4964ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadNonTypeTemplateParmDecl::Create(const ASTContext &C, DeclContext *DC,
497ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara                                SourceLocation StartLoc, SourceLocation IdLoc,
498ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara                                unsigned D, unsigned P, IdentifierInfo *Id,
499ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara                                QualType T, bool ParameterPack,
500ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara                                TypeSourceInfo *TInfo) {
501ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara  return new (C) NonTypeTemplateParmDecl(DC, StartLoc, IdLoc, D, P, Id,
502ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara                                         T, ParameterPack, TInfo);
503aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor}
504aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
5056952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas GregorNonTypeTemplateParmDecl *
5066952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas GregorNonTypeTemplateParmDecl::Create(const ASTContext &C, DeclContext *DC,
507ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara                                SourceLocation StartLoc, SourceLocation IdLoc,
508ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara                                unsigned D, unsigned P,
5096952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                IdentifierInfo *Id, QualType T,
5106952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                TypeSourceInfo *TInfo,
5116952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                const QualType *ExpandedTypes,
5126952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                unsigned NumExpandedTypes,
5136952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                TypeSourceInfo **ExpandedTInfos) {
5146952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor  unsigned Size = sizeof(NonTypeTemplateParmDecl)
5156952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                + NumExpandedTypes * 2 * sizeof(void*);
5166952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor  void *Mem = C.Allocate(Size);
517ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara  return new (Mem) NonTypeTemplateParmDecl(DC, StartLoc, IdLoc,
518ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara                                           D, P, Id, T, TInfo,
5196952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                           ExpandedTypes, NumExpandedTypes,
5206952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                           ExpandedTInfos);
5216952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor}
5226952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor
52376a40219ee5624d78aba167dce02bdbaa930955fJohn McCallSourceRange NonTypeTemplateParmDecl::getSourceRange() const {
524ee4bfd412db491c489fc2ee74916edd73f9c618aAbramo Bagnara  if (hasDefaultArgument() && !defaultArgumentWasInherited())
525a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara    return SourceRange(getOuterLocStart(),
526a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara                       getDefaultArgument()->getSourceRange().getEnd());
527a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara  return DeclaratorDecl::getSourceRange();
52876a40219ee5624d78aba167dce02bdbaa930955fJohn McCall}
52976a40219ee5624d78aba167dce02bdbaa930955fJohn McCall
530d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas GregorSourceLocation NonTypeTemplateParmDecl::getDefaultArgumentLoc() const {
531d92f7a297c0ed3f7d0ebcbb557e1d4c1925b8c72Abramo Bagnara  return hasDefaultArgument()
532d92f7a297c0ed3f7d0ebcbb557e1d4c1925b8c72Abramo Bagnara    ? getDefaultArgument()->getSourceRange().getBegin()
533d92f7a297c0ed3f7d0ebcbb557e1d4c1925b8c72Abramo Bagnara    : SourceLocation();
534d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas Gregor}
535d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas Gregor
536aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
537aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// TemplateTemplateParmDecl Method Implementations
538aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
539aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
540aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorTemplateTemplateParmDecl *
5414ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadTemplateTemplateParmDecl::Create(const ASTContext &C, DeclContext *DC,
542aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                 SourceLocation L, unsigned D, unsigned P,
54361c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor                                 bool ParameterPack, IdentifierInfo *Id,
544aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                 TemplateParameterList *Params) {
54561c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor  return new (C) TemplateTemplateParmDecl(DC, L, D, P, ParameterPack, Id,
54661c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor                                          Params);
547aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor}
548aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
5493e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor//===----------------------------------------------------------------------===//
5507e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor// TemplateArgumentList Implementation
5517e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor//===----------------------------------------------------------------------===//
552910f8008fea79120489a53593fe971b0b8a4a740Douglas GregorTemplateArgumentList *
553910f8008fea79120489a53593fe971b0b8a4a740Douglas GregorTemplateArgumentList::CreateCopy(ASTContext &Context,
554910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor                                 const TemplateArgument *Args,
555910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor                                 unsigned NumArgs) {
556910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor  std::size_t Size = sizeof(TemplateArgumentList)
557910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor                   + NumArgs * sizeof(TemplateArgument);
558910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor  void *Mem = Context.Allocate(Size);
559910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor  TemplateArgument *StoredArgs
560910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor    = reinterpret_cast<TemplateArgument *>(
561910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor                                static_cast<TemplateArgumentList *>(Mem) + 1);
562910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor  std::uninitialized_copy(Args, Args + NumArgs, StoredArgs);
563910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor  return new (Mem) TemplateArgumentList(StoredArgs, NumArgs, true);
56494d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis}
56594d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis
5667e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor//===----------------------------------------------------------------------===//
5673e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor// ClassTemplateSpecializationDecl Implementation
5683e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor//===----------------------------------------------------------------------===//
5693e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas GregorClassTemplateSpecializationDecl::
57013c8577201e4fc0ddac5f09d05fd1778832137d1Douglas GregorClassTemplateSpecializationDecl(ASTContext &Context, Kind DK, TagKind TK,
571ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara                                DeclContext *DC, SourceLocation StartLoc,
572ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara                                SourceLocation IdLoc,
5733e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor                                ClassTemplateDecl *SpecializedTemplate,
574910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor                                const TemplateArgument *Args,
575910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor                                unsigned NumArgs,
5768e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor                                ClassTemplateSpecializationDecl *PrevDecl)
577ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara  : CXXRecordDecl(DK, TK, DC, StartLoc, IdLoc,
5788e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor                  SpecializedTemplate->getIdentifier(),
5798e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor                  PrevDecl),
5803e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor    SpecializedTemplate(SpecializedTemplate),
581c98971d5c994caed9452aeadd0122c855e0f4de1Abramo Bagnara    ExplicitInfo(0),
582910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor    TemplateArgs(TemplateArgumentList::CreateCopy(Context, Args, NumArgs)),
5837e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor    SpecializationKind(TSK_Undeclared) {
5843e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor}
5851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
58694d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios KyrtzidisClassTemplateSpecializationDecl::ClassTemplateSpecializationDecl(Kind DK)
587ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara  : CXXRecordDecl(DK, TTK_Struct, 0, SourceLocation(), SourceLocation(), 0, 0),
58894d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis    ExplicitInfo(0),
58994d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis    SpecializationKind(TSK_Undeclared) {
59094d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis}
59194d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis
5923e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas GregorClassTemplateSpecializationDecl *
59313c8577201e4fc0ddac5f09d05fd1778832137d1Douglas GregorClassTemplateSpecializationDecl::Create(ASTContext &Context, TagKind TK,
594ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara                                        DeclContext *DC,
595ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara                                        SourceLocation StartLoc,
596ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara                                        SourceLocation IdLoc,
5973e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor                                        ClassTemplateDecl *SpecializedTemplate,
598910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor                                        const TemplateArgument *Args,
599910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor                                        unsigned NumArgs,
600cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor                                   ClassTemplateSpecializationDecl *PrevDecl) {
601cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor  ClassTemplateSpecializationDecl *Result
6021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    = new (Context)ClassTemplateSpecializationDecl(Context,
603c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor                                                   ClassTemplateSpecialization,
604ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara                                                   TK, DC, StartLoc, IdLoc,
6057e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor                                                   SpecializedTemplate,
606910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor                                                   Args, NumArgs,
6078e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor                                                   PrevDecl);
608cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor  Context.getTypeDeclType(Result, PrevDecl);
609cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor  return Result;
6103e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor}
611c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor
61294d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios KyrtzidisClassTemplateSpecializationDecl *
613b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios KyrtzidisClassTemplateSpecializationDecl::Create(ASTContext &Context, EmptyShell Empty) {
61494d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis  return
61594d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis    new (Context)ClassTemplateSpecializationDecl(ClassTemplateSpecialization);
61694d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis}
61794d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis
618da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregorvoid
619da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas GregorClassTemplateSpecializationDecl::getNameForDiagnostic(std::string &S,
620da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor                                                  const PrintingPolicy &Policy,
621da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor                                                      bool Qualified) const {
622da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor  NamedDecl::getNameForDiagnostic(S, Policy, Qualified);
623da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor
624da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor  const TemplateArgumentList &TemplateArgs = getTemplateArgs();
625da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor  S += TemplateSpecializationType::PrintTemplateArgumentList(
626da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor                                                          TemplateArgs.data(),
627da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor                                                          TemplateArgs.size(),
628da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor                                                             Policy);
629da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor}
630da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor
63137d93e9252026d4fb836d9c05d0122a2d46e56beDouglas GregorClassTemplateDecl *
6321eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpClassTemplateSpecializationDecl::getSpecializedTemplate() const {
6331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (SpecializedPartialSpecialization *PartialSpec
63437d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor      = SpecializedTemplate.dyn_cast<SpecializedPartialSpecialization*>())
63537d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor    return PartialSpec->PartialSpecialization->getSpecializedTemplate();
63637d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor  return SpecializedTemplate.get<ClassTemplateDecl*>();
63737d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor}
63837d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor
6394a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo BagnaraSourceRange
6404a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo BagnaraClassTemplateSpecializationDecl::getSourceRange() const {
6414a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo Bagnara  if (!ExplicitInfo)
6424a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo Bagnara    return SourceRange();
6434a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo Bagnara  SourceLocation Begin = getExternLoc();
6444a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo Bagnara  if (Begin.isInvalid())
6454a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo Bagnara    Begin = getTemplateKeywordLoc();
6464a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo Bagnara  SourceLocation End = getRBraceLoc();
6474a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo Bagnara  if (End.isInvalid())
6484a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo Bagnara    End = getTypeAsWritten()->getTypeLoc().getEndLoc();
6494a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo Bagnara  return SourceRange(Begin, End);
6504a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo Bagnara}
6514a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo Bagnara
652c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor//===----------------------------------------------------------------------===//
653c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor// ClassTemplatePartialSpecializationDecl Implementation
654c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor//===----------------------------------------------------------------------===//
6559a299e0575ce235f491014627c7267e2d2cd73deDouglas GregorClassTemplatePartialSpecializationDecl::
6569a299e0575ce235f491014627c7267e2d2cd73deDouglas GregorClassTemplatePartialSpecializationDecl(ASTContext &Context, TagKind TK,
657ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara                                       DeclContext *DC,
658ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara                                       SourceLocation StartLoc,
659ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara                                       SourceLocation IdLoc,
6609a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor                                       TemplateParameterList *Params,
6619a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor                                       ClassTemplateDecl *SpecializedTemplate,
6629a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor                                       const TemplateArgument *Args,
6639a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor                                       unsigned NumArgs,
6649a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor                                       TemplateArgumentLoc *ArgInfos,
6659a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor                                       unsigned NumArgInfos,
6669a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor                               ClassTemplatePartialSpecializationDecl *PrevDecl,
6679a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor                                       unsigned SequenceNumber)
6689a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor  : ClassTemplateSpecializationDecl(Context,
6699a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor                                    ClassTemplatePartialSpecialization,
670ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara                                    TK, DC, StartLoc, IdLoc,
671ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara                                    SpecializedTemplate,
6729a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor                                    Args, NumArgs, PrevDecl),
6739a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor    TemplateParams(Params), ArgsAsWritten(ArgInfos),
6749a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor    NumArgsAsWritten(NumArgInfos), SequenceNumber(SequenceNumber),
6759a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor    InstantiatedFromMember(0, false)
6769a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor{
677787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor  AdoptTemplateParameterList(Params, this);
6789a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor}
6799a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor
680c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas GregorClassTemplatePartialSpecializationDecl *
681c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas GregorClassTemplatePartialSpecializationDecl::
682ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo BagnaraCreate(ASTContext &Context, TagKind TK,DeclContext *DC,
683ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara       SourceLocation StartLoc, SourceLocation IdLoc,
684c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor       TemplateParameterList *Params,
685c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor       ClassTemplateDecl *SpecializedTemplate,
686910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor       const TemplateArgument *Args,
687910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor       unsigned NumArgs,
688d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall       const TemplateArgumentListInfo &ArgInfos,
6893cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall       QualType CanonInjectedType,
690dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor       ClassTemplatePartialSpecializationDecl *PrevDecl,
691dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor       unsigned SequenceNumber) {
692d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  unsigned N = ArgInfos.size();
693833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  TemplateArgumentLoc *ClonedArgs = new (Context) TemplateArgumentLoc[N];
694833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  for (unsigned I = 0; I != N; ++I)
695833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    ClonedArgs[I] = ArgInfos[I];
696833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
697c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor  ClassTemplatePartialSpecializationDecl *Result
698ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara    = new (Context)ClassTemplatePartialSpecializationDecl(Context, TK, DC,
699ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara                                                          StartLoc, IdLoc,
700ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara                                                          Params,
701c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor                                                          SpecializedTemplate,
702910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor                                                          Args, NumArgs,
703833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                                          ClonedArgs, N,
704dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor                                                          PrevDecl,
705dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor                                                          SequenceNumber);
706c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor  Result->setSpecializationKind(TSK_ExplicitSpecialization);
7073cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall
7083cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  Context.getInjectedClassNameType(Result, CanonInjectedType);
709c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor  return Result;
710c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor}
711dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall
71294d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios KyrtzidisClassTemplatePartialSpecializationDecl *
713b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios KyrtzidisClassTemplatePartialSpecializationDecl::Create(ASTContext &Context,
714b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios Kyrtzidis                                               EmptyShell Empty) {
71594d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis  return new (Context)ClassTemplatePartialSpecializationDecl();
71694d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis}
71794d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis
718dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall//===----------------------------------------------------------------------===//
719dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall// FriendTemplateDecl Implementation
720dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall//===----------------------------------------------------------------------===//
721dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall
722dd4a3b0065b9a7e7b00073df415a798886c090f3John McCallFriendTemplateDecl *FriendTemplateDecl::Create(ASTContext &Context,
723dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall                                               DeclContext *DC,
724dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall                                               SourceLocation L,
725dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall                                               unsigned NParams,
726dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall                                               TemplateParameterList **Params,
727dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall                                               FriendUnion Friend,
728dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall                                               SourceLocation FLoc) {
729dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall  FriendTemplateDecl *Result
730dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall    = new (Context) FriendTemplateDecl(DC, L, NParams, Params, Friend, FLoc);
731dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall  return Result;
732dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall}
733554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis
734554e6aa2da082575514607c3639c246c04b3232aArgyrios KyrtzidisFriendTemplateDecl *FriendTemplateDecl::Create(ASTContext &Context,
735554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis                                               EmptyShell Empty) {
736554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis  return new (Context) FriendTemplateDecl(Empty);
737554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis}
7383e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith
7393e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith//===----------------------------------------------------------------------===//
7403e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith// TypeAliasTemplateDecl Implementation
7413e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith//===----------------------------------------------------------------------===//
7423e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith
7433e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard SmithTypeAliasTemplateDecl *TypeAliasTemplateDecl::Create(ASTContext &C,
7443e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith                                                     DeclContext *DC,
7453e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith                                                     SourceLocation L,
7463e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith                                                     DeclarationName Name,
7473e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith                                                  TemplateParameterList *Params,
7483e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith                                                     NamedDecl *Decl) {
7493e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith  AdoptTemplateParameterList(Params, DC);
7503e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith  return new (C) TypeAliasTemplateDecl(DC, L, Name, Params, Decl);
7513e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith}
7523e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith
7533e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard SmithTypeAliasTemplateDecl *TypeAliasTemplateDecl::Create(ASTContext &C,
7543e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith                                                     EmptyShell) {
7553e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith  return new (C) TypeAliasTemplateDecl(0, SourceLocation(), DeclarationName(),
7563e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith                                       0, 0);
7573e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith}
7583e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith
7593e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smithvoid TypeAliasTemplateDecl::DeallocateCommon(void *Ptr) {
7603e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith  static_cast<Common *>(Ptr)->~Common();
7613e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith}
7623e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard SmithRedeclarableTemplateDecl::CommonBase *
7633e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard SmithTypeAliasTemplateDecl::newCommon(ASTContext &C) {
7643e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith  Common *CommonPtr = new (C) Common;
7653e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith  C.AddDeallocation(DeallocateCommon, CommonPtr);
7663e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith  return CommonPtr;
7673e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith}
7683e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith
769