DeclTemplate.cpp 50 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189
  1. //===--- DeclTemplate.cpp - Template Declaration AST Node Implementation --===//
  2. //
  3. // The LLVM Compiler Infrastructure
  4. //
  5. // This file is distributed under the University of Illinois Open Source
  6. // License. See LICENSE.TXT for details.
  7. //
  8. //===----------------------------------------------------------------------===//
  9. //
  10. // This file implements the C++ related Decl classes for templates.
  11. //
  12. //===----------------------------------------------------------------------===//
  13. #include "clang/AST/DeclTemplate.h"
  14. #include "clang/AST/ASTContext.h"
  15. #include "clang/AST/ASTMutationListener.h"
  16. #include "clang/AST/DeclCXX.h"
  17. #include "clang/AST/Expr.h"
  18. #include "clang/AST/ExprCXX.h"
  19. #include "clang/AST/TypeLoc.h"
  20. #include "clang/Basic/IdentifierTable.h"
  21. #include "llvm/ADT/STLExtras.h"
  22. #include <memory>
  23. using namespace clang;
  24. //===----------------------------------------------------------------------===//
  25. // TemplateParameterList Implementation
  26. //===----------------------------------------------------------------------===//
  27. TemplateParameterList::TemplateParameterList(SourceLocation TemplateLoc,
  28. SourceLocation LAngleLoc,
  29. NamedDecl **Params, unsigned NumParams,
  30. SourceLocation RAngleLoc)
  31. : TemplateLoc(TemplateLoc), LAngleLoc(LAngleLoc), RAngleLoc(RAngleLoc),
  32. NumParams(NumParams), ContainsUnexpandedParameterPack(false) {
  33. assert(this->NumParams == NumParams && "Too many template parameters");
  34. for (unsigned Idx = 0; Idx < NumParams; ++Idx) {
  35. NamedDecl *P = Params[Idx];
  36. begin()[Idx] = P;
  37. if (!P->isTemplateParameterPack()) {
  38. if (NonTypeTemplateParmDecl *NTTP = dyn_cast<NonTypeTemplateParmDecl>(P))
  39. if (NTTP->getType()->containsUnexpandedParameterPack())
  40. ContainsUnexpandedParameterPack = true;
  41. if (TemplateTemplateParmDecl *TTP = dyn_cast<TemplateTemplateParmDecl>(P))
  42. if (TTP->getTemplateParameters()->containsUnexpandedParameterPack())
  43. ContainsUnexpandedParameterPack = true;
  44. // FIXME: If a default argument contains an unexpanded parameter pack, the
  45. // template parameter list does too.
  46. }
  47. }
  48. }
  49. TemplateParameterList *
  50. TemplateParameterList::Create(const ASTContext &C, SourceLocation TemplateLoc,
  51. SourceLocation LAngleLoc, NamedDecl **Params,
  52. unsigned NumParams, SourceLocation RAngleLoc) {
  53. unsigned Size = sizeof(TemplateParameterList)
  54. + sizeof(NamedDecl *) * NumParams;
  55. unsigned Align = std::max(llvm::alignOf<TemplateParameterList>(),
  56. llvm::alignOf<NamedDecl*>());
  57. void *Mem = C.Allocate(Size, Align);
  58. return new (Mem) TemplateParameterList(TemplateLoc, LAngleLoc, Params,
  59. NumParams, RAngleLoc);
  60. }
  61. unsigned TemplateParameterList::getMinRequiredArguments() const {
  62. unsigned NumRequiredArgs = 0;
  63. for (iterator P = const_cast<TemplateParameterList *>(this)->begin(),
  64. PEnd = const_cast<TemplateParameterList *>(this)->end();
  65. P != PEnd; ++P) {
  66. if ((*P)->isTemplateParameterPack()) {
  67. if (NonTypeTemplateParmDecl *NTTP = dyn_cast<NonTypeTemplateParmDecl>(*P))
  68. if (NTTP->isExpandedParameterPack()) {
  69. NumRequiredArgs += NTTP->getNumExpansionTypes();
  70. continue;
  71. }
  72. break;
  73. }
  74. if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(*P)) {
  75. if (TTP->hasDefaultArgument())
  76. break;
  77. } else if (NonTypeTemplateParmDecl *NTTP
  78. = dyn_cast<NonTypeTemplateParmDecl>(*P)) {
  79. if (NTTP->hasDefaultArgument())
  80. break;
  81. } else if (cast<TemplateTemplateParmDecl>(*P)->hasDefaultArgument())
  82. break;
  83. ++NumRequiredArgs;
  84. }
  85. return NumRequiredArgs;
  86. }
  87. unsigned TemplateParameterList::getDepth() const {
  88. if (size() == 0)
  89. return 0;
  90. const NamedDecl *FirstParm = getParam(0);
  91. if (const TemplateTypeParmDecl *TTP
  92. = dyn_cast<TemplateTypeParmDecl>(FirstParm))
  93. return TTP->getDepth();
  94. else if (const NonTypeTemplateParmDecl *NTTP
  95. = dyn_cast<NonTypeTemplateParmDecl>(FirstParm))
  96. return NTTP->getDepth();
  97. else
  98. return cast<TemplateTemplateParmDecl>(FirstParm)->getDepth();
  99. }
  100. static void AdoptTemplateParameterList(TemplateParameterList *Params,
  101. DeclContext *Owner) {
  102. for (TemplateParameterList::iterator P = Params->begin(),
  103. PEnd = Params->end();
  104. P != PEnd; ++P) {
  105. (*P)->setDeclContext(Owner);
  106. if (TemplateTemplateParmDecl *TTP = dyn_cast<TemplateTemplateParmDecl>(*P))
  107. AdoptTemplateParameterList(TTP->getTemplateParameters(), Owner);
  108. }
  109. }
  110. namespace clang {
  111. void *allocateDefaultArgStorageChain(const ASTContext &C) {
  112. return new (C) char[sizeof(void*) * 2];
  113. }
  114. }
  115. //===----------------------------------------------------------------------===//
  116. // RedeclarableTemplateDecl Implementation
  117. //===----------------------------------------------------------------------===//
  118. RedeclarableTemplateDecl::CommonBase *RedeclarableTemplateDecl::getCommonPtr() const {
  119. if (Common)
  120. return Common;
  121. // Walk the previous-declaration chain until we either find a declaration
  122. // with a common pointer or we run out of previous declarations.
  123. SmallVector<const RedeclarableTemplateDecl *, 2> PrevDecls;
  124. for (const RedeclarableTemplateDecl *Prev = getPreviousDecl(); Prev;
  125. Prev = Prev->getPreviousDecl()) {
  126. if (Prev->Common) {
  127. Common = Prev->Common;
  128. break;
  129. }
  130. PrevDecls.push_back(Prev);
  131. }
  132. // If we never found a common pointer, allocate one now.
  133. if (!Common) {
  134. // FIXME: If any of the declarations is from an AST file, we probably
  135. // need an update record to add the common data.
  136. Common = newCommon(getASTContext());
  137. }
  138. // Update any previous declarations we saw with the common pointer.
  139. for (unsigned I = 0, N = PrevDecls.size(); I != N; ++I)
  140. PrevDecls[I]->Common = Common;
  141. return Common;
  142. }
  143. template<class EntryType>
  144. typename RedeclarableTemplateDecl::SpecEntryTraits<EntryType>::DeclType *
  145. RedeclarableTemplateDecl::findSpecializationImpl(
  146. llvm::FoldingSetVector<EntryType> &Specs, ArrayRef<TemplateArgument> Args,
  147. void *&InsertPos) {
  148. typedef SpecEntryTraits<EntryType> SETraits;
  149. llvm::FoldingSetNodeID ID;
  150. EntryType::Profile(ID,Args, getASTContext());
  151. EntryType *Entry = Specs.FindNodeOrInsertPos(ID, InsertPos);
  152. return Entry ? SETraits::getDecl(Entry)->getMostRecentDecl() : nullptr;
  153. }
  154. template<class Derived, class EntryType>
  155. void RedeclarableTemplateDecl::addSpecializationImpl(
  156. llvm::FoldingSetVector<EntryType> &Specializations, EntryType *Entry,
  157. void *InsertPos) {
  158. typedef SpecEntryTraits<EntryType> SETraits;
  159. if (InsertPos) {
  160. #ifndef NDEBUG
  161. void *CorrectInsertPos;
  162. assert(!findSpecializationImpl(Specializations,
  163. SETraits::getTemplateArgs(Entry),
  164. CorrectInsertPos) &&
  165. InsertPos == CorrectInsertPos &&
  166. "given incorrect InsertPos for specialization");
  167. #endif
  168. Specializations.InsertNode(Entry, InsertPos);
  169. } else {
  170. EntryType *Existing = Specializations.GetOrInsertNode(Entry);
  171. (void)Existing;
  172. assert(SETraits::getDecl(Existing)->isCanonicalDecl() &&
  173. "non-canonical specialization?");
  174. }
  175. if (ASTMutationListener *L = getASTMutationListener())
  176. L->AddedCXXTemplateSpecialization(cast<Derived>(this),
  177. SETraits::getDecl(Entry));
  178. }
  179. /// \brief Generate the injected template arguments for the given template
  180. /// parameter list, e.g., for the injected-class-name of a class template.
  181. static void GenerateInjectedTemplateArgs(ASTContext &Context,
  182. TemplateParameterList *Params,
  183. TemplateArgument *Args) {
  184. for (TemplateParameterList::iterator Param = Params->begin(),
  185. ParamEnd = Params->end();
  186. Param != ParamEnd; ++Param) {
  187. TemplateArgument Arg;
  188. if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(*Param)) {
  189. QualType ArgType = Context.getTypeDeclType(TTP);
  190. if (TTP->isParameterPack())
  191. ArgType = Context.getPackExpansionType(ArgType, None);
  192. Arg = TemplateArgument(ArgType);
  193. } else if (NonTypeTemplateParmDecl *NTTP =
  194. dyn_cast<NonTypeTemplateParmDecl>(*Param)) {
  195. Expr *E = new (Context) DeclRefExpr(NTTP, /*enclosing*/ false,
  196. NTTP->getType().getNonLValueExprType(Context),
  197. Expr::getValueKindForType(NTTP->getType()),
  198. NTTP->getLocation());
  199. if (NTTP->isParameterPack())
  200. E = new (Context) PackExpansionExpr(Context.DependentTy, E,
  201. NTTP->getLocation(), None);
  202. Arg = TemplateArgument(E);
  203. } else {
  204. TemplateTemplateParmDecl *TTP = cast<TemplateTemplateParmDecl>(*Param);
  205. if (TTP->isParameterPack())
  206. Arg = TemplateArgument(TemplateName(TTP), Optional<unsigned>());
  207. else
  208. Arg = TemplateArgument(TemplateName(TTP));
  209. }
  210. if ((*Param)->isTemplateParameterPack())
  211. Arg = TemplateArgument::CreatePackCopy(Context, &Arg, 1);
  212. *Args++ = Arg;
  213. }
  214. }
  215. //===----------------------------------------------------------------------===//
  216. // FunctionTemplateDecl Implementation
  217. //===----------------------------------------------------------------------===//
  218. void FunctionTemplateDecl::DeallocateCommon(void *Ptr) {
  219. static_cast<Common *>(Ptr)->~Common();
  220. }
  221. FunctionTemplateDecl *FunctionTemplateDecl::Create(ASTContext &C,
  222. DeclContext *DC,
  223. SourceLocation L,
  224. DeclarationName Name,
  225. TemplateParameterList *Params,
  226. NamedDecl *Decl) {
  227. AdoptTemplateParameterList(Params, cast<DeclContext>(Decl));
  228. return new (C, DC) FunctionTemplateDecl(C, DC, L, Name, Params, Decl);
  229. }
  230. FunctionTemplateDecl *FunctionTemplateDecl::CreateDeserialized(ASTContext &C,
  231. unsigned ID) {
  232. return new (C, ID) FunctionTemplateDecl(C, nullptr, SourceLocation(),
  233. DeclarationName(), nullptr, nullptr);
  234. }
  235. RedeclarableTemplateDecl::CommonBase *
  236. FunctionTemplateDecl::newCommon(ASTContext &C) const {
  237. Common *CommonPtr = new (C) Common;
  238. C.AddDeallocation(DeallocateCommon, CommonPtr);
  239. return CommonPtr;
  240. }
  241. void FunctionTemplateDecl::LoadLazySpecializations() const {
  242. // Grab the most recent declaration to ensure we've loaded any lazy
  243. // redeclarations of this template.
  244. //
  245. // FIXME: Avoid walking the entire redeclaration chain here.
  246. Common *CommonPtr = getMostRecentDecl()->getCommonPtr();
  247. if (CommonPtr->LazySpecializations) {
  248. ASTContext &Context = getASTContext();
  249. uint32_t *Specs = CommonPtr->LazySpecializations;
  250. CommonPtr->LazySpecializations = nullptr;
  251. for (uint32_t I = 0, N = *Specs++; I != N; ++I)
  252. (void)Context.getExternalSource()->GetExternalDecl(Specs[I]);
  253. }
  254. }
  255. llvm::FoldingSetVector<FunctionTemplateSpecializationInfo> &
  256. FunctionTemplateDecl::getSpecializations() const {
  257. LoadLazySpecializations();
  258. return getCommonPtr()->Specializations;
  259. }
  260. FunctionDecl *
  261. FunctionTemplateDecl::findSpecialization(ArrayRef<TemplateArgument> Args,
  262. void *&InsertPos) {
  263. return findSpecializationImpl(getSpecializations(), Args, InsertPos);
  264. }
  265. void FunctionTemplateDecl::addSpecialization(
  266. FunctionTemplateSpecializationInfo *Info, void *InsertPos) {
  267. addSpecializationImpl<FunctionTemplateDecl>(getSpecializations(), Info,
  268. InsertPos);
  269. }
  270. ArrayRef<TemplateArgument> FunctionTemplateDecl::getInjectedTemplateArgs() {
  271. TemplateParameterList *Params = getTemplateParameters();
  272. Common *CommonPtr = getCommonPtr();
  273. if (!CommonPtr->InjectedArgs) {
  274. CommonPtr->InjectedArgs
  275. = new (getASTContext()) TemplateArgument[Params->size()];
  276. GenerateInjectedTemplateArgs(getASTContext(), Params,
  277. CommonPtr->InjectedArgs);
  278. }
  279. return llvm::makeArrayRef(CommonPtr->InjectedArgs, Params->size());
  280. }
  281. //===----------------------------------------------------------------------===//
  282. // ClassTemplateDecl Implementation
  283. //===----------------------------------------------------------------------===//
  284. void ClassTemplateDecl::DeallocateCommon(void *Ptr) {
  285. static_cast<Common *>(Ptr)->~Common();
  286. }
  287. ClassTemplateDecl *ClassTemplateDecl::Create(ASTContext &C,
  288. DeclContext *DC,
  289. SourceLocation L,
  290. DeclarationName Name,
  291. TemplateParameterList *Params,
  292. NamedDecl *Decl,
  293. ClassTemplateDecl *PrevDecl) {
  294. AdoptTemplateParameterList(Params, cast<DeclContext>(Decl));
  295. ClassTemplateDecl *New = new (C, DC) ClassTemplateDecl(C, DC, L, Name,
  296. Params, Decl);
  297. New->setPreviousDecl(PrevDecl);
  298. return New;
  299. }
  300. ClassTemplateDecl *ClassTemplateDecl::CreateDeserialized(ASTContext &C,
  301. unsigned ID) {
  302. return new (C, ID) ClassTemplateDecl(C, nullptr, SourceLocation(),
  303. DeclarationName(), nullptr, nullptr);
  304. }
  305. void ClassTemplateDecl::LoadLazySpecializations() const {
  306. // Grab the most recent declaration to ensure we've loaded any lazy
  307. // redeclarations of this template.
  308. //
  309. // FIXME: Avoid walking the entire redeclaration chain here.
  310. Common *CommonPtr = getMostRecentDecl()->getCommonPtr();
  311. if (CommonPtr->LazySpecializations) {
  312. ASTContext &Context = getASTContext();
  313. uint32_t *Specs = CommonPtr->LazySpecializations;
  314. CommonPtr->LazySpecializations = nullptr;
  315. for (uint32_t I = 0, N = *Specs++; I != N; ++I)
  316. (void)Context.getExternalSource()->GetExternalDecl(Specs[I]);
  317. }
  318. }
  319. llvm::FoldingSetVector<ClassTemplateSpecializationDecl> &
  320. ClassTemplateDecl::getSpecializations() const {
  321. LoadLazySpecializations();
  322. return getCommonPtr()->Specializations;
  323. }
  324. llvm::FoldingSetVector<ClassTemplatePartialSpecializationDecl> &
  325. ClassTemplateDecl::getPartialSpecializations() {
  326. LoadLazySpecializations();
  327. return getCommonPtr()->PartialSpecializations;
  328. }
  329. RedeclarableTemplateDecl::CommonBase *
  330. ClassTemplateDecl::newCommon(ASTContext &C) const {
  331. Common *CommonPtr = new (C) Common;
  332. C.AddDeallocation(DeallocateCommon, CommonPtr);
  333. return CommonPtr;
  334. }
  335. ClassTemplateSpecializationDecl *
  336. ClassTemplateDecl::findSpecialization(ArrayRef<TemplateArgument> Args,
  337. void *&InsertPos) {
  338. return findSpecializationImpl(getSpecializations(), Args, InsertPos);
  339. }
  340. void ClassTemplateDecl::AddSpecialization(ClassTemplateSpecializationDecl *D,
  341. void *InsertPos) {
  342. addSpecializationImpl<ClassTemplateDecl>(getSpecializations(), D, InsertPos);
  343. }
  344. ClassTemplatePartialSpecializationDecl *
  345. ClassTemplateDecl::findPartialSpecialization(ArrayRef<TemplateArgument> Args,
  346. void *&InsertPos) {
  347. return findSpecializationImpl(getPartialSpecializations(), Args, InsertPos);
  348. }
  349. void ClassTemplateDecl::AddPartialSpecialization(
  350. ClassTemplatePartialSpecializationDecl *D,
  351. void *InsertPos) {
  352. if (InsertPos)
  353. getPartialSpecializations().InsertNode(D, InsertPos);
  354. else {
  355. ClassTemplatePartialSpecializationDecl *Existing
  356. = getPartialSpecializations().GetOrInsertNode(D);
  357. (void)Existing;
  358. assert(Existing->isCanonicalDecl() && "Non-canonical specialization?");
  359. }
  360. if (ASTMutationListener *L = getASTMutationListener())
  361. L->AddedCXXTemplateSpecialization(this, D);
  362. }
  363. void ClassTemplateDecl::getPartialSpecializations(
  364. SmallVectorImpl<ClassTemplatePartialSpecializationDecl *> &PS) {
  365. llvm::FoldingSetVector<ClassTemplatePartialSpecializationDecl> &PartialSpecs
  366. = getPartialSpecializations();
  367. PS.clear();
  368. PS.reserve(PartialSpecs.size());
  369. for (llvm::FoldingSetVector<ClassTemplatePartialSpecializationDecl>::iterator
  370. P = PartialSpecs.begin(), PEnd = PartialSpecs.end();
  371. P != PEnd; ++P)
  372. PS.push_back(P->getMostRecentDecl());
  373. }
  374. ClassTemplatePartialSpecializationDecl *
  375. ClassTemplateDecl::findPartialSpecialization(QualType T) {
  376. ASTContext &Context = getASTContext();
  377. using llvm::FoldingSetVector;
  378. typedef FoldingSetVector<ClassTemplatePartialSpecializationDecl>::iterator
  379. partial_spec_iterator;
  380. for (partial_spec_iterator P = getPartialSpecializations().begin(),
  381. PEnd = getPartialSpecializations().end();
  382. P != PEnd; ++P) {
  383. if (Context.hasSameType(P->getInjectedSpecializationType(), T))
  384. return P->getMostRecentDecl();
  385. }
  386. return nullptr;
  387. }
  388. ClassTemplatePartialSpecializationDecl *
  389. ClassTemplateDecl::findPartialSpecInstantiatedFromMember(
  390. ClassTemplatePartialSpecializationDecl *D) {
  391. Decl *DCanon = D->getCanonicalDecl();
  392. for (llvm::FoldingSetVector<ClassTemplatePartialSpecializationDecl>::iterator
  393. P = getPartialSpecializations().begin(),
  394. PEnd = getPartialSpecializations().end();
  395. P != PEnd; ++P) {
  396. if (P->getInstantiatedFromMember()->getCanonicalDecl() == DCanon)
  397. return P->getMostRecentDecl();
  398. }
  399. return nullptr;
  400. }
  401. QualType
  402. ClassTemplateDecl::getInjectedClassNameSpecialization() {
  403. Common *CommonPtr = getCommonPtr();
  404. if (!CommonPtr->InjectedClassNameType.isNull())
  405. return CommonPtr->InjectedClassNameType;
  406. // C++0x [temp.dep.type]p2:
  407. // The template argument list of a primary template is a template argument
  408. // list in which the nth template argument has the value of the nth template
  409. // parameter of the class template. If the nth template parameter is a
  410. // template parameter pack (14.5.3), the nth template argument is a pack
  411. // expansion (14.5.3) whose pattern is the name of the template parameter
  412. // pack.
  413. ASTContext &Context = getASTContext();
  414. TemplateParameterList *Params = getTemplateParameters();
  415. SmallVector<TemplateArgument, 16> TemplateArgs;
  416. TemplateArgs.resize(Params->size());
  417. GenerateInjectedTemplateArgs(getASTContext(), Params, TemplateArgs.data());
  418. CommonPtr->InjectedClassNameType
  419. = Context.getTemplateSpecializationType(TemplateName(this),
  420. &TemplateArgs[0],
  421. TemplateArgs.size());
  422. return CommonPtr->InjectedClassNameType;
  423. }
  424. //===----------------------------------------------------------------------===//
  425. // TemplateTypeParm Allocation/Deallocation Method Implementations
  426. //===----------------------------------------------------------------------===//
  427. TemplateTypeParmDecl *
  428. TemplateTypeParmDecl::Create(const ASTContext &C, DeclContext *DC,
  429. SourceLocation KeyLoc, SourceLocation NameLoc,
  430. unsigned D, unsigned P, IdentifierInfo *Id,
  431. bool Typename, bool ParameterPack) {
  432. TemplateTypeParmDecl *TTPDecl =
  433. new (C, DC) TemplateTypeParmDecl(DC, KeyLoc, NameLoc, Id, Typename);
  434. QualType TTPType = C.getTemplateTypeParmType(D, P, ParameterPack, TTPDecl);
  435. TTPDecl->setTypeForDecl(TTPType.getTypePtr());
  436. return TTPDecl;
  437. }
  438. TemplateTypeParmDecl *
  439. TemplateTypeParmDecl::CreateDeserialized(const ASTContext &C, unsigned ID) {
  440. return new (C, ID) TemplateTypeParmDecl(nullptr, SourceLocation(),
  441. SourceLocation(), nullptr, false);
  442. }
  443. SourceLocation TemplateTypeParmDecl::getDefaultArgumentLoc() const {
  444. return hasDefaultArgument()
  445. ? getDefaultArgumentInfo()->getTypeLoc().getBeginLoc()
  446. : SourceLocation();
  447. }
  448. SourceRange TemplateTypeParmDecl::getSourceRange() const {
  449. if (hasDefaultArgument() && !defaultArgumentWasInherited())
  450. return SourceRange(getLocStart(),
  451. getDefaultArgumentInfo()->getTypeLoc().getEndLoc());
  452. else
  453. return TypeDecl::getSourceRange();
  454. }
  455. unsigned TemplateTypeParmDecl::getDepth() const {
  456. return getTypeForDecl()->getAs<TemplateTypeParmType>()->getDepth();
  457. }
  458. unsigned TemplateTypeParmDecl::getIndex() const {
  459. return getTypeForDecl()->getAs<TemplateTypeParmType>()->getIndex();
  460. }
  461. bool TemplateTypeParmDecl::isParameterPack() const {
  462. return getTypeForDecl()->getAs<TemplateTypeParmType>()->isParameterPack();
  463. }
  464. //===----------------------------------------------------------------------===//
  465. // NonTypeTemplateParmDecl Method Implementations
  466. //===----------------------------------------------------------------------===//
  467. NonTypeTemplateParmDecl::NonTypeTemplateParmDecl(DeclContext *DC,
  468. SourceLocation StartLoc,
  469. SourceLocation IdLoc,
  470. unsigned D, unsigned P,
  471. IdentifierInfo *Id,
  472. QualType T,
  473. TypeSourceInfo *TInfo,
  474. const QualType *ExpandedTypes,
  475. unsigned NumExpandedTypes,
  476. TypeSourceInfo **ExpandedTInfos)
  477. : DeclaratorDecl(NonTypeTemplateParm, DC, IdLoc, Id, T, TInfo, StartLoc),
  478. TemplateParmPosition(D, P), ParameterPack(true),
  479. ExpandedParameterPack(true), NumExpandedTypes(NumExpandedTypes) {
  480. if (ExpandedTypes && ExpandedTInfos) {
  481. void **TypesAndInfos = reinterpret_cast<void **>(this + 1);
  482. for (unsigned I = 0; I != NumExpandedTypes; ++I) {
  483. TypesAndInfos[2*I] = ExpandedTypes[I].getAsOpaquePtr();
  484. TypesAndInfos[2*I + 1] = ExpandedTInfos[I];
  485. }
  486. }
  487. }
  488. NonTypeTemplateParmDecl *
  489. NonTypeTemplateParmDecl::Create(const ASTContext &C, DeclContext *DC,
  490. SourceLocation StartLoc, SourceLocation IdLoc,
  491. unsigned D, unsigned P, IdentifierInfo *Id,
  492. QualType T, bool ParameterPack,
  493. TypeSourceInfo *TInfo) {
  494. return new (C, DC) NonTypeTemplateParmDecl(DC, StartLoc, IdLoc, D, P, Id,
  495. T, ParameterPack, TInfo);
  496. }
  497. NonTypeTemplateParmDecl *
  498. NonTypeTemplateParmDecl::Create(const ASTContext &C, DeclContext *DC,
  499. SourceLocation StartLoc, SourceLocation IdLoc,
  500. unsigned D, unsigned P,
  501. IdentifierInfo *Id, QualType T,
  502. TypeSourceInfo *TInfo,
  503. const QualType *ExpandedTypes,
  504. unsigned NumExpandedTypes,
  505. TypeSourceInfo **ExpandedTInfos) {
  506. unsigned Extra = NumExpandedTypes * 2 * sizeof(void*);
  507. return new (C, DC, Extra) NonTypeTemplateParmDecl(
  508. DC, StartLoc, IdLoc, D, P, Id, T, TInfo,
  509. ExpandedTypes, NumExpandedTypes, ExpandedTInfos);
  510. }
  511. NonTypeTemplateParmDecl *
  512. NonTypeTemplateParmDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
  513. return new (C, ID) NonTypeTemplateParmDecl(nullptr, SourceLocation(),
  514. SourceLocation(), 0, 0, nullptr,
  515. QualType(), false, nullptr);
  516. }
  517. NonTypeTemplateParmDecl *
  518. NonTypeTemplateParmDecl::CreateDeserialized(ASTContext &C, unsigned ID,
  519. unsigned NumExpandedTypes) {
  520. unsigned Extra = NumExpandedTypes * 2 * sizeof(void*);
  521. return new (C, ID, Extra) NonTypeTemplateParmDecl(
  522. nullptr, SourceLocation(), SourceLocation(), 0, 0, nullptr, QualType(),
  523. nullptr, nullptr, NumExpandedTypes, nullptr);
  524. }
  525. SourceRange NonTypeTemplateParmDecl::getSourceRange() const {
  526. if (hasDefaultArgument() && !defaultArgumentWasInherited())
  527. return SourceRange(getOuterLocStart(),
  528. getDefaultArgument()->getSourceRange().getEnd());
  529. return DeclaratorDecl::getSourceRange();
  530. }
  531. SourceLocation NonTypeTemplateParmDecl::getDefaultArgumentLoc() const {
  532. return hasDefaultArgument()
  533. ? getDefaultArgument()->getSourceRange().getBegin()
  534. : SourceLocation();
  535. }
  536. //===----------------------------------------------------------------------===//
  537. // TemplateTemplateParmDecl Method Implementations
  538. //===----------------------------------------------------------------------===//
  539. void TemplateTemplateParmDecl::anchor() { }
  540. TemplateTemplateParmDecl::TemplateTemplateParmDecl(
  541. DeclContext *DC, SourceLocation L, unsigned D, unsigned P,
  542. IdentifierInfo *Id, TemplateParameterList *Params,
  543. unsigned NumExpansions, TemplateParameterList * const *Expansions)
  544. : TemplateDecl(TemplateTemplateParm, DC, L, Id, Params),
  545. TemplateParmPosition(D, P), ParameterPack(true),
  546. ExpandedParameterPack(true), NumExpandedParams(NumExpansions) {
  547. if (Expansions)
  548. std::memcpy(reinterpret_cast<void*>(this + 1), Expansions,
  549. sizeof(TemplateParameterList*) * NumExpandedParams);
  550. }
  551. TemplateTemplateParmDecl *
  552. TemplateTemplateParmDecl::Create(const ASTContext &C, DeclContext *DC,
  553. SourceLocation L, unsigned D, unsigned P,
  554. bool ParameterPack, IdentifierInfo *Id,
  555. TemplateParameterList *Params) {
  556. return new (C, DC) TemplateTemplateParmDecl(DC, L, D, P, ParameterPack, Id,
  557. Params);
  558. }
  559. TemplateTemplateParmDecl *
  560. TemplateTemplateParmDecl::Create(const ASTContext &C, DeclContext *DC,
  561. SourceLocation L, unsigned D, unsigned P,
  562. IdentifierInfo *Id,
  563. TemplateParameterList *Params,
  564. ArrayRef<TemplateParameterList *> Expansions) {
  565. return new (C, DC, sizeof(TemplateParameterList*) * Expansions.size())
  566. TemplateTemplateParmDecl(DC, L, D, P, Id, Params,
  567. Expansions.size(), Expansions.data());
  568. }
  569. TemplateTemplateParmDecl *
  570. TemplateTemplateParmDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
  571. return new (C, ID) TemplateTemplateParmDecl(nullptr, SourceLocation(), 0, 0,
  572. false, nullptr, nullptr);
  573. }
  574. TemplateTemplateParmDecl *
  575. TemplateTemplateParmDecl::CreateDeserialized(ASTContext &C, unsigned ID,
  576. unsigned NumExpansions) {
  577. return new (C, ID, sizeof(TemplateParameterList*) * NumExpansions)
  578. TemplateTemplateParmDecl(nullptr, SourceLocation(), 0, 0, nullptr,
  579. nullptr, NumExpansions, nullptr);
  580. }
  581. SourceLocation TemplateTemplateParmDecl::getDefaultArgumentLoc() const {
  582. return hasDefaultArgument() ? getDefaultArgument().getLocation()
  583. : SourceLocation();
  584. }
  585. void TemplateTemplateParmDecl::setDefaultArgument(
  586. const ASTContext &C, const TemplateArgumentLoc &DefArg) {
  587. if (DefArg.getArgument().isNull())
  588. DefaultArgument.set(nullptr);
  589. else
  590. DefaultArgument.set(new (C) TemplateArgumentLoc(DefArg));
  591. }
  592. //===----------------------------------------------------------------------===//
  593. // TemplateArgumentList Implementation
  594. //===----------------------------------------------------------------------===//
  595. TemplateArgumentList *
  596. TemplateArgumentList::CreateCopy(ASTContext &Context,
  597. const TemplateArgument *Args,
  598. unsigned NumArgs) {
  599. std::size_t Size = sizeof(TemplateArgumentList)
  600. + NumArgs * sizeof(TemplateArgument);
  601. void *Mem = Context.Allocate(Size);
  602. TemplateArgument *StoredArgs
  603. = reinterpret_cast<TemplateArgument *>(
  604. static_cast<TemplateArgumentList *>(Mem) + 1);
  605. std::uninitialized_copy(Args, Args + NumArgs, StoredArgs);
  606. return new (Mem) TemplateArgumentList(StoredArgs, NumArgs, true);
  607. }
  608. FunctionTemplateSpecializationInfo *
  609. FunctionTemplateSpecializationInfo::Create(ASTContext &C, FunctionDecl *FD,
  610. FunctionTemplateDecl *Template,
  611. TemplateSpecializationKind TSK,
  612. const TemplateArgumentList *TemplateArgs,
  613. const TemplateArgumentListInfo *TemplateArgsAsWritten,
  614. SourceLocation POI) {
  615. const ASTTemplateArgumentListInfo *ArgsAsWritten = nullptr;
  616. if (TemplateArgsAsWritten)
  617. ArgsAsWritten = ASTTemplateArgumentListInfo::Create(C,
  618. *TemplateArgsAsWritten);
  619. return new (C) FunctionTemplateSpecializationInfo(FD, Template, TSK,
  620. TemplateArgs,
  621. ArgsAsWritten,
  622. POI);
  623. }
  624. //===----------------------------------------------------------------------===//
  625. // TemplateDecl Implementation
  626. //===----------------------------------------------------------------------===//
  627. void TemplateDecl::anchor() { }
  628. //===----------------------------------------------------------------------===//
  629. // ClassTemplateSpecializationDecl Implementation
  630. //===----------------------------------------------------------------------===//
  631. ClassTemplateSpecializationDecl::
  632. ClassTemplateSpecializationDecl(ASTContext &Context, Kind DK, TagKind TK,
  633. DeclContext *DC, SourceLocation StartLoc,
  634. SourceLocation IdLoc,
  635. ClassTemplateDecl *SpecializedTemplate,
  636. const TemplateArgument *Args,
  637. unsigned NumArgs,
  638. ClassTemplateSpecializationDecl *PrevDecl)
  639. : CXXRecordDecl(DK, TK, Context, DC, StartLoc, IdLoc,
  640. SpecializedTemplate->getIdentifier(),
  641. PrevDecl),
  642. SpecializedTemplate(SpecializedTemplate),
  643. ExplicitInfo(nullptr),
  644. TemplateArgs(TemplateArgumentList::CreateCopy(Context, Args, NumArgs)),
  645. SpecializationKind(TSK_Undeclared) {
  646. }
  647. ClassTemplateSpecializationDecl::ClassTemplateSpecializationDecl(ASTContext &C,
  648. Kind DK)
  649. : CXXRecordDecl(DK, TTK_Struct, C, nullptr, SourceLocation(),
  650. SourceLocation(), nullptr, nullptr),
  651. ExplicitInfo(nullptr), SpecializationKind(TSK_Undeclared) {}
  652. ClassTemplateSpecializationDecl *
  653. ClassTemplateSpecializationDecl::Create(ASTContext &Context, TagKind TK,
  654. DeclContext *DC,
  655. SourceLocation StartLoc,
  656. SourceLocation IdLoc,
  657. ClassTemplateDecl *SpecializedTemplate,
  658. const TemplateArgument *Args,
  659. unsigned NumArgs,
  660. ClassTemplateSpecializationDecl *PrevDecl) {
  661. ClassTemplateSpecializationDecl *Result =
  662. new (Context, DC) ClassTemplateSpecializationDecl(
  663. Context, ClassTemplateSpecialization, TK, DC, StartLoc, IdLoc,
  664. SpecializedTemplate, Args, NumArgs, PrevDecl);
  665. Result->MayHaveOutOfDateDef = false;
  666. Context.getTypeDeclType(Result, PrevDecl);
  667. return Result;
  668. }
  669. ClassTemplateSpecializationDecl *
  670. ClassTemplateSpecializationDecl::CreateDeserialized(ASTContext &C,
  671. unsigned ID) {
  672. ClassTemplateSpecializationDecl *Result =
  673. new (C, ID) ClassTemplateSpecializationDecl(C, ClassTemplateSpecialization);
  674. Result->MayHaveOutOfDateDef = false;
  675. return Result;
  676. }
  677. void ClassTemplateSpecializationDecl::getNameForDiagnostic(
  678. raw_ostream &OS, const PrintingPolicy &Policy, bool Qualified) const {
  679. NamedDecl::getNameForDiagnostic(OS, Policy, Qualified);
  680. const TemplateArgumentList &TemplateArgs = getTemplateArgs();
  681. TemplateSpecializationType::PrintTemplateArgumentList(
  682. OS, TemplateArgs.data(), TemplateArgs.size(), Policy);
  683. }
  684. ClassTemplateDecl *
  685. ClassTemplateSpecializationDecl::getSpecializedTemplate() const {
  686. if (SpecializedPartialSpecialization *PartialSpec
  687. = SpecializedTemplate.dyn_cast<SpecializedPartialSpecialization*>())
  688. return PartialSpec->PartialSpecialization->getSpecializedTemplate();
  689. return SpecializedTemplate.get<ClassTemplateDecl*>();
  690. }
  691. SourceRange
  692. ClassTemplateSpecializationDecl::getSourceRange() const {
  693. if (ExplicitInfo) {
  694. SourceLocation Begin = getTemplateKeywordLoc();
  695. if (Begin.isValid()) {
  696. // Here we have an explicit (partial) specialization or instantiation.
  697. assert(getSpecializationKind() == TSK_ExplicitSpecialization ||
  698. getSpecializationKind() == TSK_ExplicitInstantiationDeclaration ||
  699. getSpecializationKind() == TSK_ExplicitInstantiationDefinition);
  700. if (getExternLoc().isValid())
  701. Begin = getExternLoc();
  702. SourceLocation End = getRBraceLoc();
  703. if (End.isInvalid())
  704. End = getTypeAsWritten()->getTypeLoc().getEndLoc();
  705. return SourceRange(Begin, End);
  706. }
  707. // An implicit instantiation of a class template partial specialization
  708. // uses ExplicitInfo to record the TypeAsWritten, but the source
  709. // locations should be retrieved from the instantiation pattern.
  710. typedef ClassTemplatePartialSpecializationDecl CTPSDecl;
  711. CTPSDecl *ctpsd = const_cast<CTPSDecl*>(cast<CTPSDecl>(this));
  712. CTPSDecl *inst_from = ctpsd->getInstantiatedFromMember();
  713. assert(inst_from != nullptr);
  714. return inst_from->getSourceRange();
  715. }
  716. else {
  717. // No explicit info available.
  718. llvm::PointerUnion<ClassTemplateDecl *,
  719. ClassTemplatePartialSpecializationDecl *>
  720. inst_from = getInstantiatedFrom();
  721. if (inst_from.isNull())
  722. return getSpecializedTemplate()->getSourceRange();
  723. if (ClassTemplateDecl *ctd = inst_from.dyn_cast<ClassTemplateDecl*>())
  724. return ctd->getSourceRange();
  725. return inst_from.get<ClassTemplatePartialSpecializationDecl*>()
  726. ->getSourceRange();
  727. }
  728. }
  729. //===----------------------------------------------------------------------===//
  730. // ClassTemplatePartialSpecializationDecl Implementation
  731. //===----------------------------------------------------------------------===//
  732. void ClassTemplatePartialSpecializationDecl::anchor() { }
  733. ClassTemplatePartialSpecializationDecl::
  734. ClassTemplatePartialSpecializationDecl(ASTContext &Context, TagKind TK,
  735. DeclContext *DC,
  736. SourceLocation StartLoc,
  737. SourceLocation IdLoc,
  738. TemplateParameterList *Params,
  739. ClassTemplateDecl *SpecializedTemplate,
  740. const TemplateArgument *Args,
  741. unsigned NumArgs,
  742. const ASTTemplateArgumentListInfo *ArgInfos,
  743. ClassTemplatePartialSpecializationDecl *PrevDecl)
  744. : ClassTemplateSpecializationDecl(Context,
  745. ClassTemplatePartialSpecialization,
  746. TK, DC, StartLoc, IdLoc,
  747. SpecializedTemplate,
  748. Args, NumArgs, PrevDecl),
  749. TemplateParams(Params), ArgsAsWritten(ArgInfos),
  750. InstantiatedFromMember(nullptr, false)
  751. {
  752. AdoptTemplateParameterList(Params, this);
  753. }
  754. ClassTemplatePartialSpecializationDecl *
  755. ClassTemplatePartialSpecializationDecl::
  756. Create(ASTContext &Context, TagKind TK,DeclContext *DC,
  757. SourceLocation StartLoc, SourceLocation IdLoc,
  758. TemplateParameterList *Params,
  759. ClassTemplateDecl *SpecializedTemplate,
  760. const TemplateArgument *Args,
  761. unsigned NumArgs,
  762. const TemplateArgumentListInfo &ArgInfos,
  763. QualType CanonInjectedType,
  764. ClassTemplatePartialSpecializationDecl *PrevDecl) {
  765. const ASTTemplateArgumentListInfo *ASTArgInfos =
  766. ASTTemplateArgumentListInfo::Create(Context, ArgInfos);
  767. ClassTemplatePartialSpecializationDecl *Result = new (Context, DC)
  768. ClassTemplatePartialSpecializationDecl(Context, TK, DC, StartLoc, IdLoc,
  769. Params, SpecializedTemplate, Args,
  770. NumArgs, ASTArgInfos, PrevDecl);
  771. Result->setSpecializationKind(TSK_ExplicitSpecialization);
  772. Result->MayHaveOutOfDateDef = false;
  773. Context.getInjectedClassNameType(Result, CanonInjectedType);
  774. return Result;
  775. }
  776. ClassTemplatePartialSpecializationDecl *
  777. ClassTemplatePartialSpecializationDecl::CreateDeserialized(ASTContext &C,
  778. unsigned ID) {
  779. ClassTemplatePartialSpecializationDecl *Result =
  780. new (C, ID) ClassTemplatePartialSpecializationDecl(C);
  781. Result->MayHaveOutOfDateDef = false;
  782. return Result;
  783. }
  784. //===----------------------------------------------------------------------===//
  785. // FriendTemplateDecl Implementation
  786. //===----------------------------------------------------------------------===//
  787. void FriendTemplateDecl::anchor() { }
  788. FriendTemplateDecl *FriendTemplateDecl::Create(ASTContext &Context,
  789. DeclContext *DC,
  790. SourceLocation L,
  791. unsigned NParams,
  792. TemplateParameterList **Params,
  793. FriendUnion Friend,
  794. SourceLocation FLoc) {
  795. return new (Context, DC) FriendTemplateDecl(DC, L, NParams, Params,
  796. Friend, FLoc);
  797. }
  798. FriendTemplateDecl *FriendTemplateDecl::CreateDeserialized(ASTContext &C,
  799. unsigned ID) {
  800. return new (C, ID) FriendTemplateDecl(EmptyShell());
  801. }
  802. //===----------------------------------------------------------------------===//
  803. // TypeAliasTemplateDecl Implementation
  804. //===----------------------------------------------------------------------===//
  805. TypeAliasTemplateDecl *TypeAliasTemplateDecl::Create(ASTContext &C,
  806. DeclContext *DC,
  807. SourceLocation L,
  808. DeclarationName Name,
  809. TemplateParameterList *Params,
  810. NamedDecl *Decl) {
  811. AdoptTemplateParameterList(Params, DC);
  812. return new (C, DC) TypeAliasTemplateDecl(C, DC, L, Name, Params, Decl);
  813. }
  814. TypeAliasTemplateDecl *TypeAliasTemplateDecl::CreateDeserialized(ASTContext &C,
  815. unsigned ID) {
  816. return new (C, ID) TypeAliasTemplateDecl(C, nullptr, SourceLocation(),
  817. DeclarationName(), nullptr, nullptr);
  818. }
  819. void TypeAliasTemplateDecl::DeallocateCommon(void *Ptr) {
  820. static_cast<Common *>(Ptr)->~Common();
  821. }
  822. RedeclarableTemplateDecl::CommonBase *
  823. TypeAliasTemplateDecl::newCommon(ASTContext &C) const {
  824. Common *CommonPtr = new (C) Common;
  825. C.AddDeallocation(DeallocateCommon, CommonPtr);
  826. return CommonPtr;
  827. }
  828. //===----------------------------------------------------------------------===//
  829. // ClassScopeFunctionSpecializationDecl Implementation
  830. //===----------------------------------------------------------------------===//
  831. void ClassScopeFunctionSpecializationDecl::anchor() { }
  832. ClassScopeFunctionSpecializationDecl *
  833. ClassScopeFunctionSpecializationDecl::CreateDeserialized(ASTContext &C,
  834. unsigned ID) {
  835. return new (C, ID) ClassScopeFunctionSpecializationDecl(
  836. nullptr, SourceLocation(), nullptr, false, TemplateArgumentListInfo());
  837. }
  838. //===----------------------------------------------------------------------===//
  839. // VarTemplateDecl Implementation
  840. //===----------------------------------------------------------------------===//
  841. void VarTemplateDecl::DeallocateCommon(void *Ptr) {
  842. static_cast<Common *>(Ptr)->~Common();
  843. }
  844. VarTemplateDecl *VarTemplateDecl::getDefinition() {
  845. VarTemplateDecl *CurD = this;
  846. while (CurD) {
  847. if (CurD->isThisDeclarationADefinition())
  848. return CurD;
  849. CurD = CurD->getPreviousDecl();
  850. }
  851. return nullptr;
  852. }
  853. VarTemplateDecl *VarTemplateDecl::Create(ASTContext &C, DeclContext *DC,
  854. SourceLocation L, DeclarationName Name,
  855. TemplateParameterList *Params,
  856. VarDecl *Decl) {
  857. return new (C, DC) VarTemplateDecl(C, DC, L, Name, Params, Decl);
  858. }
  859. VarTemplateDecl *VarTemplateDecl::CreateDeserialized(ASTContext &C,
  860. unsigned ID) {
  861. return new (C, ID) VarTemplateDecl(C, nullptr, SourceLocation(),
  862. DeclarationName(), nullptr, nullptr);
  863. }
  864. // TODO: Unify across class, function and variable templates?
  865. // May require moving this and Common to RedeclarableTemplateDecl.
  866. void VarTemplateDecl::LoadLazySpecializations() const {
  867. // Grab the most recent declaration to ensure we've loaded any lazy
  868. // redeclarations of this template.
  869. //
  870. // FIXME: Avoid walking the entire redeclaration chain here.
  871. Common *CommonPtr = getMostRecentDecl()->getCommonPtr();
  872. if (CommonPtr->LazySpecializations) {
  873. ASTContext &Context = getASTContext();
  874. uint32_t *Specs = CommonPtr->LazySpecializations;
  875. CommonPtr->LazySpecializations = nullptr;
  876. for (uint32_t I = 0, N = *Specs++; I != N; ++I)
  877. (void)Context.getExternalSource()->GetExternalDecl(Specs[I]);
  878. }
  879. }
  880. llvm::FoldingSetVector<VarTemplateSpecializationDecl> &
  881. VarTemplateDecl::getSpecializations() const {
  882. LoadLazySpecializations();
  883. return getCommonPtr()->Specializations;
  884. }
  885. llvm::FoldingSetVector<VarTemplatePartialSpecializationDecl> &
  886. VarTemplateDecl::getPartialSpecializations() {
  887. LoadLazySpecializations();
  888. return getCommonPtr()->PartialSpecializations;
  889. }
  890. RedeclarableTemplateDecl::CommonBase *
  891. VarTemplateDecl::newCommon(ASTContext &C) const {
  892. Common *CommonPtr = new (C) Common;
  893. C.AddDeallocation(DeallocateCommon, CommonPtr);
  894. return CommonPtr;
  895. }
  896. VarTemplateSpecializationDecl *
  897. VarTemplateDecl::findSpecialization(ArrayRef<TemplateArgument> Args,
  898. void *&InsertPos) {
  899. return findSpecializationImpl(getSpecializations(), Args, InsertPos);
  900. }
  901. void VarTemplateDecl::AddSpecialization(VarTemplateSpecializationDecl *D,
  902. void *InsertPos) {
  903. addSpecializationImpl<VarTemplateDecl>(getSpecializations(), D, InsertPos);
  904. }
  905. VarTemplatePartialSpecializationDecl *
  906. VarTemplateDecl::findPartialSpecialization(ArrayRef<TemplateArgument> Args,
  907. void *&InsertPos) {
  908. return findSpecializationImpl(getPartialSpecializations(), Args, InsertPos);
  909. }
  910. void VarTemplateDecl::AddPartialSpecialization(
  911. VarTemplatePartialSpecializationDecl *D, void *InsertPos) {
  912. if (InsertPos)
  913. getPartialSpecializations().InsertNode(D, InsertPos);
  914. else {
  915. VarTemplatePartialSpecializationDecl *Existing =
  916. getPartialSpecializations().GetOrInsertNode(D);
  917. (void)Existing;
  918. assert(Existing->isCanonicalDecl() && "Non-canonical specialization?");
  919. }
  920. if (ASTMutationListener *L = getASTMutationListener())
  921. L->AddedCXXTemplateSpecialization(this, D);
  922. }
  923. void VarTemplateDecl::getPartialSpecializations(
  924. SmallVectorImpl<VarTemplatePartialSpecializationDecl *> &PS) {
  925. llvm::FoldingSetVector<VarTemplatePartialSpecializationDecl> &PartialSpecs =
  926. getPartialSpecializations();
  927. PS.clear();
  928. PS.reserve(PartialSpecs.size());
  929. for (llvm::FoldingSetVector<VarTemplatePartialSpecializationDecl>::iterator
  930. P = PartialSpecs.begin(),
  931. PEnd = PartialSpecs.end();
  932. P != PEnd; ++P)
  933. PS.push_back(P->getMostRecentDecl());
  934. }
  935. VarTemplatePartialSpecializationDecl *
  936. VarTemplateDecl::findPartialSpecInstantiatedFromMember(
  937. VarTemplatePartialSpecializationDecl *D) {
  938. Decl *DCanon = D->getCanonicalDecl();
  939. for (llvm::FoldingSetVector<VarTemplatePartialSpecializationDecl>::iterator
  940. P = getPartialSpecializations().begin(),
  941. PEnd = getPartialSpecializations().end();
  942. P != PEnd; ++P) {
  943. if (P->getInstantiatedFromMember()->getCanonicalDecl() == DCanon)
  944. return P->getMostRecentDecl();
  945. }
  946. return nullptr;
  947. }
  948. //===----------------------------------------------------------------------===//
  949. // VarTemplateSpecializationDecl Implementation
  950. //===----------------------------------------------------------------------===//
  951. VarTemplateSpecializationDecl::VarTemplateSpecializationDecl(
  952. Kind DK, ASTContext &Context, DeclContext *DC, SourceLocation StartLoc,
  953. SourceLocation IdLoc, VarTemplateDecl *SpecializedTemplate, QualType T,
  954. TypeSourceInfo *TInfo, StorageClass S, const TemplateArgument *Args,
  955. unsigned NumArgs)
  956. : VarDecl(DK, Context, DC, StartLoc, IdLoc,
  957. SpecializedTemplate->getIdentifier(), T, TInfo, S),
  958. SpecializedTemplate(SpecializedTemplate), ExplicitInfo(nullptr),
  959. TemplateArgs(TemplateArgumentList::CreateCopy(Context, Args, NumArgs)),
  960. SpecializationKind(TSK_Undeclared) {}
  961. VarTemplateSpecializationDecl::VarTemplateSpecializationDecl(Kind DK,
  962. ASTContext &C)
  963. : VarDecl(DK, C, nullptr, SourceLocation(), SourceLocation(), nullptr,
  964. QualType(), nullptr, SC_None),
  965. ExplicitInfo(nullptr), SpecializationKind(TSK_Undeclared) {}
  966. VarTemplateSpecializationDecl *VarTemplateSpecializationDecl::Create(
  967. ASTContext &Context, DeclContext *DC, SourceLocation StartLoc,
  968. SourceLocation IdLoc, VarTemplateDecl *SpecializedTemplate, QualType T,
  969. TypeSourceInfo *TInfo, StorageClass S, const TemplateArgument *Args,
  970. unsigned NumArgs) {
  971. return new (Context, DC) VarTemplateSpecializationDecl(
  972. VarTemplateSpecialization, Context, DC, StartLoc, IdLoc,
  973. SpecializedTemplate, T, TInfo, S, Args, NumArgs);
  974. }
  975. VarTemplateSpecializationDecl *
  976. VarTemplateSpecializationDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
  977. return new (C, ID)
  978. VarTemplateSpecializationDecl(VarTemplateSpecialization, C);
  979. }
  980. void VarTemplateSpecializationDecl::getNameForDiagnostic(
  981. raw_ostream &OS, const PrintingPolicy &Policy, bool Qualified) const {
  982. NamedDecl::getNameForDiagnostic(OS, Policy, Qualified);
  983. const TemplateArgumentList &TemplateArgs = getTemplateArgs();
  984. TemplateSpecializationType::PrintTemplateArgumentList(
  985. OS, TemplateArgs.data(), TemplateArgs.size(), Policy);
  986. }
  987. VarTemplateDecl *VarTemplateSpecializationDecl::getSpecializedTemplate() const {
  988. if (SpecializedPartialSpecialization *PartialSpec =
  989. SpecializedTemplate.dyn_cast<SpecializedPartialSpecialization *>())
  990. return PartialSpec->PartialSpecialization->getSpecializedTemplate();
  991. return SpecializedTemplate.get<VarTemplateDecl *>();
  992. }
  993. void VarTemplateSpecializationDecl::setTemplateArgsInfo(
  994. const TemplateArgumentListInfo &ArgsInfo) {
  995. unsigned N = ArgsInfo.size();
  996. TemplateArgsInfo.setLAngleLoc(ArgsInfo.getLAngleLoc());
  997. TemplateArgsInfo.setRAngleLoc(ArgsInfo.getRAngleLoc());
  998. for (unsigned I = 0; I != N; ++I)
  999. TemplateArgsInfo.addArgument(ArgsInfo[I]);
  1000. }
  1001. //===----------------------------------------------------------------------===//
  1002. // VarTemplatePartialSpecializationDecl Implementation
  1003. //===----------------------------------------------------------------------===//
  1004. void VarTemplatePartialSpecializationDecl::anchor() {}
  1005. VarTemplatePartialSpecializationDecl::VarTemplatePartialSpecializationDecl(
  1006. ASTContext &Context, DeclContext *DC, SourceLocation StartLoc,
  1007. SourceLocation IdLoc, TemplateParameterList *Params,
  1008. VarTemplateDecl *SpecializedTemplate, QualType T, TypeSourceInfo *TInfo,
  1009. StorageClass S, const TemplateArgument *Args, unsigned NumArgs,
  1010. const ASTTemplateArgumentListInfo *ArgInfos)
  1011. : VarTemplateSpecializationDecl(VarTemplatePartialSpecialization, Context,
  1012. DC, StartLoc, IdLoc, SpecializedTemplate, T,
  1013. TInfo, S, Args, NumArgs),
  1014. TemplateParams(Params), ArgsAsWritten(ArgInfos),
  1015. InstantiatedFromMember(nullptr, false) {
  1016. // TODO: The template parameters should be in DC by now. Verify.
  1017. // AdoptTemplateParameterList(Params, DC);
  1018. }
  1019. VarTemplatePartialSpecializationDecl *
  1020. VarTemplatePartialSpecializationDecl::Create(
  1021. ASTContext &Context, DeclContext *DC, SourceLocation StartLoc,
  1022. SourceLocation IdLoc, TemplateParameterList *Params,
  1023. VarTemplateDecl *SpecializedTemplate, QualType T, TypeSourceInfo *TInfo,
  1024. StorageClass S, const TemplateArgument *Args, unsigned NumArgs,
  1025. const TemplateArgumentListInfo &ArgInfos) {
  1026. const ASTTemplateArgumentListInfo *ASTArgInfos
  1027. = ASTTemplateArgumentListInfo::Create(Context, ArgInfos);
  1028. VarTemplatePartialSpecializationDecl *Result =
  1029. new (Context, DC) VarTemplatePartialSpecializationDecl(
  1030. Context, DC, StartLoc, IdLoc, Params, SpecializedTemplate, T, TInfo,
  1031. S, Args, NumArgs, ASTArgInfos);
  1032. Result->setSpecializationKind(TSK_ExplicitSpecialization);
  1033. return Result;
  1034. }
  1035. VarTemplatePartialSpecializationDecl *
  1036. VarTemplatePartialSpecializationDecl::CreateDeserialized(ASTContext &C,
  1037. unsigned ID) {
  1038. return new (C, ID) VarTemplatePartialSpecializationDecl(C);
  1039. }