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/DeclTemplate.h"
1555fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/AST/ASTContext.h"
1655fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/AST/ASTMutationListener.h"
1755fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/AST/DeclCXX.h"
1855f6b14230c94272efbbcdd89a92224c8db9f225Douglas Gregor#include "clang/AST/Expr.h"
19b95cc97b2023d00cd3fbae8455bc9d728eab5e5dDouglas Gregor#include "clang/AST/ExprCXX.h"
20833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall#include "clang/AST/TypeLoc.h"
2187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#include "clang/Basic/Builtins.h"
22aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor#include "clang/Basic/IdentifierTable.h"
23aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor#include "llvm/ADT/STLExtras.h"
24910f8008fea79120489a53593fe971b0b8a4a740Douglas Gregor#include <memory>
25aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregorusing namespace clang;
26aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
27aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
28aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// TemplateParameterList Implementation
29aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
30aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
31ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas GregorTemplateParameterList::TemplateParameterList(SourceLocation TemplateLoc,
32ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas Gregor                                             SourceLocation LAngleLoc,
334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                             ArrayRef<NamedDecl *> Params,
34ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas Gregor                                             SourceLocation RAngleLoc)
35ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas Gregor  : TemplateLoc(TemplateLoc), LAngleLoc(LAngleLoc), RAngleLoc(RAngleLoc),
364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    NumParams(Params.size()), ContainsUnexpandedParameterPack(false) {
376964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith  assert(this->NumParams == NumParams && "Too many template parameters");
386964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith  for (unsigned Idx = 0; Idx < NumParams; ++Idx) {
396964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith    NamedDecl *P = Params[Idx];
406964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith    begin()[Idx] = P;
416964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith
426964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith    if (!P->isTemplateParameterPack()) {
436964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith      if (NonTypeTemplateParmDecl *NTTP = dyn_cast<NonTypeTemplateParmDecl>(P))
446964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith        if (NTTP->getType()->containsUnexpandedParameterPack())
456964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith          ContainsUnexpandedParameterPack = true;
466964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith
476964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith      if (TemplateTemplateParmDecl *TTP = dyn_cast<TemplateTemplateParmDecl>(P))
486964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith        if (TTP->getTemplateParameters()->containsUnexpandedParameterPack())
496964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith          ContainsUnexpandedParameterPack = true;
506964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith
516964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith      // FIXME: If a default argument contains an unexpanded parameter pack, the
526964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith      // template parameter list does too.
536964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith    }
546964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith  }
55aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor}
56aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
574967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTemplateParameterList *TemplateParameterList::Create(
584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    const ASTContext &C, SourceLocation TemplateLoc, SourceLocation LAngleLoc,
594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    ArrayRef<NamedDecl *> Params, SourceLocation RAngleLoc) {
604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  void *Mem = C.Allocate(totalSizeToAlloc<NamedDecl *>(Params.size()),
6187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                         llvm::alignOf<TemplateParameterList>());
621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return new (Mem) TemplateParameterList(TemplateLoc, LAngleLoc, Params,
634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                         RAngleLoc);
64aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor}
65aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
6662cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregorunsigned TemplateParameterList::getMinRequiredArguments() const {
676952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor  unsigned NumRequiredArgs = 0;
684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (const NamedDecl *P : asArray()) {
694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    if (P->isTemplateParameterPack()) {
704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      if (const auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(P))
716952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor        if (NTTP->isExpandedParameterPack()) {
726952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor          NumRequiredArgs += NTTP->getNumExpansionTypes();
736952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor          continue;
746952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor        }
754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
7662cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor      break;
776952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor    }
784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    if (const auto *TTP = dyn_cast<TemplateTypeParmDecl>(P)) {
806952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor      if (TTP->hasDefaultArgument())
816952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor        break;
824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    } else if (const auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(P)) {
836952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor      if (NTTP->hasDefaultArgument())
846952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor        break;
854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    } else if (cast<TemplateTemplateParmDecl>(P)->hasDefaultArgument())
866952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor      break;
874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
886952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor    ++NumRequiredArgs;
8962cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor  }
904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
9162cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor  return NumRequiredArgs;
9262cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor}
9362cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor
94ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregorunsigned TemplateParameterList::getDepth() const {
95ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor  if (size() == 0)
96ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor    return 0;
97ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor
98ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor  const NamedDecl *FirstParm = getParam(0);
99ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor  if (const TemplateTypeParmDecl *TTP
100ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor        = dyn_cast<TemplateTypeParmDecl>(FirstParm))
101ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor    return TTP->getDepth();
102ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor  else if (const NonTypeTemplateParmDecl *NTTP
103ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor             = dyn_cast<NonTypeTemplateParmDecl>(FirstParm))
104ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor    return NTTP->getDepth();
105ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor  else
106ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor    return cast<TemplateTemplateParmDecl>(FirstParm)->getDepth();
107ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor}
108ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor
109787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregorstatic void AdoptTemplateParameterList(TemplateParameterList *Params,
110787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor                                       DeclContext *Owner) {
1114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (NamedDecl *P : *Params) {
1124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    P->setDeclContext(Owner);
1134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    if (auto *TTP = dyn_cast<TemplateTemplateParmDecl>(P))
115787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor      AdoptTemplateParameterList(TTP->getTemplateParameters(), Owner);
116787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor  }
117787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor}
118787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor
119b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarnamespace clang {
120b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarvoid *allocateDefaultArgStorageChain(const ASTContext &C) {
121b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  return new (C) char[sizeof(void*) * 2];
122b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar}
123b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar}
124b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar
125aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
1269eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne// RedeclarableTemplateDecl Implementation
1279eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne//===----------------------------------------------------------------------===//
1289eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne
129b76d9718caea48b9333979b3da6f3a80110840cbDmitri GribenkoRedeclarableTemplateDecl::CommonBase *RedeclarableTemplateDecl::getCommonPtr() const {
1309297535638b59e652bc521bf8e6c87856d639279Rafael Espindola  if (Common)
1319297535638b59e652bc521bf8e6c87856d639279Rafael Espindola    return Common;
1329eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne
1339297535638b59e652bc521bf8e6c87856d639279Rafael Espindola  // Walk the previous-declaration chain until we either find a declaration
1349297535638b59e652bc521bf8e6c87856d639279Rafael Espindola  // with a common pointer or we run out of previous declarations.
1359297535638b59e652bc521bf8e6c87856d639279Rafael Espindola  SmallVector<const RedeclarableTemplateDecl *, 2> PrevDecls;
1369297535638b59e652bc521bf8e6c87856d639279Rafael Espindola  for (const RedeclarableTemplateDecl *Prev = getPreviousDecl(); Prev;
1379297535638b59e652bc521bf8e6c87856d639279Rafael Espindola       Prev = Prev->getPreviousDecl()) {
1389297535638b59e652bc521bf8e6c87856d639279Rafael Espindola    if (Prev->Common) {
1399297535638b59e652bc521bf8e6c87856d639279Rafael Espindola      Common = Prev->Common;
1409297535638b59e652bc521bf8e6c87856d639279Rafael Espindola      break;
1418a8950b13e4d438f732d24f22f63ebe1a9e0075eDouglas Gregor    }
1429297535638b59e652bc521bf8e6c87856d639279Rafael Espindola
1439297535638b59e652bc521bf8e6c87856d639279Rafael Espindola    PrevDecls.push_back(Prev);
1449297535638b59e652bc521bf8e6c87856d639279Rafael Espindola  }
1459297535638b59e652bc521bf8e6c87856d639279Rafael Espindola
1469297535638b59e652bc521bf8e6c87856d639279Rafael Espindola  // If we never found a common pointer, allocate one now.
1479297535638b59e652bc521bf8e6c87856d639279Rafael Espindola  if (!Common) {
1489297535638b59e652bc521bf8e6c87856d639279Rafael Espindola    // FIXME: If any of the declarations is from an AST file, we probably
1499297535638b59e652bc521bf8e6c87856d639279Rafael Espindola    // need an update record to add the common data.
1509297535638b59e652bc521bf8e6c87856d639279Rafael Espindola
1519297535638b59e652bc521bf8e6c87856d639279Rafael Espindola    Common = newCommon(getASTContext());
1528a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne  }
1538a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne
1549297535638b59e652bc521bf8e6c87856d639279Rafael Espindola  // Update any previous declarations we saw with the common pointer.
1554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (const RedeclarableTemplateDecl *Prev : PrevDecls)
1564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    Prev->Common = Common;
1579297535638b59e652bc521bf8e6c87856d639279Rafael Espindola
1587c99bb5c4901c39460818ff8c00840218c48251fDouglas Gregor  return Common;
159f88718ea0ca0d64b7fd31d109f1d9ec769a9c45fPeter Collingbourne}
160f88718ea0ca0d64b7fd31d109f1d9ec769a9c45fPeter Collingbourne
1610e2c34f92f00628d48968dfea096d36381f494cbStephen Hinestemplate<class EntryType>
1620e2c34f92f00628d48968dfea096d36381f494cbStephen Hinestypename RedeclarableTemplateDecl::SpecEntryTraits<EntryType>::DeclType *
1634048590d5774fd4b08661b5cf59b6f90b62f283aPeter CollingbourneRedeclarableTemplateDecl::findSpecializationImpl(
1640e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    llvm::FoldingSetVector<EntryType> &Specs, ArrayRef<TemplateArgument> Args,
1650e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    void *&InsertPos) {
1664048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne  typedef SpecEntryTraits<EntryType> SETraits;
1674048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne  llvm::FoldingSetNodeID ID;
168c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  EntryType::Profile(ID,Args, getASTContext());
1694048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne  EntryType *Entry = Specs.FindNodeOrInsertPos(ID, InsertPos);
1700e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  return Entry ? SETraits::getDecl(Entry)->getMostRecentDecl() : nullptr;
1710e2c34f92f00628d48968dfea096d36381f494cbStephen Hines}
1720e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
1730e2c34f92f00628d48968dfea096d36381f494cbStephen Hinestemplate<class Derived, class EntryType>
1740e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesvoid RedeclarableTemplateDecl::addSpecializationImpl(
1750e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    llvm::FoldingSetVector<EntryType> &Specializations, EntryType *Entry,
1760e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    void *InsertPos) {
1770e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  typedef SpecEntryTraits<EntryType> SETraits;
1780e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  if (InsertPos) {
1790e2c34f92f00628d48968dfea096d36381f494cbStephen Hines#ifndef NDEBUG
1800e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    void *CorrectInsertPos;
1810e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    assert(!findSpecializationImpl(Specializations,
1820e2c34f92f00628d48968dfea096d36381f494cbStephen Hines                                   SETraits::getTemplateArgs(Entry),
1830e2c34f92f00628d48968dfea096d36381f494cbStephen Hines                                   CorrectInsertPos) &&
1840e2c34f92f00628d48968dfea096d36381f494cbStephen Hines           InsertPos == CorrectInsertPos &&
1850e2c34f92f00628d48968dfea096d36381f494cbStephen Hines           "given incorrect InsertPos for specialization");
1860e2c34f92f00628d48968dfea096d36381f494cbStephen Hines#endif
1870e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    Specializations.InsertNode(Entry, InsertPos);
1880e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  } else {
1890e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    EntryType *Existing = Specializations.GetOrInsertNode(Entry);
1900e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    (void)Existing;
1910e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    assert(SETraits::getDecl(Existing)->isCanonicalDecl() &&
1920e2c34f92f00628d48968dfea096d36381f494cbStephen Hines           "non-canonical specialization?");
1930e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  }
1940e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
1950e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  if (ASTMutationListener *L = getASTMutationListener())
1960e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    L->AddedCXXTemplateSpecialization(cast<Derived>(this),
1970e2c34f92f00628d48968dfea096d36381f494cbStephen Hines                                      SETraits::getDecl(Entry));
1984048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne}
1994048590d5774fd4b08661b5cf59b6f90b62f283aPeter Collingbourne
200c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor/// \brief Generate the injected template arguments for the given template
201c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor/// parameter list, e.g., for the injected-class-name of a class template.
202c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregorstatic void GenerateInjectedTemplateArgs(ASTContext &Context,
2034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                         TemplateParameterList *Params,
204c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor                                         TemplateArgument *Args) {
2054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (NamedDecl *Param : *Params) {
206c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor    TemplateArgument Arg;
2074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    if (auto *TTP = dyn_cast<TemplateTypeParmDecl>(Param)) {
208c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor      QualType ArgType = Context.getTypeDeclType(TTP);
209c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor      if (TTP->isParameterPack())
21066874fb18afbffb8b2ca05576851a64534be3352David Blaikie        ArgType = Context.getPackExpansionType(ArgType, None);
211dc84cd5efdd3430efb22546b4ac656aa0540b210David Blaikie
212c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor      Arg = TemplateArgument(ArgType);
2134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    } else if (auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(Param)) {
214f4b88a45902af1802a1cb42ba48b1c474474f228John McCall      Expr *E = new (Context) DeclRefExpr(NTTP, /*enclosing*/ false,
215c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor                                  NTTP->getType().getNonLValueExprType(Context),
216c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor                                  Expr::getValueKindForType(NTTP->getType()),
217c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor                                          NTTP->getLocation());
2184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
219c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor      if (NTTP->isParameterPack())
22066874fb18afbffb8b2ca05576851a64534be3352David Blaikie        E = new (Context) PackExpansionExpr(Context.DependentTy, E,
22166874fb18afbffb8b2ca05576851a64534be3352David Blaikie                                            NTTP->getLocation(), None);
222c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor      Arg = TemplateArgument(E);
223c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor    } else {
2244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      auto *TTP = cast<TemplateTemplateParmDecl>(Param);
225c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor      if (TTP->isParameterPack())
226dc84cd5efdd3430efb22546b4ac656aa0540b210David Blaikie        Arg = TemplateArgument(TemplateName(TTP), Optional<unsigned>());
227c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor      else
228c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor        Arg = TemplateArgument(TemplateName(TTP));
229c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor    }
2304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
2314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    if (Param->isTemplateParameterPack())
23287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      Arg = TemplateArgument::CreatePackCopy(Context, Arg);
23387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
234c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor    *Args++ = Arg;
235c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor  }
236c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor}
2374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
2389eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne//===----------------------------------------------------------------------===//
239aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// FunctionTemplateDecl Implementation
240aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
241aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
2420054531488928a424666ac11fcdc6bcc5112de52Douglas Gregorvoid FunctionTemplateDecl::DeallocateCommon(void *Ptr) {
2430054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor  static_cast<Common *>(Ptr)->~Common();
2440054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor}
2450054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor
246aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorFunctionTemplateDecl *FunctionTemplateDecl::Create(ASTContext &C,
247aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                                   DeclContext *DC,
248aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                                   SourceLocation L,
249aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                                   DeclarationName Name,
250127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor                                               TemplateParameterList *Params,
251aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                                   NamedDecl *Decl) {
252787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor  AdoptTemplateParameterList(Params, cast<DeclContext>(Decl));
2536bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  return new (C, DC) FunctionTemplateDecl(C, DC, L, Name, Params, Decl);
254aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor}
255aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
2561e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorFunctionTemplateDecl *FunctionTemplateDecl::CreateDeserialized(ASTContext &C,
2571e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor                                                               unsigned ID) {
2586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  return new (C, ID) FunctionTemplateDecl(C, nullptr, SourceLocation(),
2596bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                          DeclarationName(), nullptr, nullptr);
2609a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor}
2619a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor
2626b5415196327fa8ef00f028ba175fafef1738ae1Argyrios KyrtzidisRedeclarableTemplateDecl::CommonBase *
263b76d9718caea48b9333979b3da6f3a80110840cbDmitri GribenkoFunctionTemplateDecl::newCommon(ASTContext &C) const {
2646b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis  Common *CommonPtr = new (C) Common;
2656b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis  C.AddDeallocation(DeallocateCommon, CommonPtr);
2669eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne  return CommonPtr;
2679eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne}
2689eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne
2696982bf4d77bc57a85ee173b631729fce673f16efRichard Smithvoid FunctionTemplateDecl::LoadLazySpecializations() const {
2700e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  // Grab the most recent declaration to ensure we've loaded any lazy
2710e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  // redeclarations of this template.
2720e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  //
2730e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  // FIXME: Avoid walking the entire redeclaration chain here.
2740e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  Common *CommonPtr = getMostRecentDecl()->getCommonPtr();
2756982bf4d77bc57a85ee173b631729fce673f16efRichard Smith  if (CommonPtr->LazySpecializations) {
2766982bf4d77bc57a85ee173b631729fce673f16efRichard Smith    ASTContext &Context = getASTContext();
2776982bf4d77bc57a85ee173b631729fce673f16efRichard Smith    uint32_t *Specs = CommonPtr->LazySpecializations;
2786bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    CommonPtr->LazySpecializations = nullptr;
2796982bf4d77bc57a85ee173b631729fce673f16efRichard Smith    for (uint32_t I = 0, N = *Specs++; I != N; ++I)
2806982bf4d77bc57a85ee173b631729fce673f16efRichard Smith      (void)Context.getExternalSource()->GetExternalDecl(Specs[I]);
2816982bf4d77bc57a85ee173b631729fce673f16efRichard Smith  }
2826982bf4d77bc57a85ee173b631729fce673f16efRichard Smith}
2836982bf4d77bc57a85ee173b631729fce673f16efRichard Smith
2846982bf4d77bc57a85ee173b631729fce673f16efRichard Smithllvm::FoldingSetVector<FunctionTemplateSpecializationInfo> &
2856982bf4d77bc57a85ee173b631729fce673f16efRichard SmithFunctionTemplateDecl::getSpecializations() const {
2866982bf4d77bc57a85ee173b631729fce673f16efRichard Smith  LoadLazySpecializations();
2876982bf4d77bc57a85ee173b631729fce673f16efRichard Smith  return getCommonPtr()->Specializations;
2886982bf4d77bc57a85ee173b631729fce673f16efRichard Smith}
2896982bf4d77bc57a85ee173b631729fce673f16efRichard Smith
2902c853e401ca406d417eb916e867226050e7be06bArgyrios KyrtzidisFunctionDecl *
291c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen HinesFunctionTemplateDecl::findSpecialization(ArrayRef<TemplateArgument> Args,
292c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines                                         void *&InsertPos) {
293c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  return findSpecializationImpl(getSpecializations(), Args, InsertPos);
2942c853e401ca406d417eb916e867226050e7be06bArgyrios Kyrtzidis}
2952c853e401ca406d417eb916e867226050e7be06bArgyrios Kyrtzidis
2965bbcdbf36f8cf79d99703ef20848c55960065e43Sebastian Redlvoid FunctionTemplateDecl::addSpecialization(
2975bbcdbf36f8cf79d99703ef20848c55960065e43Sebastian Redl      FunctionTemplateSpecializationInfo *Info, void *InsertPos) {
2980e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  addSpecializationImpl<FunctionTemplateDecl>(getSpecializations(), Info,
2990e2c34f92f00628d48968dfea096d36381f494cbStephen Hines                                              InsertPos);
3005bbcdbf36f8cf79d99703ef20848c55960065e43Sebastian Redl}
3015bbcdbf36f8cf79d99703ef20848c55960065e43Sebastian Redl
3027a9f7c7c68673c46d6e2b83fec6f4cbfbd25f475Richard SmithArrayRef<TemplateArgument> FunctionTemplateDecl::getInjectedTemplateArgs() {
303c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor  TemplateParameterList *Params = getTemplateParameters();
304c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor  Common *CommonPtr = getCommonPtr();
305c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor  if (!CommonPtr->InjectedArgs) {
306c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor    CommonPtr->InjectedArgs
3077a9f7c7c68673c46d6e2b83fec6f4cbfbd25f475Richard Smith      = new (getASTContext()) TemplateArgument[Params->size()];
3087a9f7c7c68673c46d6e2b83fec6f4cbfbd25f475Richard Smith    GenerateInjectedTemplateArgs(getASTContext(), Params,
309c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor                                 CommonPtr->InjectedArgs);
310c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor  }
3117a9f7c7c68673c46d6e2b83fec6f4cbfbd25f475Richard Smith
3127a9f7c7c68673c46d6e2b83fec6f4cbfbd25f475Richard Smith  return llvm::makeArrayRef(CommonPtr->InjectedArgs, Params->size());
313c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor}
314c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor
315aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
316aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// ClassTemplateDecl Implementation
317aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
318aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
3190054531488928a424666ac11fcdc6bcc5112de52Douglas Gregorvoid ClassTemplateDecl::DeallocateCommon(void *Ptr) {
3200054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor  static_cast<Common *>(Ptr)->~Common();
3210054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor}
3220054531488928a424666ac11fcdc6bcc5112de52Douglas Gregor
3238731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios KyrtzidisClassTemplateDecl *ClassTemplateDecl::Create(ASTContext &C,
3248731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis                                             DeclContext *DC,
3258731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis                                             SourceLocation L,
3268731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis                                             DeclarationName Name,
3278731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis                                             TemplateParameterList *Params,
3288731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis                                             NamedDecl *Decl,
3298731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis                                             ClassTemplateDecl *PrevDecl) {
330787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor  AdoptTemplateParameterList(Params, cast<DeclContext>(Decl));
3316bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  ClassTemplateDecl *New = new (C, DC) ClassTemplateDecl(C, DC, L, Name,
3326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                                         Params, Decl);
333bc6509175e1ce5cc1b48d1b97ac8d23d8b74167cRafael Espindola  New->setPreviousDecl(PrevDecl);
3348731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis  return New;
3355953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor}
3365953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor
3376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesClassTemplateDecl *ClassTemplateDecl::CreateDeserialized(ASTContext &C,
3381e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor                                                         unsigned ID) {
3396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  return new (C, ID) ClassTemplateDecl(C, nullptr, SourceLocation(),
3406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                       DeclarationName(), nullptr, nullptr);
3419a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor}
3429a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor
343e252a89fc1560ca4cda9a95e4ae05e2dc03ee78cDmitri Gribenkovoid ClassTemplateDecl::LoadLazySpecializations() const {
3440e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  // Grab the most recent declaration to ensure we've loaded any lazy
3450e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  // redeclarations of this template.
3460e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  //
3470e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  // FIXME: Avoid walking the entire redeclaration chain here.
3480e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  Common *CommonPtr = getMostRecentDecl()->getCommonPtr();
349c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor  if (CommonPtr->LazySpecializations) {
350c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor    ASTContext &Context = getASTContext();
351c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor    uint32_t *Specs = CommonPtr->LazySpecializations;
3526bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    CommonPtr->LazySpecializations = nullptr;
353c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor    for (uint32_t I = 0, N = *Specs++; I != N; ++I)
354c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor      (void)Context.getExternalSource()->GetExternalDecl(Specs[I]);
355c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor  }
356c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor}
357c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor
358d964d6380945e0505b623050fe6a3f428008fc2aChandler Carruthllvm::FoldingSetVector<ClassTemplateSpecializationDecl> &
359e252a89fc1560ca4cda9a95e4ae05e2dc03ee78cDmitri GribenkoClassTemplateDecl::getSpecializations() const {
360c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor  LoadLazySpecializations();
361c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor  return getCommonPtr()->Specializations;
362c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor}
363c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor
364d964d6380945e0505b623050fe6a3f428008fc2aChandler Carruthllvm::FoldingSetVector<ClassTemplatePartialSpecializationDecl> &
365c8e5cf8f725e111965debb7130ef7466c0c73884Douglas GregorClassTemplateDecl::getPartialSpecializations() {
366c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor  LoadLazySpecializations();
367c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor  return getCommonPtr()->PartialSpecializations;
368c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor}
369c8e5cf8f725e111965debb7130ef7466c0c73884Douglas Gregor
3706b5415196327fa8ef00f028ba175fafef1738ae1Argyrios KyrtzidisRedeclarableTemplateDecl::CommonBase *
371b76d9718caea48b9333979b3da6f3a80110840cbDmitri GribenkoClassTemplateDecl::newCommon(ASTContext &C) const {
3726b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis  Common *CommonPtr = new (C) Common;
3736b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis  C.AddDeallocation(DeallocateCommon, CommonPtr);
3749eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne  return CommonPtr;
3759eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne}
3769eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne
377cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplateSpecializationDecl *
378c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen HinesClassTemplateDecl::findSpecialization(ArrayRef<TemplateArgument> Args,
379c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines                                      void *&InsertPos) {
380c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  return findSpecializationImpl(getSpecializations(), Args, InsertPos);
381cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis}
382cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis
383bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidisvoid ClassTemplateDecl::AddSpecialization(ClassTemplateSpecializationDecl *D,
384bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis                                          void *InsertPos) {
3850e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  addSpecializationImpl<ClassTemplateDecl>(getSpecializations(), D, InsertPos);
386bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis}
387bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis
388cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplatePartialSpecializationDecl *
389c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen HinesClassTemplateDecl::findPartialSpecialization(ArrayRef<TemplateArgument> Args,
390cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis                                             void *&InsertPos) {
391c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  return findSpecializationImpl(getPartialSpecializations(), Args, InsertPos);
392cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis}
393cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis
394bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidisvoid ClassTemplateDecl::AddPartialSpecialization(
395bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis                                      ClassTemplatePartialSpecializationDecl *D,
396bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis                                      void *InsertPos) {
3971e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor  if (InsertPos)
3981e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor    getPartialSpecializations().InsertNode(D, InsertPos);
3991e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor  else {
4001e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor    ClassTemplatePartialSpecializationDecl *Existing
4011e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor      = getPartialSpecializations().GetOrInsertNode(D);
4021e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor    (void)Existing;
4031e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor    assert(Existing->isCanonicalDecl() && "Non-canonical specialization?");
4041e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor  }
4051e1e9722cb4ea6027e2c4885c7a8f26d3726ca7dDouglas Gregor
406bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis  if (ASTMutationListener *L = getASTMutationListener())
407bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis    L->AddedCXXTemplateSpecialization(this, D);
408bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis}
409bef1a7b9c175d37e4a727e6ce68bd05232fa6970Argyrios Kyrtzidis
410dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregorvoid ClassTemplateDecl::getPartialSpecializations(
4115f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner          SmallVectorImpl<ClassTemplatePartialSpecializationDecl *> &PS) {
412d964d6380945e0505b623050fe6a3f428008fc2aChandler Carruth  llvm::FoldingSetVector<ClassTemplatePartialSpecializationDecl> &PartialSpecs
4135bf1bdc2fedb0c29b5fcdb4abc852aa85b4fe26aArgyrios Kyrtzidis    = getPartialSpecializations();
414dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor  PS.clear();
41537fd27dbb941d27f4bd7412e534e7e5089d6781bRichard Smith  PS.reserve(PartialSpecs.size());
4164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (ClassTemplatePartialSpecializationDecl &P : PartialSpecs)
4174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    PS.push_back(P.getMostRecentDecl());
418dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor}
419dc60c1eb4acbde6edcec9760de92f9098593d915Douglas Gregor
420b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas GregorClassTemplatePartialSpecializationDecl *
421b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas GregorClassTemplateDecl::findPartialSpecialization(QualType T) {
422b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor  ASTContext &Context = getASTContext();
4234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (ClassTemplatePartialSpecializationDecl &P :
4244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar       getPartialSpecializations()) {
4254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    if (Context.hasSameType(P.getInjectedSpecializationType(), T))
4264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      return P.getMostRecentDecl();
427cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis  }
428cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis
4296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  return nullptr;
430cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis}
431cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis
432cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplatePartialSpecializationDecl *
433cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios KyrtzidisClassTemplateDecl::findPartialSpecInstantiatedFromMember(
434cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis                                    ClassTemplatePartialSpecializationDecl *D) {
435cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis  Decl *DCanon = D->getCanonicalDecl();
4364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (ClassTemplatePartialSpecializationDecl &P : getPartialSpecializations()) {
4374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    if (P.getInstantiatedFromMember()->getCanonicalDecl() == DCanon)
4384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      return P.getMostRecentDecl();
439b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor  }
4401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  return nullptr;
442b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor}
443b88e888404ad0a2bdd9bfae457e8530bb38a87c5Douglas Gregor
4443cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCallQualType
44524bae92f08ae098cc50a602d8cf1273b423e14daDouglas GregorClassTemplateDecl::getInjectedClassNameSpecialization() {
4465bf1bdc2fedb0c29b5fcdb4abc852aa85b4fe26aArgyrios Kyrtzidis  Common *CommonPtr = getCommonPtr();
4477da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor  if (!CommonPtr->InjectedClassNameType.isNull())
4487da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor    return CommonPtr->InjectedClassNameType;
4497da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor
450b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor  // C++0x [temp.dep.type]p2:
451b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor  //  The template argument list of a primary template is a template argument
452b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor  //  list in which the nth template argument has the value of the nth template
453b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor  //  parameter of the class template. If the nth template parameter is a
454b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor  //  template parameter pack (14.5.3), the nth template argument is a pack
455b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor  //  expansion (14.5.3) whose pattern is the name of the template parameter
456b7d09d627c8576b9bc85f44f05befdd44fedc7edDouglas Gregor  //  pack.
45724bae92f08ae098cc50a602d8cf1273b423e14daDouglas Gregor  ASTContext &Context = getASTContext();
4587da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor  TemplateParameterList *Params = getTemplateParameters();
4595f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  SmallVector<TemplateArgument, 16> TemplateArgs;
460c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor  TemplateArgs.resize(Params->size());
461c494f77363f057dd8619fec4e885c4f80e3d1b66Douglas Gregor  GenerateInjectedTemplateArgs(getASTContext(), Params, TemplateArgs.data());
4627da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor  CommonPtr->InjectedClassNameType
4631275ae098acda31fe0e434510c729fcfed0458a1Douglas Gregor    = Context.getTemplateSpecializationType(TemplateName(this),
4644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                            TemplateArgs);
4657da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor  return CommonPtr->InjectedClassNameType;
4667da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor}
4677da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor
468aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
469aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// TemplateTypeParm Allocation/Deallocation Method Implementations
470aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
471aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
472aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorTemplateTypeParmDecl *
4734ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadTemplateTypeParmDecl::Create(const ASTContext &C, DeclContext *DC,
474344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara                             SourceLocation KeyLoc, SourceLocation NameLoc,
475344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara                             unsigned D, unsigned P, IdentifierInfo *Id,
476344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara                             bool Typename, bool ParameterPack) {
4774fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth  TemplateTypeParmDecl *TTPDecl =
478651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    new (C, DC) TemplateTypeParmDecl(DC, KeyLoc, NameLoc, Id, Typename);
4794fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth  QualType TTPType = C.getTemplateTypeParmType(D, P, ParameterPack, TTPDecl);
4806bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  TTPDecl->setTypeForDecl(TTPType.getTypePtr());
4814fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth  return TTPDecl;
482aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor}
483aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
484b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios KyrtzidisTemplateTypeParmDecl *
4851e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorTemplateTypeParmDecl::CreateDeserialized(const ASTContext &C, unsigned ID) {
4866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  return new (C, ID) TemplateTypeParmDecl(nullptr, SourceLocation(),
4876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                          SourceLocation(), nullptr, false);
488b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios Kyrtzidis}
489b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios Kyrtzidis
490833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallSourceLocation TemplateTypeParmDecl::getDefaultArgumentLoc() const {
49177d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara  return hasDefaultArgument()
492b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar             ? getDefaultArgumentInfo()->getTypeLoc().getBeginLoc()
493b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar             : SourceLocation();
49477d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara}
49577d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara
49677d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo BagnaraSourceRange TemplateTypeParmDecl::getSourceRange() const {
49777d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara  if (hasDefaultArgument() && !defaultArgumentWasInherited())
498344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara    return SourceRange(getLocStart(),
499b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar                       getDefaultArgumentInfo()->getTypeLoc().getEndLoc());
50077d4ee2bfc90b77ec8b818de985cd4aceeef757bAbramo Bagnara  else
501344577e6b58f42d18dc8118c8903b49a85dc005eAbramo Bagnara    return TypeDecl::getSourceRange();
502833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall}
503833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
504ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregorunsigned TemplateTypeParmDecl::getDepth() const {
5056bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  return getTypeForDecl()->getAs<TemplateTypeParmType>()->getDepth();
506ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor}
507ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor
508ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregorunsigned TemplateTypeParmDecl::getIndex() const {
5096bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  return getTypeForDecl()->getAs<TemplateTypeParmType>()->getIndex();
510ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor}
511ed9c0f90b7e0811c209b95e39fe07c211c531285Douglas Gregor
5124fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruthbool TemplateTypeParmDecl::isParameterPack() const {
5136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  return getTypeForDecl()->getAs<TemplateTypeParmType>()->isParameterPack();
5144fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth}
5154fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth
516aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
517aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// NonTypeTemplateParmDecl Method Implementations
518aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
519aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
5204967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarNonTypeTemplateParmDecl::NonTypeTemplateParmDecl(
5214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, unsigned D,
5224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    unsigned P, IdentifierInfo *Id, QualType T, TypeSourceInfo *TInfo,
5234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    ArrayRef<QualType> ExpandedTypes, ArrayRef<TypeSourceInfo *> ExpandedTInfos)
5244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    : DeclaratorDecl(NonTypeTemplateParm, DC, IdLoc, Id, T, TInfo, StartLoc),
5254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      TemplateParmPosition(D, P), ParameterPack(true),
5264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      ExpandedParameterPack(true), NumExpandedTypes(ExpandedTypes.size()) {
5274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  if (!ExpandedTypes.empty() && !ExpandedTInfos.empty()) {
52887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    auto TypesAndInfos =
52987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar        getTrailingObjects<std::pair<QualType, TypeSourceInfo *>>();
5306952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor    for (unsigned I = 0; I != NumExpandedTypes; ++I) {
53187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      new (&TypesAndInfos[I].first) QualType(ExpandedTypes[I]);
53287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      TypesAndInfos[I].second = ExpandedTInfos[I];
5336952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor    }
5346952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor  }
5356952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor}
5366952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor
537aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorNonTypeTemplateParmDecl *
5384ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadNonTypeTemplateParmDecl::Create(const ASTContext &C, DeclContext *DC,
539ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara                                SourceLocation StartLoc, SourceLocation IdLoc,
540ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara                                unsigned D, unsigned P, IdentifierInfo *Id,
541ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara                                QualType T, bool ParameterPack,
542ff676cb48fe8bf7be2feaa251dc7c5fb15af4730Abramo Bagnara                                TypeSourceInfo *TInfo) {
543651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return new (C, DC) NonTypeTemplateParmDecl(DC, StartLoc, IdLoc, D, P, Id,
544651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                             T, ParameterPack, TInfo);
545aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor}
546aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
5474967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarNonTypeTemplateParmDecl *NonTypeTemplateParmDecl::Create(
5484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    const ASTContext &C, DeclContext *DC, SourceLocation StartLoc,
5494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    SourceLocation IdLoc, unsigned D, unsigned P, IdentifierInfo *Id,
5504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    QualType T, TypeSourceInfo *TInfo, ArrayRef<QualType> ExpandedTypes,
5514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    ArrayRef<TypeSourceInfo *> ExpandedTInfos) {
55287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return new (C, DC,
55387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar              additionalSizeToAlloc<std::pair<QualType, TypeSourceInfo *>>(
5544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                  ExpandedTypes.size()))
55587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      NonTypeTemplateParmDecl(DC, StartLoc, IdLoc, D, P, Id, T, TInfo,
5564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                              ExpandedTypes, ExpandedTInfos);
5576952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor}
5586952f1e4256c5b43aee5e98cea4e9b663bd1d413Douglas Gregor
5591e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorNonTypeTemplateParmDecl *
5601e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorNonTypeTemplateParmDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
5616bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  return new (C, ID) NonTypeTemplateParmDecl(nullptr, SourceLocation(),
5626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                             SourceLocation(), 0, 0, nullptr,
5636bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                             QualType(), false, nullptr);
5641e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor}
5651e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor
5661e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorNonTypeTemplateParmDecl *
5671e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorNonTypeTemplateParmDecl::CreateDeserialized(ASTContext &C, unsigned ID,
5681e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor                                            unsigned NumExpandedTypes) {
5694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  auto *NTTP =
5704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      new (C, ID, additionalSizeToAlloc<std::pair<QualType, TypeSourceInfo *>>(
5714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                      NumExpandedTypes))
5724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar          NonTypeTemplateParmDecl(nullptr, SourceLocation(), SourceLocation(),
5734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                  0, 0, nullptr, QualType(), nullptr, None,
5744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                  None);
5754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  NTTP->NumExpandedTypes = NumExpandedTypes;
5764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  return NTTP;
5771e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor}
5781e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor
57976a40219ee5624d78aba167dce02bdbaa930955fJohn McCallSourceRange NonTypeTemplateParmDecl::getSourceRange() const {
580ee4bfd412db491c489fc2ee74916edd73f9c618aAbramo Bagnara  if (hasDefaultArgument() && !defaultArgumentWasInherited())
581a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara    return SourceRange(getOuterLocStart(),
582a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara                       getDefaultArgument()->getSourceRange().getEnd());
583a2026c96d3935e7909e049ad9096762844544ed6Abramo Bagnara  return DeclaratorDecl::getSourceRange();
58476a40219ee5624d78aba167dce02bdbaa930955fJohn McCall}
58576a40219ee5624d78aba167dce02bdbaa930955fJohn McCall
586d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas GregorSourceLocation NonTypeTemplateParmDecl::getDefaultArgumentLoc() const {
587d92f7a297c0ed3f7d0ebcbb557e1d4c1925b8c72Abramo Bagnara  return hasDefaultArgument()
588d92f7a297c0ed3f7d0ebcbb557e1d4c1925b8c72Abramo Bagnara    ? getDefaultArgument()->getSourceRange().getBegin()
589d92f7a297c0ed3f7d0ebcbb557e1d4c1925b8c72Abramo Bagnara    : SourceLocation();
590d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas Gregor}
591d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas Gregor
592aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
593aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// TemplateTemplateParmDecl Method Implementations
594aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===//
595aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
59699ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid TemplateTemplateParmDecl::anchor() { }
59799ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie
5986964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard SmithTemplateTemplateParmDecl::TemplateTemplateParmDecl(
5996964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith    DeclContext *DC, SourceLocation L, unsigned D, unsigned P,
6006964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith    IdentifierInfo *Id, TemplateParameterList *Params,
6014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    ArrayRef<TemplateParameterList *> Expansions)
6024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    : TemplateDecl(TemplateTemplateParm, DC, L, Id, Params),
6034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      TemplateParmPosition(D, P), ParameterPack(true),
6044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      ExpandedParameterPack(true), NumExpandedParams(Expansions.size()) {
6054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  if (!Expansions.empty())
6064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    std::uninitialized_copy(Expansions.begin(), Expansions.end(),
60787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                            getTrailingObjects<TemplateParameterList *>());
6086964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith}
6096964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith
610aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorTemplateTemplateParmDecl *
6114ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadTemplateTemplateParmDecl::Create(const ASTContext &C, DeclContext *DC,
612aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                 SourceLocation L, unsigned D, unsigned P,
61361c4d28e36cd3f1be392cb77f07436d1fa6b0f9fDouglas Gregor                                 bool ParameterPack, IdentifierInfo *Id,
614aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor                                 TemplateParameterList *Params) {
615651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return new (C, DC) TemplateTemplateParmDecl(DC, L, D, P, ParameterPack, Id,
616651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                              Params);
617aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor}
618aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor
6191e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorTemplateTemplateParmDecl *
6206964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard SmithTemplateTemplateParmDecl::Create(const ASTContext &C, DeclContext *DC,
6216964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith                                 SourceLocation L, unsigned D, unsigned P,
6226964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith                                 IdentifierInfo *Id,
6236964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith                                 TemplateParameterList *Params,
624cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko                                 ArrayRef<TemplateParameterList *> Expansions) {
62587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return new (C, DC,
62687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar              additionalSizeToAlloc<TemplateParameterList *>(Expansions.size()))
6274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      TemplateTemplateParmDecl(DC, L, D, P, Id, Params, Expansions);
6286964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith}
6296964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith
6306964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard SmithTemplateTemplateParmDecl *
6311e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorTemplateTemplateParmDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
6326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  return new (C, ID) TemplateTemplateParmDecl(nullptr, SourceLocation(), 0, 0,
6336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                              false, nullptr, nullptr);
6341e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor}
6351e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor
6366964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard SmithTemplateTemplateParmDecl *
6376964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard SmithTemplateTemplateParmDecl::CreateDeserialized(ASTContext &C, unsigned ID,
6386964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith                                             unsigned NumExpansions) {
6394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  auto *TTP =
6404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      new (C, ID, additionalSizeToAlloc<TemplateParameterList *>(NumExpansions))
6414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar          TemplateTemplateParmDecl(nullptr, SourceLocation(), 0, 0, nullptr,
6424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                   nullptr, None);
6434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  TTP->NumExpandedParams = NumExpansions;
6444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  return TTP;
6456964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith}
6466964b3f80ce1ba489e7e25e7cd58062699af9b0cRichard Smith
64787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga NainarSourceLocation TemplateTemplateParmDecl::getDefaultArgumentLoc() const {
64887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return hasDefaultArgument() ? getDefaultArgument().getLocation()
64987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                              : SourceLocation();
65087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
65187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
652b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarvoid TemplateTemplateParmDecl::setDefaultArgument(
653b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar    const ASTContext &C, const TemplateArgumentLoc &DefArg) {
654b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  if (DefArg.getArgument().isNull())
655b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar    DefaultArgument.set(nullptr);
656b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  else
657b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar    DefaultArgument.set(new (C) TemplateArgumentLoc(DefArg));
658b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar}
659b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar
6603e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor//===----------------------------------------------------------------------===//
6617e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor// TemplateArgumentList Implementation
6627e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor//===----------------------------------------------------------------------===//
6634967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTemplateArgumentList::TemplateArgumentList(ArrayRef<TemplateArgument> Args)
6644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    : Arguments(getTrailingObjects<TemplateArgument>()),
6654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      NumArguments(Args.size()) {
6664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::uninitialized_copy(Args.begin(), Args.end(),
66787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                          getTrailingObjects<TemplateArgument>());
66887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
66987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
670910f8008fea79120489a53593fe971b0b8a4a740Douglas GregorTemplateArgumentList *
671910f8008fea79120489a53593fe971b0b8a4a740Douglas GregorTemplateArgumentList::CreateCopy(ASTContext &Context,
6724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                 ArrayRef<TemplateArgument> Args) {
6734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  void *Mem = Context.Allocate(totalSizeToAlloc<TemplateArgument>(Args.size()));
6744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  return new (Mem) TemplateArgumentList(Args);
67594d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis}
67694d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis
67771a7605977113c795edd44fcbd2302ad49506653Argyrios KyrtzidisFunctionTemplateSpecializationInfo *
67871a7605977113c795edd44fcbd2302ad49506653Argyrios KyrtzidisFunctionTemplateSpecializationInfo::Create(ASTContext &C, FunctionDecl *FD,
67971a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis                                           FunctionTemplateDecl *Template,
68071a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis                                           TemplateSpecializationKind TSK,
68171a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis                                       const TemplateArgumentList *TemplateArgs,
68271a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis                          const TemplateArgumentListInfo *TemplateArgsAsWritten,
68371a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis                                           SourceLocation POI) {
6846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  const ASTTemplateArgumentListInfo *ArgsAsWritten = nullptr;
68571a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis  if (TemplateArgsAsWritten)
68671a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis    ArgsAsWritten = ASTTemplateArgumentListInfo::Create(C,
68771a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis                                                        *TemplateArgsAsWritten);
68871a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis
68971a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis  return new (C) FunctionTemplateSpecializationInfo(FD, Template, TSK,
69071a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis                                                    TemplateArgs,
69171a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis                                                    ArgsAsWritten,
69271a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis                                                    POI);
69371a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis}
69471a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis
6957e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor//===----------------------------------------------------------------------===//
69699ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie// TemplateDecl Implementation
69799ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie//===----------------------------------------------------------------------===//
69899ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie
69999ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid TemplateDecl::anchor() { }
70099ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie
70199ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie//===----------------------------------------------------------------------===//
7023e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor// ClassTemplateSpecializationDecl Implementation
7033e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor//===----------------------------------------------------------------------===//
7043e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas GregorClassTemplateSpecializationDecl::
70513c8577201e4fc0ddac5f09d05fd1778832137d1Douglas GregorClassTemplateSpecializationDecl(ASTContext &Context, Kind DK, TagKind TK,
706ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara                                DeclContext *DC, SourceLocation StartLoc,
707ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara                                SourceLocation IdLoc,
7083e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor                                ClassTemplateDecl *SpecializedTemplate,
7094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                ArrayRef<TemplateArgument> Args,
7108e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor                                ClassTemplateSpecializationDecl *PrevDecl)
7116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  : CXXRecordDecl(DK, TK, Context, DC, StartLoc, IdLoc,
7128e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor                  SpecializedTemplate->getIdentifier(),
7138e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor                  PrevDecl),
7143e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor    SpecializedTemplate(SpecializedTemplate),
7156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    ExplicitInfo(nullptr),
7164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    TemplateArgs(TemplateArgumentList::CreateCopy(Context, Args)),
7177e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor    SpecializationKind(TSK_Undeclared) {
7183e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor}
7191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesClassTemplateSpecializationDecl::ClassTemplateSpecializationDecl(ASTContext &C,
7216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                                                 Kind DK)
7226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    : CXXRecordDecl(DK, TTK_Struct, C, nullptr, SourceLocation(),
7236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                    SourceLocation(), nullptr, nullptr),
7246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      ExplicitInfo(nullptr), SpecializationKind(TSK_Undeclared) {}
72594d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis
7263e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas GregorClassTemplateSpecializationDecl *
72713c8577201e4fc0ddac5f09d05fd1778832137d1Douglas GregorClassTemplateSpecializationDecl::Create(ASTContext &Context, TagKind TK,
728ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara                                        DeclContext *DC,
729ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara                                        SourceLocation StartLoc,
730ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara                                        SourceLocation IdLoc,
7313e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor                                        ClassTemplateDecl *SpecializedTemplate,
7324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                        ArrayRef<TemplateArgument> Args,
733cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor                                   ClassTemplateSpecializationDecl *PrevDecl) {
734651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  ClassTemplateSpecializationDecl *Result =
735651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      new (Context, DC) ClassTemplateSpecializationDecl(
736651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines          Context, ClassTemplateSpecialization, TK, DC, StartLoc, IdLoc,
7374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar          SpecializedTemplate, Args, PrevDecl);
7386bd992946bda92193fadce7e4890d4465d2702f4Douglas Gregor  Result->MayHaveOutOfDateDef = false;
7396bd992946bda92193fadce7e4890d4465d2702f4Douglas Gregor
740cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor  Context.getTypeDeclType(Result, PrevDecl);
741cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor  return Result;
7423e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor}
743c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor
74494d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios KyrtzidisClassTemplateSpecializationDecl *
745651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesClassTemplateSpecializationDecl::CreateDeserialized(ASTContext &C,
7461e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor                                                    unsigned ID) {
7476bd992946bda92193fadce7e4890d4465d2702f4Douglas Gregor  ClassTemplateSpecializationDecl *Result =
7486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    new (C, ID) ClassTemplateSpecializationDecl(C, ClassTemplateSpecialization);
7496bd992946bda92193fadce7e4890d4465d2702f4Douglas Gregor  Result->MayHaveOutOfDateDef = false;
7506bd992946bda92193fadce7e4890d4465d2702f4Douglas Gregor  return Result;
75194d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis}
75294d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis
7535eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramervoid ClassTemplateSpecializationDecl::getNameForDiagnostic(
7545eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer    raw_ostream &OS, const PrintingPolicy &Policy, bool Qualified) const {
7555eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer  NamedDecl::getNameForDiagnostic(OS, Policy, Qualified);
756da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor
757da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor  const TemplateArgumentList &TemplateArgs = getTemplateArgs();
7585eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer  TemplateSpecializationType::PrintTemplateArgumentList(
7594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      OS, TemplateArgs.asArray(), Policy);
760da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor}
761da2142f2e2b3a02ee6eb5de9f9e6ed6f7eb5a0c0Douglas Gregor
76237d93e9252026d4fb836d9c05d0122a2d46e56beDouglas GregorClassTemplateDecl *
7631eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpClassTemplateSpecializationDecl::getSpecializedTemplate() const {
7641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (SpecializedPartialSpecialization *PartialSpec
76537d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor      = SpecializedTemplate.dyn_cast<SpecializedPartialSpecialization*>())
76637d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor    return PartialSpec->PartialSpecialization->getSpecializedTemplate();
76737d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor  return SpecializedTemplate.get<ClassTemplateDecl*>();
76837d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor}
76937d93e9252026d4fb836d9c05d0122a2d46e56beDouglas Gregor
7704a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo BagnaraSourceRange
7714a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo BagnaraClassTemplateSpecializationDecl::getSourceRange() const {
77209d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara  if (ExplicitInfo) {
773b2e80013dbf316f83716a9d9cdc9a6ed5a5a8e2aAbramo Bagnara    SourceLocation Begin = getTemplateKeywordLoc();
774b2e80013dbf316f83716a9d9cdc9a6ed5a5a8e2aAbramo Bagnara    if (Begin.isValid()) {
775b2e80013dbf316f83716a9d9cdc9a6ed5a5a8e2aAbramo Bagnara      // Here we have an explicit (partial) specialization or instantiation.
776b2e80013dbf316f83716a9d9cdc9a6ed5a5a8e2aAbramo Bagnara      assert(getSpecializationKind() == TSK_ExplicitSpecialization ||
777b2e80013dbf316f83716a9d9cdc9a6ed5a5a8e2aAbramo Bagnara             getSpecializationKind() == TSK_ExplicitInstantiationDeclaration ||
778b2e80013dbf316f83716a9d9cdc9a6ed5a5a8e2aAbramo Bagnara             getSpecializationKind() == TSK_ExplicitInstantiationDefinition);
779b2e80013dbf316f83716a9d9cdc9a6ed5a5a8e2aAbramo Bagnara      if (getExternLoc().isValid())
780b2e80013dbf316f83716a9d9cdc9a6ed5a5a8e2aAbramo Bagnara        Begin = getExternLoc();
781b2e80013dbf316f83716a9d9cdc9a6ed5a5a8e2aAbramo Bagnara      SourceLocation End = getRBraceLoc();
782b2e80013dbf316f83716a9d9cdc9a6ed5a5a8e2aAbramo Bagnara      if (End.isInvalid())
783b2e80013dbf316f83716a9d9cdc9a6ed5a5a8e2aAbramo Bagnara        End = getTypeAsWritten()->getTypeLoc().getEndLoc();
784b2e80013dbf316f83716a9d9cdc9a6ed5a5a8e2aAbramo Bagnara      return SourceRange(Begin, End);
785b2e80013dbf316f83716a9d9cdc9a6ed5a5a8e2aAbramo Bagnara    }
786b2e80013dbf316f83716a9d9cdc9a6ed5a5a8e2aAbramo Bagnara    // An implicit instantiation of a class template partial specialization
787b2e80013dbf316f83716a9d9cdc9a6ed5a5a8e2aAbramo Bagnara    // uses ExplicitInfo to record the TypeAsWritten, but the source
788b2e80013dbf316f83716a9d9cdc9a6ed5a5a8e2aAbramo Bagnara    // locations should be retrieved from the instantiation pattern.
789b2e80013dbf316f83716a9d9cdc9a6ed5a5a8e2aAbramo Bagnara    typedef ClassTemplatePartialSpecializationDecl CTPSDecl;
790b2e80013dbf316f83716a9d9cdc9a6ed5a5a8e2aAbramo Bagnara    CTPSDecl *ctpsd = const_cast<CTPSDecl*>(cast<CTPSDecl>(this));
791b2e80013dbf316f83716a9d9cdc9a6ed5a5a8e2aAbramo Bagnara    CTPSDecl *inst_from = ctpsd->getInstantiatedFromMember();
7926bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    assert(inst_from != nullptr);
793b2e80013dbf316f83716a9d9cdc9a6ed5a5a8e2aAbramo Bagnara    return inst_from->getSourceRange();
79409d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara  }
79509d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara  else {
79609d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara    // No explicit info available.
79709d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara    llvm::PointerUnion<ClassTemplateDecl *,
79809d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara                       ClassTemplatePartialSpecializationDecl *>
79909d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara      inst_from = getInstantiatedFrom();
80009d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara    if (inst_from.isNull())
80109d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara      return getSpecializedTemplate()->getSourceRange();
80209d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara    if (ClassTemplateDecl *ctd = inst_from.dyn_cast<ClassTemplateDecl*>())
80309d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara      return ctd->getSourceRange();
80409d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara    return inst_from.get<ClassTemplatePartialSpecializationDecl*>()
80509d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara      ->getSourceRange();
80609d8212989c64abad4b745f37f56ca77b44de537Abramo Bagnara  }
8074a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo Bagnara}
8084a85a73466bfb541cd9c7b57a99292a0b6900b9bAbramo Bagnara
809c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor//===----------------------------------------------------------------------===//
810c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor// ClassTemplatePartialSpecializationDecl Implementation
811c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor//===----------------------------------------------------------------------===//
81299ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid ClassTemplatePartialSpecializationDecl::anchor() { }
81399ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie
8149a299e0575ce235f491014627c7267e2d2cd73deDouglas GregorClassTemplatePartialSpecializationDecl::
8159a299e0575ce235f491014627c7267e2d2cd73deDouglas GregorClassTemplatePartialSpecializationDecl(ASTContext &Context, TagKind TK,
816ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara                                       DeclContext *DC,
817ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara                                       SourceLocation StartLoc,
818ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara                                       SourceLocation IdLoc,
8199a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor                                       TemplateParameterList *Params,
8209a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor                                       ClassTemplateDecl *SpecializedTemplate,
8214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                       ArrayRef<TemplateArgument> Args,
822c1cef0892e049fcd31084f02d1efdd9985d4dfa4Enea Zaffanella                               const ASTTemplateArgumentListInfo *ArgInfos,
82337fd27dbb941d27f4bd7412e534e7e5089d6781bRichard Smith                               ClassTemplatePartialSpecializationDecl *PrevDecl)
8249a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor  : ClassTemplateSpecializationDecl(Context,
8259a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor                                    ClassTemplatePartialSpecialization,
826ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara                                    TK, DC, StartLoc, IdLoc,
827ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara                                    SpecializedTemplate,
8284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                    Args, PrevDecl),
8299a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor    TemplateParams(Params), ArgsAsWritten(ArgInfos),
8306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    InstantiatedFromMember(nullptr, false)
831c1cef0892e049fcd31084f02d1efdd9985d4dfa4Enea Zaffanella{
832787a40db5d7b92f6f6713dbe48e9b015fde407b0Douglas Gregor  AdoptTemplateParameterList(Params, this);
8339a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor}
8349a299e0575ce235f491014627c7267e2d2cd73deDouglas Gregor
835c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas GregorClassTemplatePartialSpecializationDecl *
836c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas GregorClassTemplatePartialSpecializationDecl::
837ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo BagnaraCreate(ASTContext &Context, TagKind TK,DeclContext *DC,
838ba877adeb49ed6dc17f27fa3a3bcd0cca713fd68Abramo Bagnara       SourceLocation StartLoc, SourceLocation IdLoc,
839c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor       TemplateParameterList *Params,
840c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor       ClassTemplateDecl *SpecializedTemplate,
8414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar       ArrayRef<TemplateArgument> Args,
842d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall       const TemplateArgumentListInfo &ArgInfos,
8433cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall       QualType CanonInjectedType,
84437fd27dbb941d27f4bd7412e534e7e5089d6781bRichard Smith       ClassTemplatePartialSpecializationDecl *PrevDecl) {
845c1cef0892e049fcd31084f02d1efdd9985d4dfa4Enea Zaffanella  const ASTTemplateArgumentListInfo *ASTArgInfos =
846c1cef0892e049fcd31084f02d1efdd9985d4dfa4Enea Zaffanella    ASTTemplateArgumentListInfo::Create(Context, ArgInfos);
847833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
848651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  ClassTemplatePartialSpecializationDecl *Result = new (Context, DC)
849651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      ClassTemplatePartialSpecializationDecl(Context, TK, DC, StartLoc, IdLoc,
850651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                             Params, SpecializedTemplate, Args,
8514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                             ASTArgInfos, PrevDecl);
852c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor  Result->setSpecializationKind(TSK_ExplicitSpecialization);
8536bd992946bda92193fadce7e4890d4465d2702f4Douglas Gregor  Result->MayHaveOutOfDateDef = false;
8543cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall
8553cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall  Context.getInjectedClassNameType(Result, CanonInjectedType);
856c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor  return Result;
857c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor}
858dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall
85994d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios KyrtzidisClassTemplatePartialSpecializationDecl *
8601e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorClassTemplatePartialSpecializationDecl::CreateDeserialized(ASTContext &C,
8611e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor                                                           unsigned ID) {
862651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  ClassTemplatePartialSpecializationDecl *Result =
8636bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      new (C, ID) ClassTemplatePartialSpecializationDecl(C);
8646bd992946bda92193fadce7e4890d4465d2702f4Douglas Gregor  Result->MayHaveOutOfDateDef = false;
8656bd992946bda92193fadce7e4890d4465d2702f4Douglas Gregor  return Result;
86694d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis}
86794d228d3454a3f6436526d15b2ad7fc90246fe54Argyrios Kyrtzidis
868dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall//===----------------------------------------------------------------------===//
869dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall// FriendTemplateDecl Implementation
870dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall//===----------------------------------------------------------------------===//
871dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall
87299ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid FriendTemplateDecl::anchor() { }
87399ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie
8744967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarFriendTemplateDecl *
8754967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarFriendTemplateDecl::Create(ASTContext &Context, DeclContext *DC,
8764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                           SourceLocation L,
8774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                           MutableArrayRef<TemplateParameterList *> Params,
8784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                           FriendUnion Friend, SourceLocation FLoc) {
8794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  return new (Context, DC) FriendTemplateDecl(DC, L, Params, Friend, FLoc);
880dd4a3b0065b9a7e7b00073df415a798886c090f3John McCall}
881554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis
8821e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorFriendTemplateDecl *FriendTemplateDecl::CreateDeserialized(ASTContext &C,
8831e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor                                                           unsigned ID) {
884651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return new (C, ID) FriendTemplateDecl(EmptyShell());
885554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis}
8863e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith
8873e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith//===----------------------------------------------------------------------===//
8883e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith// TypeAliasTemplateDecl Implementation
8893e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith//===----------------------------------------------------------------------===//
8903e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith
8913e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard SmithTypeAliasTemplateDecl *TypeAliasTemplateDecl::Create(ASTContext &C,
8923e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith                                                     DeclContext *DC,
8933e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith                                                     SourceLocation L,
8943e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith                                                     DeclarationName Name,
8953e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith                                                  TemplateParameterList *Params,
8963e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith                                                     NamedDecl *Decl) {
8973e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith  AdoptTemplateParameterList(Params, DC);
8986bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  return new (C, DC) TypeAliasTemplateDecl(C, DC, L, Name, Params, Decl);
8993e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith}
9003e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith
9011e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorTypeAliasTemplateDecl *TypeAliasTemplateDecl::CreateDeserialized(ASTContext &C,
9021e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor                                                                 unsigned ID) {
9036bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  return new (C, ID) TypeAliasTemplateDecl(C, nullptr, SourceLocation(),
9046bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                           DeclarationName(), nullptr, nullptr);
9053e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith}
9063e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith
9073e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smithvoid TypeAliasTemplateDecl::DeallocateCommon(void *Ptr) {
9083e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith  static_cast<Common *>(Ptr)->~Common();
9093e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith}
9103e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard SmithRedeclarableTemplateDecl::CommonBase *
911b76d9718caea48b9333979b3da6f3a80110840cbDmitri GribenkoTypeAliasTemplateDecl::newCommon(ASTContext &C) const {
9123e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith  Common *CommonPtr = new (C) Common;
9133e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith  C.AddDeallocation(DeallocateCommon, CommonPtr);
9143e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith  return CommonPtr;
9153e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith}
9163e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith
91799ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie//===----------------------------------------------------------------------===//
91899ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie// ClassScopeFunctionSpecializationDecl Implementation
91999ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie//===----------------------------------------------------------------------===//
92099ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie
92199ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid ClassScopeFunctionSpecializationDecl::anchor() { }
9221e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor
9231e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorClassScopeFunctionSpecializationDecl *
9241e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas GregorClassScopeFunctionSpecializationDecl::CreateDeserialized(ASTContext &C,
9251e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor                                                         unsigned ID) {
926651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return new (C, ID) ClassScopeFunctionSpecializationDecl(
9276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      nullptr, SourceLocation(), nullptr, false, TemplateArgumentListInfo());
9281e68ecc4fcce12f683c4fd38acfd1a004001b04fDouglas Gregor}
929ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
930ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo//===----------------------------------------------------------------------===//
931ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo// VarTemplateDecl Implementation
932ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo//===----------------------------------------------------------------------===//
933ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
934ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufovoid VarTemplateDecl::DeallocateCommon(void *Ptr) {
935ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  static_cast<Common *>(Ptr)->~Common();
936ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo}
937ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
938439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse VoufoVarTemplateDecl *VarTemplateDecl::getDefinition() {
939439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo  VarTemplateDecl *CurD = this;
940439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo  while (CurD) {
941439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo    if (CurD->isThisDeclarationADefinition())
942439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo      return CurD;
943439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo    CurD = CurD->getPreviousDecl();
944439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo  }
9456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  return nullptr;
946439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo}
947439d665f4d1066ee5ebd8dd0938d85be83d490c4Larisse Voufo
948ef4579cda09b73e3d4d98af48201da25adc29326Larisse VoufoVarTemplateDecl *VarTemplateDecl::Create(ASTContext &C, DeclContext *DC,
949ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo                                         SourceLocation L, DeclarationName Name,
950ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo                                         TemplateParameterList *Params,
951651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                         VarDecl *Decl) {
9526bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  return new (C, DC) VarTemplateDecl(C, DC, L, Name, Params, Decl);
953ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo}
954ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
955ef4579cda09b73e3d4d98af48201da25adc29326Larisse VoufoVarTemplateDecl *VarTemplateDecl::CreateDeserialized(ASTContext &C,
956ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo                                                     unsigned ID) {
9576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  return new (C, ID) VarTemplateDecl(C, nullptr, SourceLocation(),
9586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                     DeclarationName(), nullptr, nullptr);
959ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo}
960ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
961651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// TODO: Unify across class, function and variable templates?
9628d2a5ea694ed0002b45deb2bd35db451b16a07d6Larisse Voufo//       May require moving this and Common to RedeclarableTemplateDecl.
963ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufovoid VarTemplateDecl::LoadLazySpecializations() const {
9640e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  // Grab the most recent declaration to ensure we've loaded any lazy
9650e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  // redeclarations of this template.
9660e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  //
9670e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  // FIXME: Avoid walking the entire redeclaration chain here.
9680e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  Common *CommonPtr = getMostRecentDecl()->getCommonPtr();
969ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  if (CommonPtr->LazySpecializations) {
970ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    ASTContext &Context = getASTContext();
971ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    uint32_t *Specs = CommonPtr->LazySpecializations;
9726bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    CommonPtr->LazySpecializations = nullptr;
973ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    for (uint32_t I = 0, N = *Specs++; I != N; ++I)
974ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo      (void)Context.getExternalSource()->GetExternalDecl(Specs[I]);
975ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  }
976ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo}
977ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
978ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufollvm::FoldingSetVector<VarTemplateSpecializationDecl> &
979ef4579cda09b73e3d4d98af48201da25adc29326Larisse VoufoVarTemplateDecl::getSpecializations() const {
980ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  LoadLazySpecializations();
981ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  return getCommonPtr()->Specializations;
982ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo}
983ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
984ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufollvm::FoldingSetVector<VarTemplatePartialSpecializationDecl> &
985ef4579cda09b73e3d4d98af48201da25adc29326Larisse VoufoVarTemplateDecl::getPartialSpecializations() {
986ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  LoadLazySpecializations();
987ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  return getCommonPtr()->PartialSpecializations;
988ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo}
989ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
990ef4579cda09b73e3d4d98af48201da25adc29326Larisse VoufoRedeclarableTemplateDecl::CommonBase *
991ef4579cda09b73e3d4d98af48201da25adc29326Larisse VoufoVarTemplateDecl::newCommon(ASTContext &C) const {
992ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  Common *CommonPtr = new (C) Common;
993ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  C.AddDeallocation(DeallocateCommon, CommonPtr);
994ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  return CommonPtr;
995ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo}
996ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
997ef4579cda09b73e3d4d98af48201da25adc29326Larisse VoufoVarTemplateSpecializationDecl *
998c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen HinesVarTemplateDecl::findSpecialization(ArrayRef<TemplateArgument> Args,
999c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines                                    void *&InsertPos) {
1000c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  return findSpecializationImpl(getSpecializations(), Args, InsertPos);
1001ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo}
1002ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
1003ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufovoid VarTemplateDecl::AddSpecialization(VarTemplateSpecializationDecl *D,
1004ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo                                        void *InsertPos) {
10050e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  addSpecializationImpl<VarTemplateDecl>(getSpecializations(), D, InsertPos);
1006ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo}
1007ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
1008ef4579cda09b73e3d4d98af48201da25adc29326Larisse VoufoVarTemplatePartialSpecializationDecl *
1009c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen HinesVarTemplateDecl::findPartialSpecialization(ArrayRef<TemplateArgument> Args,
1010c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines                                           void *&InsertPos) {
1011c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  return findSpecializationImpl(getPartialSpecializations(), Args, InsertPos);
1012ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo}
1013ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
1014ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufovoid VarTemplateDecl::AddPartialSpecialization(
1015ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    VarTemplatePartialSpecializationDecl *D, void *InsertPos) {
1016ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  if (InsertPos)
1017ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    getPartialSpecializations().InsertNode(D, InsertPos);
1018ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  else {
1019ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    VarTemplatePartialSpecializationDecl *Existing =
1020ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo        getPartialSpecializations().GetOrInsertNode(D);
1021ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    (void)Existing;
1022ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    assert(Existing->isCanonicalDecl() && "Non-canonical specialization?");
1023ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  }
1024ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
1025ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  if (ASTMutationListener *L = getASTMutationListener())
1026ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    L->AddedCXXTemplateSpecialization(this, D);
1027ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo}
1028ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
1029ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufovoid VarTemplateDecl::getPartialSpecializations(
1030ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    SmallVectorImpl<VarTemplatePartialSpecializationDecl *> &PS) {
1031ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  llvm::FoldingSetVector<VarTemplatePartialSpecializationDecl> &PartialSpecs =
1032ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo      getPartialSpecializations();
1033ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  PS.clear();
103437fd27dbb941d27f4bd7412e534e7e5089d6781bRichard Smith  PS.reserve(PartialSpecs.size());
10354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (VarTemplatePartialSpecializationDecl &P : PartialSpecs)
10364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    PS.push_back(P.getMostRecentDecl());
1037ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo}
1038ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
1039ef4579cda09b73e3d4d98af48201da25adc29326Larisse VoufoVarTemplatePartialSpecializationDecl *
1040ef4579cda09b73e3d4d98af48201da25adc29326Larisse VoufoVarTemplateDecl::findPartialSpecInstantiatedFromMember(
1041ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    VarTemplatePartialSpecializationDecl *D) {
1042ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  Decl *DCanon = D->getCanonicalDecl();
10434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (VarTemplatePartialSpecializationDecl &P : getPartialSpecializations()) {
10444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    if (P.getInstantiatedFromMember()->getCanonicalDecl() == DCanon)
10454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      return P.getMostRecentDecl();
1046ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  }
1047ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
10486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  return nullptr;
1049ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo}
1050ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
1051ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo//===----------------------------------------------------------------------===//
1052ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo// VarTemplateSpecializationDecl Implementation
1053ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo//===----------------------------------------------------------------------===//
1054ef4579cda09b73e3d4d98af48201da25adc29326Larisse VoufoVarTemplateSpecializationDecl::VarTemplateSpecializationDecl(
10556bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    Kind DK, ASTContext &Context, DeclContext *DC, SourceLocation StartLoc,
1056ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    SourceLocation IdLoc, VarTemplateDecl *SpecializedTemplate, QualType T,
10574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    TypeSourceInfo *TInfo, StorageClass S, ArrayRef<TemplateArgument> Args)
10586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    : VarDecl(DK, Context, DC, StartLoc, IdLoc,
10596bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines              SpecializedTemplate->getIdentifier(), T, TInfo, S),
10606bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      SpecializedTemplate(SpecializedTemplate), ExplicitInfo(nullptr),
10614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      TemplateArgs(TemplateArgumentList::CreateCopy(Context, Args)),
1062ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo      SpecializationKind(TSK_Undeclared) {}
1063ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
10646bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesVarTemplateSpecializationDecl::VarTemplateSpecializationDecl(Kind DK,
10656bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                                             ASTContext &C)
10666bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    : VarDecl(DK, C, nullptr, SourceLocation(), SourceLocation(), nullptr,
10676bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines              QualType(), nullptr, SC_None),
10686bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      ExplicitInfo(nullptr), SpecializationKind(TSK_Undeclared) {}
1069ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
1070ef4579cda09b73e3d4d98af48201da25adc29326Larisse VoufoVarTemplateSpecializationDecl *VarTemplateSpecializationDecl::Create(
1071ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    ASTContext &Context, DeclContext *DC, SourceLocation StartLoc,
1072ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    SourceLocation IdLoc, VarTemplateDecl *SpecializedTemplate, QualType T,
10734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    TypeSourceInfo *TInfo, StorageClass S, ArrayRef<TemplateArgument> Args) {
1074651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return new (Context, DC) VarTemplateSpecializationDecl(
10756bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      VarTemplateSpecialization, Context, DC, StartLoc, IdLoc,
10764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      SpecializedTemplate, T, TInfo, S, Args);
1077ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo}
1078ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
1079ef4579cda09b73e3d4d98af48201da25adc29326Larisse VoufoVarTemplateSpecializationDecl *
1080ef4579cda09b73e3d4d98af48201da25adc29326Larisse VoufoVarTemplateSpecializationDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
10816bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  return new (C, ID)
10826bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      VarTemplateSpecializationDecl(VarTemplateSpecialization, C);
1083ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo}
1084ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
1085ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufovoid VarTemplateSpecializationDecl::getNameForDiagnostic(
1086ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    raw_ostream &OS, const PrintingPolicy &Policy, bool Qualified) const {
1087ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  NamedDecl::getNameForDiagnostic(OS, Policy, Qualified);
1088ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
1089ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  const TemplateArgumentList &TemplateArgs = getTemplateArgs();
1090ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  TemplateSpecializationType::PrintTemplateArgumentList(
10914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      OS, TemplateArgs.asArray(), Policy);
1092ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo}
1093ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
1094ef4579cda09b73e3d4d98af48201da25adc29326Larisse VoufoVarTemplateDecl *VarTemplateSpecializationDecl::getSpecializedTemplate() const {
1095ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  if (SpecializedPartialSpecialization *PartialSpec =
1096ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo          SpecializedTemplate.dyn_cast<SpecializedPartialSpecialization *>())
1097ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    return PartialSpec->PartialSpecialization->getSpecializedTemplate();
1098ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  return SpecializedTemplate.get<VarTemplateDecl *>();
1099ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo}
1100ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
1101ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufovoid VarTemplateSpecializationDecl::setTemplateArgsInfo(
1102ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    const TemplateArgumentListInfo &ArgsInfo) {
1103ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  TemplateArgsInfo.setLAngleLoc(ArgsInfo.getLAngleLoc());
1104ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  TemplateArgsInfo.setRAngleLoc(ArgsInfo.getRAngleLoc());
11054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  for (const TemplateArgumentLoc &Loc : ArgsInfo.arguments())
11064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    TemplateArgsInfo.addArgument(Loc);
1107ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo}
1108ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
1109ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo//===----------------------------------------------------------------------===//
1110ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo// VarTemplatePartialSpecializationDecl Implementation
1111ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo//===----------------------------------------------------------------------===//
1112ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufovoid VarTemplatePartialSpecializationDecl::anchor() {}
1113ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
1114ef4579cda09b73e3d4d98af48201da25adc29326Larisse VoufoVarTemplatePartialSpecializationDecl::VarTemplatePartialSpecializationDecl(
1115ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    ASTContext &Context, DeclContext *DC, SourceLocation StartLoc,
1116ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    SourceLocation IdLoc, TemplateParameterList *Params,
1117ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    VarTemplateDecl *SpecializedTemplate, QualType T, TypeSourceInfo *TInfo,
11184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    StorageClass S, ArrayRef<TemplateArgument> Args,
111937fd27dbb941d27f4bd7412e534e7e5089d6781bRichard Smith    const ASTTemplateArgumentListInfo *ArgInfos)
11206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    : VarTemplateSpecializationDecl(VarTemplatePartialSpecialization, Context,
1121ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo                                    DC, StartLoc, IdLoc, SpecializedTemplate, T,
11224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                    TInfo, S, Args),
1123ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo      TemplateParams(Params), ArgsAsWritten(ArgInfos),
11246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      InstantiatedFromMember(nullptr, false) {
1125ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  // TODO: The template parameters should be in DC by now. Verify.
1126ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  // AdoptTemplateParameterList(Params, DC);
1127ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo}
1128ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
1129ef4579cda09b73e3d4d98af48201da25adc29326Larisse VoufoVarTemplatePartialSpecializationDecl *
1130ef4579cda09b73e3d4d98af48201da25adc29326Larisse VoufoVarTemplatePartialSpecializationDecl::Create(
1131ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    ASTContext &Context, DeclContext *DC, SourceLocation StartLoc,
1132ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    SourceLocation IdLoc, TemplateParameterList *Params,
1133ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    VarTemplateDecl *SpecializedTemplate, QualType T, TypeSourceInfo *TInfo,
11344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    StorageClass S, ArrayRef<TemplateArgument> Args,
113537fd27dbb941d27f4bd7412e534e7e5089d6781bRichard Smith    const TemplateArgumentListInfo &ArgInfos) {
1136c1cef0892e049fcd31084f02d1efdd9985d4dfa4Enea Zaffanella  const ASTTemplateArgumentListInfo *ASTArgInfos
1137c1cef0892e049fcd31084f02d1efdd9985d4dfa4Enea Zaffanella    = ASTTemplateArgumentListInfo::Create(Context, ArgInfos);
1138ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
1139ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  VarTemplatePartialSpecializationDecl *Result =
1140651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      new (Context, DC) VarTemplatePartialSpecializationDecl(
1141ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo          Context, DC, StartLoc, IdLoc, Params, SpecializedTemplate, T, TInfo,
11424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar          S, Args, ASTArgInfos);
1143ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  Result->setSpecializationKind(TSK_ExplicitSpecialization);
1144ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo  return Result;
1145ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo}
1146ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
1147ef4579cda09b73e3d4d98af48201da25adc29326Larisse VoufoVarTemplatePartialSpecializationDecl *
1148ef4579cda09b73e3d4d98af48201da25adc29326Larisse VoufoVarTemplatePartialSpecializationDecl::CreateDeserialized(ASTContext &C,
1149ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo                                                         unsigned ID) {
11506bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  return new (C, ID) VarTemplatePartialSpecializationDecl(C);
1151ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo}
115287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
115387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarstatic TemplateParameterList *
115487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga NainarcreateMakeIntegerSeqParameterList(const ASTContext &C, DeclContext *DC) {
115587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // typename T
115687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  auto *T = TemplateTypeParmDecl::Create(
115787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      C, DC, SourceLocation(), SourceLocation(), /*Depth=*/1, /*Position=*/0,
115887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      /*Id=*/nullptr, /*Typename=*/true, /*ParameterPack=*/false);
115987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  T->setImplicit(true);
116087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
116187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // T ...Ints
116287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  TypeSourceInfo *TI =
116387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      C.getTrivialTypeSourceInfo(QualType(T->getTypeForDecl(), 0));
116487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  auto *N = NonTypeTemplateParmDecl::Create(
116587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      C, DC, SourceLocation(), SourceLocation(), /*Depth=*/0, /*Position=*/1,
116687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      /*Id=*/nullptr, TI->getType(), /*ParameterPack=*/true, TI);
116787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  N->setImplicit(true);
116887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
116987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // <typename T, T ...Ints>
117087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  NamedDecl *P[2] = {T, N};
117187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  auto *TPL = TemplateParameterList::Create(
11724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      C, SourceLocation(), SourceLocation(), P, SourceLocation());
117387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
117487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // template <typename T, ...Ints> class IntSeq
117587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  auto *TemplateTemplateParm = TemplateTemplateParmDecl::Create(
117687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      C, DC, SourceLocation(), /*Depth=*/0, /*Position=*/0,
117787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      /*ParameterPack=*/false, /*Id=*/nullptr, TPL);
117887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  TemplateTemplateParm->setImplicit(true);
117987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
118087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // typename T
118187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  auto *TemplateTypeParm = TemplateTypeParmDecl::Create(
118287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      C, DC, SourceLocation(), SourceLocation(), /*Depth=*/0, /*Position=*/1,
118387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      /*Id=*/nullptr, /*Typename=*/true, /*ParameterPack=*/false);
118487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  TemplateTypeParm->setImplicit(true);
118587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
118687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // T N
118787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  TypeSourceInfo *TInfo = C.getTrivialTypeSourceInfo(
118887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      QualType(TemplateTypeParm->getTypeForDecl(), 0));
118987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  auto *NonTypeTemplateParm = NonTypeTemplateParmDecl::Create(
119087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      C, DC, SourceLocation(), SourceLocation(), /*Depth=*/0, /*Position=*/2,
119187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      /*Id=*/nullptr, TInfo->getType(), /*ParameterPack=*/false, TInfo);
119287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  NamedDecl *Params[] = {TemplateTemplateParm, TemplateTypeParm,
119387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                         NonTypeTemplateParm};
119487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
119587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // template <template <typename T, T ...Ints> class IntSeq, typename T, T N>
119687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return TemplateParameterList::Create(C, SourceLocation(), SourceLocation(),
11974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                       Params, SourceLocation());
11984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
11994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
12004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarstatic TemplateParameterList *
12014967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarcreateTypePackElementParameterList(const ASTContext &C, DeclContext *DC) {
12024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // std::size_t Index
12034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  TypeSourceInfo *TInfo = C.getTrivialTypeSourceInfo(C.getSizeType());
12044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  auto *Index = NonTypeTemplateParmDecl::Create(
12054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      C, DC, SourceLocation(), SourceLocation(), /*Depth=*/0, /*Position=*/0,
12064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      /*Id=*/nullptr, TInfo->getType(), /*ParameterPack=*/false, TInfo);
12074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
12084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // typename ...T
12094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  auto *Ts = TemplateTypeParmDecl::Create(
12104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      C, DC, SourceLocation(), SourceLocation(), /*Depth=*/0, /*Position=*/1,
12114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      /*Id=*/nullptr, /*Typename=*/true, /*ParameterPack=*/true);
12124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  Ts->setImplicit(true);
12134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
12144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // template <std::size_t Index, typename ...T>
12154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  NamedDecl *Params[] = {Index, Ts};
12164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  return TemplateParameterList::Create(C, SourceLocation(), SourceLocation(),
12174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                       llvm::makeArrayRef(Params),
12184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                       SourceLocation());
121987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
122087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
122187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarstatic TemplateParameterList *createBuiltinTemplateParameterList(
122287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    const ASTContext &C, DeclContext *DC, BuiltinTemplateKind BTK) {
122387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  switch (BTK) {
122487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  case BTK__make_integer_seq:
122587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return createMakeIntegerSeqParameterList(C, DC);
12264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  case BTK__type_pack_element:
12274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return createTypePackElementParameterList(C, DC);
122887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
122987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
123087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  llvm_unreachable("unhandled BuiltinTemplateKind!");
123187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
123287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
123387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarvoid BuiltinTemplateDecl::anchor() {}
123487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
123587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga NainarBuiltinTemplateDecl::BuiltinTemplateDecl(const ASTContext &C, DeclContext *DC,
123687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                                         DeclarationName Name,
123787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                                         BuiltinTemplateKind BTK)
123887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    : TemplateDecl(BuiltinTemplate, DC, SourceLocation(), Name,
123987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                   createBuiltinTemplateParameterList(C, DC, BTK)),
124087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      BTK(BTK) {}
1241