DeclTemplate.cpp revision 4a85a73466bfb541cd9c7b57a99292a0b6900b9b
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
98aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
999eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne// RedeclarableTemplateDecl Implementation
1009eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne//===----------------------------------------------------------------------===//
1019eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne
1029eabebafc165a67812eacc184806e7bf34c5f0a5Peter CollingbourneRedeclarableTemplateDecl::CommonBase *RedeclarableTemplateDecl::getCommonPtr() {
1039eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne  // Find the first declaration of this function template.
1049eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne  RedeclarableTemplateDecl *First = getCanonicalDecl();
1059eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne
1069eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne  if (First->CommonOrPrev.isNull()) {
1076b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis    CommonBase *CommonPtr = First->newCommon(getASTContext());
1089eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne    First->CommonOrPrev = CommonPtr;
1098a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne    CommonPtr->Latest = First;
1109eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne  }
1119eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne  return First->CommonOrPrev.get<CommonBase*>();
1129eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne}
1139eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne
1149eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne
1159eabebafc165a67812eacc184806e7bf34c5f0a5Peter CollingbourneRedeclarableTemplateDecl *RedeclarableTemplateDecl::getCanonicalDeclImpl() {
1169eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne  RedeclarableTemplateDecl *Tmpl = this;
1179eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne  while (Tmpl->getPreviousDeclaration())
1189eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne    Tmpl = Tmpl->getPreviousDeclaration();
1199eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne  return Tmpl;
1209eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne}
1219eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne
1228a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbournevoid RedeclarableTemplateDecl::setPreviousDeclarationImpl(
1238a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne                                               RedeclarableTemplateDecl *Prev) {
1248a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne  if (Prev) {
1258a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne    CommonBase *Common = Prev->getCommonPtr();
1268a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne    Prev = Common->Latest;
1278a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne    Common->Latest = this;
1288a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne    CommonOrPrev = Prev;
1298a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne  } else {
1308a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne    assert(CommonOrPrev.is<CommonBase*>() && "Cannot reset TemplateDecl Prev");
1318a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne  }
1328a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne}
1338a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne
134f88718ea0ca0d64b7fd31d109f1d9ec769a9c45fPeter CollingbourneRedeclarableTemplateDecl *RedeclarableTemplateDecl::getNextRedeclaration() {
135f88718ea0ca0d64b7fd31d109f1d9ec769a9c45fPeter Collingbourne  if (CommonOrPrev.is<RedeclarableTemplateDecl*>())
136f88718ea0ca0d64b7fd31d109f1d9ec769a9c45fPeter Collingbourne    return CommonOrPrev.get<RedeclarableTemplateDecl*>();
137f88718ea0ca0d64b7fd31d109f1d9ec769a9c45fPeter Collingbourne  CommonBase *Common = CommonOrPrev.get<CommonBase*>();
138f88718ea0ca0d64b7fd31d109f1d9ec769a9c45fPeter Collingbourne  return Common ? Common->Latest : this;
139f88718ea0ca0d64b7fd31d109f1d9ec769a9c45fPeter Collingbourne}
140f88718ea0ca0d64b7fd31d109f1d9ec769a9c45fPeter Collingbourne
1414048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbournetemplate <class EntryType>
1424048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbournetypename RedeclarableTemplateDecl::SpecEntryTraits<EntryType>::DeclType*
1434048590d5774fd4b08661b5cf59b6f90b62f283aPeter CollingbourneRedeclarableTemplateDecl::findSpecializationImpl(
1444048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne                                 llvm::FoldingSet<EntryType> &Specs,
1454048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne                                 const TemplateArgument *Args, unsigned NumArgs,
1464048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne                                 void *&InsertPos) {
1474048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne  typedef SpecEntryTraits<EntryType> SETraits;
1484048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne  llvm::FoldingSetNodeID ID;
1494048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne  EntryType::Profile(ID,Args,NumArgs, getASTContext());
1504048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne  EntryType *Entry = Specs.FindNodeOrInsertPos(ID, InsertPos);
1514048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne  return Entry ? SETraits::getMostRecentDeclaration(Entry) : 0;
1524048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne}
1534048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne
1549eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne//===----------------------------------------------------------------------===//
155aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// FunctionTemplateDecl Implementation
156aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
157aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
1580054531488928a424666ac11fcdc6bcc5112de52Douglas Gregorvoid FunctionTemplateDecl::DeallocateCommon(void *Ptr) {
1590054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor  static_cast<Common *>(Ptr)->~Common();
1600054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor}
1610054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor
162aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorFunctionTemplateDecl *FunctionTemplateDecl::Create(ASTContext &C,
163aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                                   DeclContext *DC,
164aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                                   SourceLocation L,
165aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                                   DeclarationName Name,
166127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor                                               TemplateParameterList *Params,
167aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                                   NamedDecl *Decl) {
168aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor  return new (C) FunctionTemplateDecl(DC, L, Name, Params, Decl);
169aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor}
170aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
1716b5415196327fa8ef00f028ba175fafef1738ae1Argyrios KyrtzidisRedeclarableTemplateDecl::CommonBase *
1726b5415196327fa8ef00f028ba175fafef1738ae1Argyrios KyrtzidisFunctionTemplateDecl::newCommon(ASTContext &C) {
1736b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis  Common *CommonPtr = new (C) Common;
1746b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis  C.AddDeallocation(DeallocateCommon, CommonPtr);
1759eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne  return CommonPtr;
1769eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne}
1779eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne
1782c853e401ca406d417eb916e867226050e7be06bArgyrios KyrtzidisFunctionDecl *
1792c853e401ca406d417eb916e867226050e7be06bArgyrios KyrtzidisFunctionTemplateDecl::findSpecialization(const TemplateArgument *Args,
1802c853e401ca406d417eb916e867226050e7be06bArgyrios Kyrtzidis                                         unsigned NumArgs, void *&InsertPos) {
1814048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne  return findSpecializationImpl(getSpecializations(), Args, NumArgs, InsertPos);
1822c853e401ca406d417eb916e867226050e7be06bArgyrios Kyrtzidis}
1832c853e401ca406d417eb916e867226050e7be06bArgyrios Kyrtzidis
184aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
185aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// ClassTemplateDecl Implementation
186aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
187aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
1880054531488928a424666ac11fcdc6bcc5112de52Douglas Gregorvoid ClassTemplateDecl::DeallocateCommon(void *Ptr) {
1890054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor  static_cast<Common *>(Ptr)->~Common();
1900054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor}
1910054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor
1928731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios KyrtzidisClassTemplateDecl *ClassTemplateDecl::Create(ASTContext &C,
1938731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis                                             DeclContext *DC,
1948731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis                                             SourceLocation L,
1958731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis                                             DeclarationName Name,
1968731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis                                             TemplateParameterList *Params,
1978731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis                                             NamedDecl *Decl,
1988731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis                                             ClassTemplateDecl *PrevDecl) {
1998731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis  ClassTemplateDecl *New = new (C) ClassTemplateDecl(DC, L, Name, Params, Decl);
2005bf1bdc2fedb0c29b5fcdb4abc852aa85b4fe26aArgyrios Kyrtzidis  New->setPreviousDeclaration(PrevDecl);
2018731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis  return New;
2025953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor}
2035953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor
204c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregorvoid ClassTemplateDecl::LoadLazySpecializations() {
205c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor  Common *CommonPtr = getCommonPtr();
206c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor  if (CommonPtr->LazySpecializations) {
207c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor    ASTContext &Context = getASTContext();
208c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor    uint32_t *Specs = CommonPtr->LazySpecializations;
209c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor    CommonPtr->LazySpecializations = 0;
210c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor    for (uint32_t I = 0, N = *Specs++; I != N; ++I)
211c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor      (void)Context.getExternalSource()->GetExternalDecl(Specs[I]);
212c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor  }
213c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor}
214c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor
215c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregorllvm::FoldingSet<ClassTemplateSpecializationDecl> &
216c8e5cf8f725e111965debb7130ef7466c0c73884Douglas GregorClassTemplateDecl::getSpecializations() {
217c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor  LoadLazySpecializations();
218c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor  return getCommonPtr()->Specializations;
219c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor}
220c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor
221c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregorllvm::FoldingSet<ClassTemplatePartialSpecializationDecl> &
222c8e5cf8f725e111965debb7130ef7466c0c73884Douglas GregorClassTemplateDecl::getPartialSpecializations() {
223c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor  LoadLazySpecializations();
224c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor  return getCommonPtr()->PartialSpecializations;
225c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor}
226c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor
2276b5415196327fa8ef00f028ba175fafef1738ae1Argyrios KyrtzidisRedeclarableTemplateDecl::CommonBase *
2286b5415196327fa8ef00f028ba175fafef1738ae1Argyrios KyrtzidisClassTemplateDecl::newCommon(ASTContext &C) {
2296b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis  Common *CommonPtr = new (C) Common;
2306b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis  C.AddDeallocation(DeallocateCommon, CommonPtr);
2319eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne  return CommonPtr;
2329eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne}
2339eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne
234cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplateSpecializationDecl *
235cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplateDecl::findSpecialization(const TemplateArgument *Args,
236cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis                                      unsigned NumArgs, void *&InsertPos) {
2374048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne  return findSpecializationImpl(getSpecializations(), Args, NumArgs, InsertPos);
238cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis}
239cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis
240bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidisvoid ClassTemplateDecl::AddSpecialization(ClassTemplateSpecializationDecl *D,
241bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis                                          void *InsertPos) {
242bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis  getSpecializations().InsertNode(D, InsertPos);
243bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis  if (ASTMutationListener *L = getASTMutationListener())
244bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis    L->AddedCXXTemplateSpecialization(this, D);
245bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis}
246bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis
247cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplatePartialSpecializationDecl *
248cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplateDecl::findPartialSpecialization(const TemplateArgument *Args,
249cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis                                             unsigned NumArgs,
250cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis                                             void *&InsertPos) {
2514048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne  return findSpecializationImpl(getPartialSpecializations(), Args, NumArgs,
2524048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne                                InsertPos);
253cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis}
254cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis
255bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidisvoid ClassTemplateDecl::AddPartialSpecialization(
256bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis                                      ClassTemplatePartialSpecializationDecl *D,
257bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis                                      void *InsertPos) {
258bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis  getPartialSpecializations().InsertNode(D, InsertPos);
259bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis  if (ASTMutationListener *L = getASTMutationListener())
260bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis    L->AddedCXXTemplateSpecialization(this, D);
261bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis}
262bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis
263dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregorvoid ClassTemplateDecl::getPartialSpecializations(
264dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor          llvm::SmallVectorImpl<ClassTemplatePartialSpecializationDecl *> &PS) {
265dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor  llvm::FoldingSet<ClassTemplatePartialSpecializationDecl> &PartialSpecs
2665bf1bdc2fedb0c29b5fcdb4abc852aa85b4fe26aArgyrios Kyrtzidis    = getPartialSpecializations();
267dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor  PS.clear();
268dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor  PS.resize(PartialSpecs.size());
269dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor  for (llvm::FoldingSet<ClassTemplatePartialSpecializationDecl>::iterator
270dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor       P = PartialSpecs.begin(), PEnd = PartialSpecs.end();
271dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor       P != PEnd; ++P) {
272dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor    assert(!PS[P->getSequenceNumber()]);
273cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis    PS[P->getSequenceNumber()] = P->getMostRecentDeclaration();
274dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor  }
275dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor}
276dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor
277b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas GregorClassTemplatePartialSpecializationDecl *
278b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas GregorClassTemplateDecl::findPartialSpecialization(QualType T) {
279b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor  ASTContext &Context = getASTContext();
280b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor  typedef llvm::FoldingSet<ClassTemplatePartialSpecializationDecl>::iterator
281b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor    partial_spec_iterator;
282b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor  for (partial_spec_iterator P = getPartialSpecializations().begin(),
283b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor                          PEnd = getPartialSpecializations().end();
284b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor       P != PEnd; ++P) {
28531f17ecbef57b5679c017c375db330546b7b5145John McCall    if (Context.hasSameType(P->getInjectedSpecializationType(), T))
286cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis      return P->getMostRecentDeclaration();
287cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis  }
288cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis
289cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis  return 0;
290cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis}
291cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis
292cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplatePartialSpecializationDecl *
293cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplateDecl::findPartialSpecInstantiatedFromMember(
294cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis                                    ClassTemplatePartialSpecializationDecl *D) {
295cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis  Decl *DCanon = D->getCanonicalDecl();
296cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis  for (llvm::FoldingSet<ClassTemplatePartialSpecializationDecl>::iterator
297cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis            P = getPartialSpecializations().begin(),
298cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis         PEnd = getPartialSpecializations().end();
299cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis       P != PEnd; ++P) {
300cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis    if (P->getInstantiatedFromMember()->getCanonicalDecl() == DCanon)
301cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis      return P->getMostRecentDeclaration();
302b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor  }
3031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
304b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor  return 0;
305b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor}
306b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor
3073cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCallQualType
30824bae92f08ae098cc50a602d8cf1273b423e14daDouglas GregorClassTemplateDecl::getInjectedClassNameSpecialization() {
3095bf1bdc2fedb0c29b5fcdb4abc852aa85b4fe26aArgyrios Kyrtzidis  Common *CommonPtr = getCommonPtr();
3107da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor  if (!CommonPtr->InjectedClassNameType.isNull())
3117da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor    return CommonPtr->InjectedClassNameType;
3127da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor
313b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor  // C++0x [temp.dep.type]p2:
314b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor  //  The template argument list of a primary template is a template argument
315b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor  //  list in which the nth template argument has the value of the nth template
316b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor  //  parameter of the class template. If the nth template parameter is a
317b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor  //  template parameter pack (14.5.3), the nth template argument is a pack
318b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor  //  expansion (14.5.3) whose pattern is the name of the template parameter
319b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor  //  pack.
32024bae92f08ae098cc50a602d8cf1273b423e14daDouglas Gregor  ASTContext &Context = getASTContext();
3217da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor  TemplateParameterList *Params = getTemplateParameters();
3227da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor  llvm::SmallVector<TemplateArgument, 16> TemplateArgs;
3237da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor  TemplateArgs.reserve(Params->size());
3241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  for (TemplateParameterList::iterator Param = Params->begin(),
3251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                    ParamEnd = Params->end();
3267da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor       Param != ParamEnd; ++Param) {
327b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor    TemplateArgument Arg;
328b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor    if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(*Param)) {
329b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor      QualType ArgType = Context.getTypeDeclType(TTP);
330b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor      if (TTP->isParameterPack())
331cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor        ArgType = Context.getPackExpansionType(ArgType,
332cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor                                               llvm::Optional<unsigned>());
333b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor
334b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor      Arg = TemplateArgument(ArgType);
3351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    } else if (NonTypeTemplateParmDecl *NTTP =
3367da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor                 dyn_cast<NonTypeTemplateParmDecl>(*Param)) {
337b7de181d912690958e82c01f1b3d752d3d4ab43bChandler Carruth      Expr *E = new (Context) DeclRefExpr(NTTP,
3386398235d7890a81b785ea5af3b6e66d86bf184ccDouglas Gregor                                  NTTP->getType().getNonLValueExprType(Context),
339f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall                                  Expr::getValueKindForType(NTTP->getType()),
3400da76df9218d7c27b471b0a4d83a5b29fe24e5b4Douglas Gregor                                          NTTP->getLocation());
341b95cc97b2023d00cd3fbae8455bc9d728eab5e5dDouglas Gregor
342b95cc97b2023d00cd3fbae8455bc9d728eab5e5dDouglas Gregor      if (NTTP->isParameterPack())
343b95cc97b2023d00cd3fbae8455bc9d728eab5e5dDouglas Gregor        E = new (Context) PackExpansionExpr(Context.DependentTy, E,
34467fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor                                            NTTP->getLocation(),
34567fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor                                            llvm::Optional<unsigned>());
346b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor      Arg = TemplateArgument(E);
3471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    } else {
3487da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor      TemplateTemplateParmDecl *TTP = cast<TemplateTemplateParmDecl>(*Param);
3492be29f423acad3bbe39099a78db2805acb5bdf17Douglas Gregor      if (TTP->isParameterPack())
3502be29f423acad3bbe39099a78db2805acb5bdf17Douglas Gregor        Arg = TemplateArgument(TemplateName(TTP), llvm::Optional<unsigned>());
3512be29f423acad3bbe39099a78db2805acb5bdf17Douglas Gregor      else
3522be29f423acad3bbe39099a78db2805acb5bdf17Douglas Gregor        Arg = TemplateArgument(TemplateName(TTP));
3537da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor    }
354b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor
355203e6a322ae29d577acafcb1572a57ec16e1e730Douglas Gregor    if ((*Param)->isTemplateParameterPack())
356203e6a322ae29d577acafcb1572a57ec16e1e730Douglas Gregor      Arg = TemplateArgument::CreatePackCopy(Context, &Arg, 1);
357b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor
358b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor    TemplateArgs.push_back(Arg);
3597da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor  }
3607da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor
3617da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor  CommonPtr->InjectedClassNameType
3621275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor    = Context.getTemplateSpecializationType(TemplateName(this),
3637da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor                                            &TemplateArgs[0],
3641275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor                                            TemplateArgs.size());
3657da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor  return CommonPtr->InjectedClassNameType;
3667da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor}
3677da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor
368aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
369aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// TemplateTypeParm Allocation/Deallocation Method Implementations
370aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
371aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
372aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorTemplateTypeParmDecl *
3734ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadTemplateTypeParmDecl::Create(const ASTContext &C, DeclContext *DC,
374aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                             SourceLocation L, unsigned D, unsigned P,
3756d845ae1baf77691bca080e0762a1d45ee017f70Anders Carlsson                             IdentifierInfo *Id, bool Typename,
3766d845ae1baf77691bca080e0762a1d45ee017f70Anders Carlsson                             bool ParameterPack) {
377efed5c832de630715dd42211dd3b2aab5dd97a1bDouglas Gregor  QualType Type = C.getTemplateTypeParmType(D, P, ParameterPack, Id);
378efed5c832de630715dd42211dd3b2aab5dd97a1bDouglas Gregor  return new (C) TemplateTypeParmDecl(DC, L, Id, Typename, Type, ParameterPack);
379aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor}
380aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
381b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios KyrtzidisTemplateTypeParmDecl *
3824ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadTemplateTypeParmDecl::Create(const ASTContext &C, EmptyShell Empty) {
383b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios Kyrtzidis  return new (C) TemplateTypeParmDecl(0, SourceLocation(), 0, false,
384b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios Kyrtzidis                                      QualType(), false);
385b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios Kyrtzidis}
386b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios Kyrtzidis
387833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallSourceLocation TemplateTypeParmDecl::getDefaultArgumentLoc() const {
38877d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara  return hasDefaultArgument()
38977d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara    ? DefaultArgument->getTypeLoc().getBeginLoc()
39077d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara    : SourceLocation();
39177d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara}
39277d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara
39377d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo BagnaraSourceRange TemplateTypeParmDecl::getSourceRange() const {
39477d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara  if (hasDefaultArgument() && !defaultArgumentWasInherited())
39577d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara    return SourceRange(getLocation(),
39677d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara                       DefaultArgument->getTypeLoc().getEndLoc());
39777d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara  else
39877d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara    return SourceRange(getLocation());
399833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall}
400833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
401ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregorunsigned TemplateTypeParmDecl::getDepth() const {
402ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor  return TypeForDecl->getAs<TemplateTypeParmType>()->getDepth();
403ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor}
404ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor
405ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregorunsigned TemplateTypeParmDecl::getIndex() const {
406ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor  return TypeForDecl->getAs<TemplateTypeParmType>()->getIndex();
407ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor}
408ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor
409aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
410aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// NonTypeTemplateParmDecl Method Implementations
411aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
412aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
4136952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas GregorNonTypeTemplateParmDecl::NonTypeTemplateParmDecl(DeclContext *DC,
4146952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                                 SourceLocation L, unsigned D,
4156952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                                 unsigned P, IdentifierInfo *Id,
4166952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                                 QualType T,
4176952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                                 TypeSourceInfo *TInfo,
4186952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                                 const QualType *ExpandedTypes,
4196952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                                 unsigned NumExpandedTypes,
4206952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                                TypeSourceInfo **ExpandedTInfos)
42176a40219ee5624d78aba167dce02bdbaa930955fJohn McCall  : DeclaratorDecl(NonTypeTemplateParm, DC, L, Id, T, TInfo),
4226952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor    TemplateParmPosition(D, P), DefaultArgumentAndInherited(0, false),
4236952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor    ParameterPack(true), ExpandedParameterPack(true),
4246952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor    NumExpandedTypes(NumExpandedTypes)
4256952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor{
4266952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor  if (ExpandedTypes && ExpandedTInfos) {
4276952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor    void **TypesAndInfos = reinterpret_cast<void **>(this + 1);
4286952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor    for (unsigned I = 0; I != NumExpandedTypes; ++I) {
4296952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor      TypesAndInfos[2*I] = ExpandedTypes[I].getAsOpaquePtr();
4306952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor      TypesAndInfos[2*I + 1] = ExpandedTInfos[I];
4316952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor    }
4326952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor  }
4336952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor}
4346952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor
435aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorNonTypeTemplateParmDecl *
4364ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadNonTypeTemplateParmDecl::Create(const ASTContext &C, DeclContext *DC,
437aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                SourceLocation L, unsigned D, unsigned P,
438aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                IdentifierInfo *Id, QualType T,
43910738d36b150aa65206890c1c845cdba076e4200Douglas Gregor                                bool ParameterPack, TypeSourceInfo *TInfo) {
44010738d36b150aa65206890c1c845cdba076e4200Douglas Gregor  return new (C) NonTypeTemplateParmDecl(DC, L, D, P, Id, T, ParameterPack,
44110738d36b150aa65206890c1c845cdba076e4200Douglas Gregor                                         TInfo);
442aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor}
443aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
4446952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas GregorNonTypeTemplateParmDecl *
4456952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas GregorNonTypeTemplateParmDecl::Create(const ASTContext &C, DeclContext *DC,
4466952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                SourceLocation L, unsigned D, unsigned P,
4476952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                IdentifierInfo *Id, QualType T,
4486952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                TypeSourceInfo *TInfo,
4496952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                const QualType *ExpandedTypes,
4506952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                unsigned NumExpandedTypes,
4516952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                TypeSourceInfo **ExpandedTInfos) {
4526952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor  unsigned Size = sizeof(NonTypeTemplateParmDecl)
4536952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                + NumExpandedTypes * 2 * sizeof(void*);
4546952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor  void *Mem = C.Allocate(Size);
4556952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor  return new (Mem) NonTypeTemplateParmDecl(DC, L, D, P, Id, T, TInfo,
4566952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                           ExpandedTypes, NumExpandedTypes,
4576952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor                                           ExpandedTInfos);
4586952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor}
4596952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor
460da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas GregorSourceLocation NonTypeTemplateParmDecl::getInnerLocStart() const {
461da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor  SourceLocation Start = getTypeSpecStartLoc();
462da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor  if (Start.isInvalid())
463da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor    Start = getLocation();
464da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor  return Start;
465da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor}
466da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor
46776a40219ee5624d78aba167dce02bdbaa930955fJohn McCallSourceRange NonTypeTemplateParmDecl::getSourceRange() const {
468ee4bfd412db491c489fc2ee74916edd73f9c618aAbramo Bagnara  SourceLocation End = getLocation();
469ee4bfd412db491c489fc2ee74916edd73f9c618aAbramo Bagnara  if (hasDefaultArgument() && !defaultArgumentWasInherited())
470ee4bfd412db491c489fc2ee74916edd73f9c618aAbramo Bagnara    End = getDefaultArgument()->getSourceRange().getEnd();
471ee4bfd412db491c489fc2ee74916edd73f9c618aAbramo Bagnara  return SourceRange(getOuterLocStart(), End);
47276a40219ee5624d78aba167dce02bdbaa930955fJohn McCall}
47376a40219ee5624d78aba167dce02bdbaa930955fJohn McCall
474d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas GregorSourceLocation NonTypeTemplateParmDecl::getDefaultArgumentLoc() const {
475d92f7a297c0ed3f7d0ebcbb557e1d4c1925b8c72Abramo Bagnara  return hasDefaultArgument()
476d92f7a297c0ed3f7d0ebcbb557e1d4c1925b8c72Abramo Bagnara    ? getDefaultArgument()->getSourceRange().getBegin()
477d92f7a297c0ed3f7d0ebcbb557e1d4c1925b8c72Abramo Bagnara    : SourceLocation();
478d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas Gregor}
479d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas Gregor
480aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
481aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// TemplateTemplateParmDecl Method Implementations
482aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
483aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
484aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorTemplateTemplateParmDecl *
4854ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadTemplateTemplateParmDecl::Create(const ASTContext &C, DeclContext *DC,
486aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                 SourceLocation L, unsigned D, unsigned P,
48761c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor                                 bool ParameterPack, IdentifierInfo *Id,
488aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                 TemplateParameterList *Params) {
48961c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor  return new (C) TemplateTemplateParmDecl(DC, L, D, P, ParameterPack, Id,
49061c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor                                          Params);
491aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor}
492aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
4933e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor//===----------------------------------------------------------------------===//
4947e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor// TemplateArgumentList Implementation
4957e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor//===----------------------------------------------------------------------===//
496910f8008fea79120489a53593fe971b0b8a4a740Douglas GregorTemplateArgumentList *
497910f8008fea79120489a53593fe971b0b8a4a740Douglas GregorTemplateArgumentList::CreateCopy(ASTContext &Context,
498910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor                                 const TemplateArgument *Args,
499910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor                                 unsigned NumArgs) {
500910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor  std::size_t Size = sizeof(TemplateArgumentList)
501910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor                   + NumArgs * sizeof(TemplateArgument);
502910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor  void *Mem = Context.Allocate(Size);
503910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor  TemplateArgument *StoredArgs
504910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor    = reinterpret_cast<TemplateArgument *>(
505910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor                                static_cast<TemplateArgumentList *>(Mem) + 1);
506910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor  std::uninitialized_copy(Args, Args + NumArgs, StoredArgs);
507910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor  return new (Mem) TemplateArgumentList(StoredArgs, NumArgs, true);
50894d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis}
50994d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis
5107e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor//===----------------------------------------------------------------------===//
5113e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor// ClassTemplateSpecializationDecl Implementation
5123e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor//===----------------------------------------------------------------------===//
5133e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas GregorClassTemplateSpecializationDecl::
51413c8577201e4fc0ddac5f09d05fd1778832137d1Douglas GregorClassTemplateSpecializationDecl(ASTContext &Context, Kind DK, TagKind TK,
5157e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor                                DeclContext *DC, SourceLocation L,
5163e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor                                ClassTemplateDecl *SpecializedTemplate,
517910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor                                const TemplateArgument *Args,
518910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor                                unsigned NumArgs,
5198e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor                                ClassTemplateSpecializationDecl *PrevDecl)
52013c8577201e4fc0ddac5f09d05fd1778832137d1Douglas Gregor  : CXXRecordDecl(DK, TK, DC, L,
5218e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor                  SpecializedTemplate->getIdentifier(),
5228e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor                  PrevDecl),
5233e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor    SpecializedTemplate(SpecializedTemplate),
524c98971d5c994caed9452aeadd0122c855e0f4de1Abramo Bagnara    ExplicitInfo(0),
525910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor    TemplateArgs(TemplateArgumentList::CreateCopy(Context, Args, NumArgs)),
5267e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor    SpecializationKind(TSK_Undeclared) {
5273e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor}
5281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
52994d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios KyrtzidisClassTemplateSpecializationDecl::ClassTemplateSpecializationDecl(Kind DK)
53094d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis  : CXXRecordDecl(DK, TTK_Struct, 0, SourceLocation(), 0, 0),
53194d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis    ExplicitInfo(0),
53294d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis    SpecializationKind(TSK_Undeclared) {
53394d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis}
53494d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis
5353e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas GregorClassTemplateSpecializationDecl *
53613c8577201e4fc0ddac5f09d05fd1778832137d1Douglas GregorClassTemplateSpecializationDecl::Create(ASTContext &Context, TagKind TK,
5373e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor                                        DeclContext *DC, SourceLocation L,
5383e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor                                        ClassTemplateDecl *SpecializedTemplate,
539910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor                                        const TemplateArgument *Args,
540910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor                                        unsigned NumArgs,
541cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor                                   ClassTemplateSpecializationDecl *PrevDecl) {
542cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor  ClassTemplateSpecializationDecl *Result
5431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    = new (Context)ClassTemplateSpecializationDecl(Context,
544c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor                                                   ClassTemplateSpecialization,
54513c8577201e4fc0ddac5f09d05fd1778832137d1Douglas Gregor                                                   TK, DC, L,
5467e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor                                                   SpecializedTemplate,
547910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor                                                   Args, NumArgs,
5488e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor                                                   PrevDecl);
549cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor  Context.getTypeDeclType(Result, PrevDecl);
550cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor  return Result;
5513e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor}
552c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor
55394d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios KyrtzidisClassTemplateSpecializationDecl *
554b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios KyrtzidisClassTemplateSpecializationDecl::Create(ASTContext &Context, EmptyShell Empty) {
55594d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis  return
55694d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis    new (Context)ClassTemplateSpecializationDecl(ClassTemplateSpecialization);
55794d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis}
55894d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis
559da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregorvoid
560da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas GregorClassTemplateSpecializationDecl::getNameForDiagnostic(std::string &S,
561da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor                                                  const PrintingPolicy &Policy,
562da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor                                                      bool Qualified) const {
563da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor  NamedDecl::getNameForDiagnostic(S, Policy, Qualified);
564da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor
565da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor  const TemplateArgumentList &TemplateArgs = getTemplateArgs();
566da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor  S += TemplateSpecializationType::PrintTemplateArgumentList(
567da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor                                                          TemplateArgs.data(),
568da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor                                                          TemplateArgs.size(),
569da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor                                                             Policy);
570da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor}
571da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor
57237d93e9252026d4fb836d9c05d0122a2d46e56beDouglas GregorClassTemplateDecl *
5731eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpClassTemplateSpecializationDecl::getSpecializedTemplate() const {
5741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (SpecializedPartialSpecialization *PartialSpec
57537d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor      = SpecializedTemplate.dyn_cast<SpecializedPartialSpecialization*>())
57637d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor    return PartialSpec->PartialSpecialization->getSpecializedTemplate();
57737d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor  return SpecializedTemplate.get<ClassTemplateDecl*>();
57837d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor}
57937d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor
5804a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo BagnaraSourceRange
5814a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo BagnaraClassTemplateSpecializationDecl::getSourceRange() const {
5824a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo Bagnara  if (!ExplicitInfo)
5834a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo Bagnara    return SourceRange();
5844a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo Bagnara  SourceLocation Begin = getExternLoc();
5854a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo Bagnara  if (Begin.isInvalid())
5864a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo Bagnara    Begin = getTemplateKeywordLoc();
5874a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo Bagnara  SourceLocation End = getRBraceLoc();
5884a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo Bagnara  if (End.isInvalid())
5894a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo Bagnara    End = getTypeAsWritten()->getTypeLoc().getEndLoc();
5904a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo Bagnara  return SourceRange(Begin, End);
5914a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo Bagnara}
5924a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo Bagnara
593c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor//===----------------------------------------------------------------------===//
594c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor// ClassTemplatePartialSpecializationDecl Implementation
595c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor//===----------------------------------------------------------------------===//
596c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas GregorClassTemplatePartialSpecializationDecl *
597c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas GregorClassTemplatePartialSpecializationDecl::
59813c8577201e4fc0ddac5f09d05fd1778832137d1Douglas GregorCreate(ASTContext &Context, TagKind TK,DeclContext *DC, SourceLocation L,
599c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor       TemplateParameterList *Params,
600c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor       ClassTemplateDecl *SpecializedTemplate,
601910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor       const TemplateArgument *Args,
602910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor       unsigned NumArgs,
603d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall       const TemplateArgumentListInfo &ArgInfos,
6043cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall       QualType CanonInjectedType,
605dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor       ClassTemplatePartialSpecializationDecl *PrevDecl,
606dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor       unsigned SequenceNumber) {
607d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall  unsigned N = ArgInfos.size();
608833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  TemplateArgumentLoc *ClonedArgs = new (Context) TemplateArgumentLoc[N];
609833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  for (unsigned I = 0; I != N; ++I)
610833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    ClonedArgs[I] = ArgInfos[I];
611833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
612c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor  ClassTemplatePartialSpecializationDecl *Result
61313c8577201e4fc0ddac5f09d05fd1778832137d1Douglas Gregor    = new (Context)ClassTemplatePartialSpecializationDecl(Context, TK,
614c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor                                                          DC, L, Params,
615c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor                                                          SpecializedTemplate,
616910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor                                                          Args, NumArgs,
617833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                                                          ClonedArgs, N,
618dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor                                                          PrevDecl,
619dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor                                                          SequenceNumber);
620c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor  Result->setSpecializationKind(TSK_ExplicitSpecialization);
6213cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall
6223cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  Context.getInjectedClassNameType(Result, CanonInjectedType);
623c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor  return Result;
624c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor}
625dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall
62694d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios KyrtzidisClassTemplatePartialSpecializationDecl *
627b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios KyrtzidisClassTemplatePartialSpecializationDecl::Create(ASTContext &Context,
628b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios Kyrtzidis                                               EmptyShell Empty) {
62994d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis  return new (Context)ClassTemplatePartialSpecializationDecl();
63094d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis}
63194d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis
632dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall//===----------------------------------------------------------------------===//
633dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall// FriendTemplateDecl Implementation
634dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall//===----------------------------------------------------------------------===//
635dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall
636dd4a3b0065b9a7e7b00073df415a798886c090f3John McCallFriendTemplateDecl *FriendTemplateDecl::Create(ASTContext &Context,
637dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall                                               DeclContext *DC,
638dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall                                               SourceLocation L,
639dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall                                               unsigned NParams,
640dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall                                               TemplateParameterList **Params,
641dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall                                               FriendUnion Friend,
642dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall                                               SourceLocation FLoc) {
643dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall  FriendTemplateDecl *Result
644dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall    = new (Context) FriendTemplateDecl(DC, L, NParams, Params, Friend, FLoc);
645dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall  return Result;
646dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall}
647554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis
648554e6aa2da082575514607c3639c246c04b3232aArgyrios KyrtzidisFriendTemplateDecl *FriendTemplateDecl::Create(ASTContext &Context,
649554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis                                               EmptyShell Empty) {
650554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis  return new (Context) FriendTemplateDecl(Empty);
651554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis}
652