blob: 5e2553613490dda8d2acbd55f79bcb5130ef225f [file] [log] [blame]
Sebastian Redl06a59bb2009-10-23 22:13:42 +00001//===--- DeclTemplate.cpp - Template Declaration AST Node Implementation --===//
Douglas Gregoraaba5e32009-02-04 19:02:06 +00002//
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
Douglas Gregoraaba5e32009-02-04 19:02:06 +000014#include "clang/AST/DeclTemplate.h"
Chandler Carruth55fc8732012-12-04 09:13:33 +000015#include "clang/AST/ASTContext.h"
16#include "clang/AST/ASTMutationListener.h"
17#include "clang/AST/DeclCXX.h"
Douglas Gregor55f6b142009-02-09 18:46:07 +000018#include "clang/AST/Expr.h"
Douglas Gregorb95cc972011-01-04 02:33:52 +000019#include "clang/AST/ExprCXX.h"
John McCall833ca992009-10-29 08:12:44 +000020#include "clang/AST/TypeLoc.h"
Douglas Gregoraaba5e32009-02-04 19:02:06 +000021#include "clang/Basic/IdentifierTable.h"
22#include "llvm/ADT/STLExtras.h"
Douglas Gregor910f8002010-11-07 23:05:16 +000023#include <memory>
Douglas Gregoraaba5e32009-02-04 19:02:06 +000024using namespace clang;
25
26//===----------------------------------------------------------------------===//
27// TemplateParameterList Implementation
28//===----------------------------------------------------------------------===//
29
Douglas Gregorddc29e12009-02-06 22:42:48 +000030TemplateParameterList::TemplateParameterList(SourceLocation TemplateLoc,
31 SourceLocation LAngleLoc,
Douglas Gregorbf4ea562009-09-15 16:23:51 +000032 NamedDecl **Params, unsigned NumParams,
Douglas Gregorddc29e12009-02-06 22:42:48 +000033 SourceLocation RAngleLoc)
34 : TemplateLoc(TemplateLoc), LAngleLoc(LAngleLoc), RAngleLoc(RAngleLoc),
Richard Smith6964b3f2012-09-07 02:06:42 +000035 NumParams(NumParams), ContainsUnexpandedParameterPack(false) {
36 assert(this->NumParams == NumParams && "Too many template parameters");
37 for (unsigned Idx = 0; Idx < NumParams; ++Idx) {
38 NamedDecl *P = Params[Idx];
39 begin()[Idx] = P;
40
41 if (!P->isTemplateParameterPack()) {
42 if (NonTypeTemplateParmDecl *NTTP = dyn_cast<NonTypeTemplateParmDecl>(P))
43 if (NTTP->getType()->containsUnexpandedParameterPack())
44 ContainsUnexpandedParameterPack = true;
45
46 if (TemplateTemplateParmDecl *TTP = dyn_cast<TemplateTemplateParmDecl>(P))
47 if (TTP->getTemplateParameters()->containsUnexpandedParameterPack())
48 ContainsUnexpandedParameterPack = true;
49
50 // FIXME: If a default argument contains an unexpanded parameter pack, the
51 // template parameter list does too.
52 }
53 }
Douglas Gregoraaba5e32009-02-04 19:02:06 +000054}
55
56TemplateParameterList *
Jay Foad4ba2a172011-01-12 09:06:06 +000057TemplateParameterList::Create(const ASTContext &C, SourceLocation TemplateLoc,
Douglas Gregorbf4ea562009-09-15 16:23:51 +000058 SourceLocation LAngleLoc, NamedDecl **Params,
Douglas Gregorddc29e12009-02-06 22:42:48 +000059 unsigned NumParams, SourceLocation RAngleLoc) {
Douglas Gregorbf4ea562009-09-15 16:23:51 +000060 unsigned Size = sizeof(TemplateParameterList)
61 + sizeof(NamedDecl *) * NumParams;
Richard Smith1a30edb2012-08-16 22:51:34 +000062 unsigned Align = std::max(llvm::alignOf<TemplateParameterList>(),
63 llvm::alignOf<NamedDecl*>());
Douglas Gregoraaba5e32009-02-04 19:02:06 +000064 void *Mem = C.Allocate(Size, Align);
Mike Stump1eb44332009-09-09 15:08:12 +000065 return new (Mem) TemplateParameterList(TemplateLoc, LAngleLoc, Params,
Douglas Gregorddc29e12009-02-06 22:42:48 +000066 NumParams, RAngleLoc);
Douglas Gregoraaba5e32009-02-04 19:02:06 +000067}
68
Douglas Gregor62cb18d2009-02-11 18:16:40 +000069unsigned TemplateParameterList::getMinRequiredArguments() const {
Douglas Gregor6952f1e2011-01-19 20:10:05 +000070 unsigned NumRequiredArgs = 0;
71 for (iterator P = const_cast<TemplateParameterList *>(this)->begin(),
72 PEnd = const_cast<TemplateParameterList *>(this)->end();
73 P != PEnd; ++P) {
74 if ((*P)->isTemplateParameterPack()) {
75 if (NonTypeTemplateParmDecl *NTTP = dyn_cast<NonTypeTemplateParmDecl>(*P))
76 if (NTTP->isExpandedParameterPack()) {
77 NumRequiredArgs += NTTP->getNumExpansionTypes();
78 continue;
79 }
80
Douglas Gregor62cb18d2009-02-11 18:16:40 +000081 break;
Douglas Gregor6952f1e2011-01-19 20:10:05 +000082 }
83
84 if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(*P)) {
85 if (TTP->hasDefaultArgument())
86 break;
87 } else if (NonTypeTemplateParmDecl *NTTP
88 = dyn_cast<NonTypeTemplateParmDecl>(*P)) {
89 if (NTTP->hasDefaultArgument())
90 break;
91 } else if (cast<TemplateTemplateParmDecl>(*P)->hasDefaultArgument())
92 break;
93
94 ++NumRequiredArgs;
Douglas Gregor62cb18d2009-02-11 18:16:40 +000095 }
Douglas Gregor6952f1e2011-01-19 20:10:05 +000096
Douglas Gregor62cb18d2009-02-11 18:16:40 +000097 return NumRequiredArgs;
98}
99
Douglas Gregored9c0f92009-10-29 00:04:11 +0000100unsigned TemplateParameterList::getDepth() const {
101 if (size() == 0)
102 return 0;
103
104 const NamedDecl *FirstParm = getParam(0);
105 if (const TemplateTypeParmDecl *TTP
106 = dyn_cast<TemplateTypeParmDecl>(FirstParm))
107 return TTP->getDepth();
108 else if (const NonTypeTemplateParmDecl *NTTP
109 = dyn_cast<NonTypeTemplateParmDecl>(FirstParm))
110 return NTTP->getDepth();
111 else
112 return cast<TemplateTemplateParmDecl>(FirstParm)->getDepth();
113}
114
Douglas Gregor787a40d2011-03-04 18:32:38 +0000115static void AdoptTemplateParameterList(TemplateParameterList *Params,
116 DeclContext *Owner) {
117 for (TemplateParameterList::iterator P = Params->begin(),
118 PEnd = Params->end();
119 P != PEnd; ++P) {
120 (*P)->setDeclContext(Owner);
121
122 if (TemplateTemplateParmDecl *TTP = dyn_cast<TemplateTemplateParmDecl>(*P))
123 AdoptTemplateParameterList(TTP->getTemplateParameters(), Owner);
124 }
125}
126
Douglas Gregoraaba5e32009-02-04 19:02:06 +0000127//===----------------------------------------------------------------------===//
Peter Collingbourne9eabeba2010-07-29 16:11:51 +0000128// RedeclarableTemplateDecl Implementation
129//===----------------------------------------------------------------------===//
130
Dmitri Gribenkob76d9712013-01-23 16:52:57 +0000131RedeclarableTemplateDecl::CommonBase *RedeclarableTemplateDecl::getCommonPtr() const {
Douglas Gregor7c99bb5c2012-01-14 15:13:49 +0000132 if (!Common) {
133 // Walk the previous-declaration chain until we either find a declaration
134 // with a common pointer or we run out of previous declarations.
Dmitri Gribenkob76d9712013-01-23 16:52:57 +0000135 SmallVector<const RedeclarableTemplateDecl *, 2> PrevDecls;
136 for (const RedeclarableTemplateDecl *Prev = getPreviousDecl(); Prev;
Douglas Gregoref96ee02012-01-14 16:38:05 +0000137 Prev = Prev->getPreviousDecl()) {
Douglas Gregor7c99bb5c2012-01-14 15:13:49 +0000138 if (Prev->Common) {
139 Common = Prev->Common;
140 break;
141 }
142
143 PrevDecls.push_back(Prev);
144 }
Peter Collingbourne9eabeba2010-07-29 16:11:51 +0000145
Douglas Gregor7c99bb5c2012-01-14 15:13:49 +0000146 // If we never found a common pointer, allocate one now.
Douglas Gregor8a8950b2012-01-14 15:30:55 +0000147 if (!Common) {
148 // FIXME: If any of the declarations is from an AST file, we probably
149 // need an update record to add the common data.
150
Douglas Gregor7c99bb5c2012-01-14 15:13:49 +0000151 Common = newCommon(getASTContext());
Douglas Gregor8a8950b2012-01-14 15:30:55 +0000152 }
Douglas Gregor7c99bb5c2012-01-14 15:13:49 +0000153
154 // Update any previous declarations we saw with the common pointer.
155 for (unsigned I = 0, N = PrevDecls.size(); I != N; ++I)
156 PrevDecls[I]->Common = Common;
Peter Collingbourne9eabeba2010-07-29 16:11:51 +0000157 }
Peter Collingbourne9eabeba2010-07-29 16:11:51 +0000158
Douglas Gregor7c99bb5c2012-01-14 15:13:49 +0000159 return Common;
Peter Collingbournef88718e2010-07-29 16:12:09 +0000160}
161
Peter Collingbourne40485902010-07-30 17:09:04 +0000162template <class EntryType>
163typename RedeclarableTemplateDecl::SpecEntryTraits<EntryType>::DeclType*
164RedeclarableTemplateDecl::findSpecializationImpl(
Chandler Carruthd964d632012-05-03 23:49:05 +0000165 llvm::FoldingSetVector<EntryType> &Specs,
Peter Collingbourne40485902010-07-30 17:09:04 +0000166 const TemplateArgument *Args, unsigned NumArgs,
167 void *&InsertPos) {
168 typedef SpecEntryTraits<EntryType> SETraits;
169 llvm::FoldingSetNodeID ID;
170 EntryType::Profile(ID,Args,NumArgs, getASTContext());
171 EntryType *Entry = Specs.FindNodeOrInsertPos(ID, InsertPos);
Douglas Gregoref96ee02012-01-14 16:38:05 +0000172 return Entry ? SETraits::getMostRecentDecl(Entry) : 0;
Peter Collingbourne40485902010-07-30 17:09:04 +0000173}
174
Douglas Gregorc494f772011-03-05 17:54:25 +0000175/// \brief Generate the injected template arguments for the given template
176/// parameter list, e.g., for the injected-class-name of a class template.
177static void GenerateInjectedTemplateArgs(ASTContext &Context,
178 TemplateParameterList *Params,
179 TemplateArgument *Args) {
180 for (TemplateParameterList::iterator Param = Params->begin(),
181 ParamEnd = Params->end();
182 Param != ParamEnd; ++Param) {
183 TemplateArgument Arg;
184 if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(*Param)) {
185 QualType ArgType = Context.getTypeDeclType(TTP);
186 if (TTP->isParameterPack())
David Blaikie66874fb2013-02-21 01:47:18 +0000187 ArgType = Context.getPackExpansionType(ArgType, None);
David Blaikiedc84cd52013-02-20 22:23:23 +0000188
Douglas Gregorc494f772011-03-05 17:54:25 +0000189 Arg = TemplateArgument(ArgType);
190 } else if (NonTypeTemplateParmDecl *NTTP =
191 dyn_cast<NonTypeTemplateParmDecl>(*Param)) {
John McCallf4b88a42012-03-10 09:33:50 +0000192 Expr *E = new (Context) DeclRefExpr(NTTP, /*enclosing*/ false,
Douglas Gregorc494f772011-03-05 17:54:25 +0000193 NTTP->getType().getNonLValueExprType(Context),
194 Expr::getValueKindForType(NTTP->getType()),
195 NTTP->getLocation());
196
197 if (NTTP->isParameterPack())
David Blaikie66874fb2013-02-21 01:47:18 +0000198 E = new (Context) PackExpansionExpr(Context.DependentTy, E,
199 NTTP->getLocation(), None);
Douglas Gregorc494f772011-03-05 17:54:25 +0000200 Arg = TemplateArgument(E);
201 } else {
202 TemplateTemplateParmDecl *TTP = cast<TemplateTemplateParmDecl>(*Param);
203 if (TTP->isParameterPack())
David Blaikiedc84cd52013-02-20 22:23:23 +0000204 Arg = TemplateArgument(TemplateName(TTP), Optional<unsigned>());
Douglas Gregorc494f772011-03-05 17:54:25 +0000205 else
206 Arg = TemplateArgument(TemplateName(TTP));
207 }
208
209 if ((*Param)->isTemplateParameterPack())
210 Arg = TemplateArgument::CreatePackCopy(Context, &Arg, 1);
211
212 *Args++ = Arg;
213 }
214}
215
Peter Collingbourne9eabeba2010-07-29 16:11:51 +0000216//===----------------------------------------------------------------------===//
Douglas Gregoraaba5e32009-02-04 19:02:06 +0000217// FunctionTemplateDecl Implementation
218//===----------------------------------------------------------------------===//
219
Douglas Gregor00545312010-05-23 18:26:36 +0000220void FunctionTemplateDecl::DeallocateCommon(void *Ptr) {
221 static_cast<Common *>(Ptr)->~Common();
222}
223
Douglas Gregoraaba5e32009-02-04 19:02:06 +0000224FunctionTemplateDecl *FunctionTemplateDecl::Create(ASTContext &C,
225 DeclContext *DC,
226 SourceLocation L,
227 DeclarationName Name,
Douglas Gregor127102b2009-06-29 20:59:39 +0000228 TemplateParameterList *Params,
Douglas Gregoraaba5e32009-02-04 19:02:06 +0000229 NamedDecl *Decl) {
Douglas Gregor787a40d2011-03-04 18:32:38 +0000230 AdoptTemplateParameterList(Params, cast<DeclContext>(Decl));
Douglas Gregoraaba5e32009-02-04 19:02:06 +0000231 return new (C) FunctionTemplateDecl(DC, L, Name, Params, Decl);
232}
233
Douglas Gregor1e68ecc2012-01-05 21:55:30 +0000234FunctionTemplateDecl *FunctionTemplateDecl::CreateDeserialized(ASTContext &C,
235 unsigned ID) {
236 void *Mem = AllocateDeserializedDecl(C, ID, sizeof(FunctionTemplateDecl));
237 return new (Mem) FunctionTemplateDecl(0, SourceLocation(), DeclarationName(),
238 0, 0);
Douglas Gregor9a299e02011-03-04 17:52:15 +0000239}
240
Argyrios Kyrtzidis6b541512010-09-08 19:31:22 +0000241RedeclarableTemplateDecl::CommonBase *
Dmitri Gribenkob76d9712013-01-23 16:52:57 +0000242FunctionTemplateDecl::newCommon(ASTContext &C) const {
Argyrios Kyrtzidis6b541512010-09-08 19:31:22 +0000243 Common *CommonPtr = new (C) Common;
244 C.AddDeallocation(DeallocateCommon, CommonPtr);
Peter Collingbourne9eabeba2010-07-29 16:11:51 +0000245 return CommonPtr;
246}
247
Argyrios Kyrtzidis2c853e42010-07-20 13:59:58 +0000248FunctionDecl *
249FunctionTemplateDecl::findSpecialization(const TemplateArgument *Args,
250 unsigned NumArgs, void *&InsertPos) {
Peter Collingbourne40485902010-07-30 17:09:04 +0000251 return findSpecializationImpl(getSpecializations(), Args, NumArgs, InsertPos);
Argyrios Kyrtzidis2c853e42010-07-20 13:59:58 +0000252}
253
Sebastian Redl5bbcdbf2011-04-14 14:07:59 +0000254void FunctionTemplateDecl::addSpecialization(
255 FunctionTemplateSpecializationInfo *Info, void *InsertPos) {
Douglas Gregor1e1e9722012-03-28 14:34:23 +0000256 if (InsertPos)
257 getSpecializations().InsertNode(Info, InsertPos);
258 else
259 getSpecializations().GetOrInsertNode(Info);
Sebastian Redl5bbcdbf2011-04-14 14:07:59 +0000260 if (ASTMutationListener *L = getASTMutationListener())
261 L->AddedCXXTemplateSpecialization(this, Info->Function);
262}
263
Douglas Gregorc494f772011-03-05 17:54:25 +0000264std::pair<const TemplateArgument *, unsigned>
265FunctionTemplateDecl::getInjectedTemplateArgs() {
266 TemplateParameterList *Params = getTemplateParameters();
267 Common *CommonPtr = getCommonPtr();
268 if (!CommonPtr->InjectedArgs) {
269 CommonPtr->InjectedArgs
270 = new (getASTContext()) TemplateArgument [Params->size()];
271 GenerateInjectedTemplateArgs(getASTContext(), Params,
272 CommonPtr->InjectedArgs);
273 }
274
275 return std::make_pair(CommonPtr->InjectedArgs, Params->size());
276}
277
Douglas Gregoraaba5e32009-02-04 19:02:06 +0000278//===----------------------------------------------------------------------===//
279// ClassTemplateDecl Implementation
280//===----------------------------------------------------------------------===//
281
Douglas Gregor00545312010-05-23 18:26:36 +0000282void ClassTemplateDecl::DeallocateCommon(void *Ptr) {
283 static_cast<Common *>(Ptr)->~Common();
284}
285
Douglas Gregoraaba5e32009-02-04 19:02:06 +0000286ClassTemplateDecl *ClassTemplateDecl::Create(ASTContext &C,
287 DeclContext *DC,
288 SourceLocation L,
289 DeclarationName Name,
290 TemplateParameterList *Params,
Douglas Gregor5953d8b2009-03-19 17:26:29 +0000291 NamedDecl *Decl,
292 ClassTemplateDecl *PrevDecl) {
Douglas Gregor787a40d2011-03-04 18:32:38 +0000293 AdoptTemplateParameterList(Params, cast<DeclContext>(Decl));
Argyrios Kyrtzidis8731ca72010-06-19 19:29:09 +0000294 ClassTemplateDecl *New = new (C) ClassTemplateDecl(DC, L, Name, Params, Decl);
Argyrios Kyrtzidis5bf1bdc2010-06-21 10:57:41 +0000295 New->setPreviousDeclaration(PrevDecl);
Argyrios Kyrtzidis8731ca72010-06-19 19:29:09 +0000296 return New;
Douglas Gregor5953d8b2009-03-19 17:26:29 +0000297}
298
Douglas Gregor1e68ecc2012-01-05 21:55:30 +0000299ClassTemplateDecl *ClassTemplateDecl::CreateDeserialized(ASTContext &C,
300 unsigned ID) {
301 void *Mem = AllocateDeserializedDecl(C, ID, sizeof(ClassTemplateDecl));
302 return new (Mem) ClassTemplateDecl(EmptyShell());
Douglas Gregor9a299e02011-03-04 17:52:15 +0000303}
304
Dmitri Gribenkoe252a892013-02-14 13:20:36 +0000305void ClassTemplateDecl::LoadLazySpecializations() const {
Douglas Gregorc8e5cf82010-10-27 22:21:36 +0000306 Common *CommonPtr = getCommonPtr();
307 if (CommonPtr->LazySpecializations) {
308 ASTContext &Context = getASTContext();
309 uint32_t *Specs = CommonPtr->LazySpecializations;
310 CommonPtr->LazySpecializations = 0;
311 for (uint32_t I = 0, N = *Specs++; I != N; ++I)
312 (void)Context.getExternalSource()->GetExternalDecl(Specs[I]);
313 }
314}
315
Chandler Carruthd964d632012-05-03 23:49:05 +0000316llvm::FoldingSetVector<ClassTemplateSpecializationDecl> &
Dmitri Gribenkoe252a892013-02-14 13:20:36 +0000317ClassTemplateDecl::getSpecializations() const {
Douglas Gregorc8e5cf82010-10-27 22:21:36 +0000318 LoadLazySpecializations();
319 return getCommonPtr()->Specializations;
320}
321
Chandler Carruthd964d632012-05-03 23:49:05 +0000322llvm::FoldingSetVector<ClassTemplatePartialSpecializationDecl> &
Douglas Gregorc8e5cf82010-10-27 22:21:36 +0000323ClassTemplateDecl::getPartialSpecializations() {
324 LoadLazySpecializations();
325 return getCommonPtr()->PartialSpecializations;
326}
327
Argyrios Kyrtzidis6b541512010-09-08 19:31:22 +0000328RedeclarableTemplateDecl::CommonBase *
Dmitri Gribenkob76d9712013-01-23 16:52:57 +0000329ClassTemplateDecl::newCommon(ASTContext &C) const {
Argyrios Kyrtzidis6b541512010-09-08 19:31:22 +0000330 Common *CommonPtr = new (C) Common;
331 C.AddDeallocation(DeallocateCommon, CommonPtr);
Peter Collingbourne9eabeba2010-07-29 16:11:51 +0000332 return CommonPtr;
333}
334
Argyrios Kyrtzidiscc0b1bc2010-07-20 13:59:28 +0000335ClassTemplateSpecializationDecl *
336ClassTemplateDecl::findSpecialization(const TemplateArgument *Args,
337 unsigned NumArgs, void *&InsertPos) {
Peter Collingbourne40485902010-07-30 17:09:04 +0000338 return findSpecializationImpl(getSpecializations(), Args, NumArgs, InsertPos);
Argyrios Kyrtzidiscc0b1bc2010-07-20 13:59:28 +0000339}
340
Argyrios Kyrtzidisbef1a7b2010-10-28 07:38:42 +0000341void ClassTemplateDecl::AddSpecialization(ClassTemplateSpecializationDecl *D,
342 void *InsertPos) {
Douglas Gregor1e1e9722012-03-28 14:34:23 +0000343 if (InsertPos)
344 getSpecializations().InsertNode(D, InsertPos);
345 else {
346 ClassTemplateSpecializationDecl *Existing
347 = getSpecializations().GetOrInsertNode(D);
348 (void)Existing;
349 assert(Existing->isCanonicalDecl() && "Non-canonical specialization?");
350 }
Argyrios Kyrtzidisbef1a7b2010-10-28 07:38:42 +0000351 if (ASTMutationListener *L = getASTMutationListener())
352 L->AddedCXXTemplateSpecialization(this, D);
353}
354
Argyrios Kyrtzidiscc0b1bc2010-07-20 13:59:28 +0000355ClassTemplatePartialSpecializationDecl *
356ClassTemplateDecl::findPartialSpecialization(const TemplateArgument *Args,
357 unsigned NumArgs,
358 void *&InsertPos) {
Peter Collingbourne40485902010-07-30 17:09:04 +0000359 return findSpecializationImpl(getPartialSpecializations(), Args, NumArgs,
360 InsertPos);
Argyrios Kyrtzidiscc0b1bc2010-07-20 13:59:28 +0000361}
362
Argyrios Kyrtzidisbef1a7b2010-10-28 07:38:42 +0000363void ClassTemplateDecl::AddPartialSpecialization(
364 ClassTemplatePartialSpecializationDecl *D,
365 void *InsertPos) {
Douglas Gregor1e1e9722012-03-28 14:34:23 +0000366 if (InsertPos)
367 getPartialSpecializations().InsertNode(D, InsertPos);
368 else {
369 ClassTemplatePartialSpecializationDecl *Existing
370 = getPartialSpecializations().GetOrInsertNode(D);
371 (void)Existing;
372 assert(Existing->isCanonicalDecl() && "Non-canonical specialization?");
373 }
374
Argyrios Kyrtzidisbef1a7b2010-10-28 07:38:42 +0000375 if (ASTMutationListener *L = getASTMutationListener())
376 L->AddedCXXTemplateSpecialization(this, D);
377}
378
Douglas Gregordc60c1e2010-04-30 05:56:50 +0000379void ClassTemplateDecl::getPartialSpecializations(
Chris Lattner5f9e2722011-07-23 10:55:15 +0000380 SmallVectorImpl<ClassTemplatePartialSpecializationDecl *> &PS) {
Chandler Carruthd964d632012-05-03 23:49:05 +0000381 llvm::FoldingSetVector<ClassTemplatePartialSpecializationDecl> &PartialSpecs
Argyrios Kyrtzidis5bf1bdc2010-06-21 10:57:41 +0000382 = getPartialSpecializations();
Douglas Gregordc60c1e2010-04-30 05:56:50 +0000383 PS.clear();
384 PS.resize(PartialSpecs.size());
Chandler Carruthd964d632012-05-03 23:49:05 +0000385 for (llvm::FoldingSetVector<ClassTemplatePartialSpecializationDecl>::iterator
Douglas Gregordc60c1e2010-04-30 05:56:50 +0000386 P = PartialSpecs.begin(), PEnd = PartialSpecs.end();
387 P != PEnd; ++P) {
388 assert(!PS[P->getSequenceNumber()]);
Douglas Gregoref96ee02012-01-14 16:38:05 +0000389 PS[P->getSequenceNumber()] = P->getMostRecentDecl();
Douglas Gregordc60c1e2010-04-30 05:56:50 +0000390 }
391}
392
Douglas Gregorb88e8882009-07-30 17:40:51 +0000393ClassTemplatePartialSpecializationDecl *
394ClassTemplateDecl::findPartialSpecialization(QualType T) {
395 ASTContext &Context = getASTContext();
Chandler Carruthd964d632012-05-03 23:49:05 +0000396 using llvm::FoldingSetVector;
397 typedef FoldingSetVector<ClassTemplatePartialSpecializationDecl>::iterator
Douglas Gregorb88e8882009-07-30 17:40:51 +0000398 partial_spec_iterator;
399 for (partial_spec_iterator P = getPartialSpecializations().begin(),
400 PEnd = getPartialSpecializations().end();
401 P != PEnd; ++P) {
John McCall31f17ec2010-04-27 00:57:59 +0000402 if (Context.hasSameType(P->getInjectedSpecializationType(), T))
Douglas Gregoref96ee02012-01-14 16:38:05 +0000403 return P->getMostRecentDecl();
Argyrios Kyrtzidiscc0b1bc2010-07-20 13:59:28 +0000404 }
405
406 return 0;
407}
408
409ClassTemplatePartialSpecializationDecl *
410ClassTemplateDecl::findPartialSpecInstantiatedFromMember(
411 ClassTemplatePartialSpecializationDecl *D) {
412 Decl *DCanon = D->getCanonicalDecl();
Chandler Carruthd964d632012-05-03 23:49:05 +0000413 for (llvm::FoldingSetVector<ClassTemplatePartialSpecializationDecl>::iterator
Argyrios Kyrtzidiscc0b1bc2010-07-20 13:59:28 +0000414 P = getPartialSpecializations().begin(),
415 PEnd = getPartialSpecializations().end();
416 P != PEnd; ++P) {
417 if (P->getInstantiatedFromMember()->getCanonicalDecl() == DCanon)
Douglas Gregoref96ee02012-01-14 16:38:05 +0000418 return P->getMostRecentDecl();
Douglas Gregorb88e8882009-07-30 17:40:51 +0000419 }
Mike Stump1eb44332009-09-09 15:08:12 +0000420
Douglas Gregorb88e8882009-07-30 17:40:51 +0000421 return 0;
422}
423
John McCall3cb0ebd2010-03-10 03:28:59 +0000424QualType
Douglas Gregor24bae922010-07-08 18:37:38 +0000425ClassTemplateDecl::getInjectedClassNameSpecialization() {
Argyrios Kyrtzidis5bf1bdc2010-06-21 10:57:41 +0000426 Common *CommonPtr = getCommonPtr();
Douglas Gregor7da97d02009-05-10 22:57:19 +0000427 if (!CommonPtr->InjectedClassNameType.isNull())
428 return CommonPtr->InjectedClassNameType;
429
Douglas Gregorb7d09d62010-12-23 16:00:30 +0000430 // C++0x [temp.dep.type]p2:
431 // The template argument list of a primary template is a template argument
432 // list in which the nth template argument has the value of the nth template
433 // parameter of the class template. If the nth template parameter is a
434 // template parameter pack (14.5.3), the nth template argument is a pack
435 // expansion (14.5.3) whose pattern is the name of the template parameter
436 // pack.
Douglas Gregor24bae922010-07-08 18:37:38 +0000437 ASTContext &Context = getASTContext();
Douglas Gregor7da97d02009-05-10 22:57:19 +0000438 TemplateParameterList *Params = getTemplateParameters();
Chris Lattner5f9e2722011-07-23 10:55:15 +0000439 SmallVector<TemplateArgument, 16> TemplateArgs;
Douglas Gregorc494f772011-03-05 17:54:25 +0000440 TemplateArgs.resize(Params->size());
441 GenerateInjectedTemplateArgs(getASTContext(), Params, TemplateArgs.data());
Douglas Gregor7da97d02009-05-10 22:57:19 +0000442 CommonPtr->InjectedClassNameType
Douglas Gregor1275ae02009-07-28 23:00:59 +0000443 = Context.getTemplateSpecializationType(TemplateName(this),
Douglas Gregor7da97d02009-05-10 22:57:19 +0000444 &TemplateArgs[0],
Douglas Gregor1275ae02009-07-28 23:00:59 +0000445 TemplateArgs.size());
Douglas Gregor7da97d02009-05-10 22:57:19 +0000446 return CommonPtr->InjectedClassNameType;
447}
448
Douglas Gregoraaba5e32009-02-04 19:02:06 +0000449//===----------------------------------------------------------------------===//
450// TemplateTypeParm Allocation/Deallocation Method Implementations
451//===----------------------------------------------------------------------===//
452
453TemplateTypeParmDecl *
Jay Foad4ba2a172011-01-12 09:06:06 +0000454TemplateTypeParmDecl::Create(const ASTContext &C, DeclContext *DC,
Abramo Bagnara344577e2011-03-06 15:48:19 +0000455 SourceLocation KeyLoc, SourceLocation NameLoc,
456 unsigned D, unsigned P, IdentifierInfo *Id,
457 bool Typename, bool ParameterPack) {
Chandler Carruth4fb86f82011-05-01 00:51:33 +0000458 TemplateTypeParmDecl *TTPDecl =
459 new (C) TemplateTypeParmDecl(DC, KeyLoc, NameLoc, Id, Typename);
460 QualType TTPType = C.getTemplateTypeParmType(D, P, ParameterPack, TTPDecl);
461 TTPDecl->TypeForDecl = TTPType.getTypePtr();
462 return TTPDecl;
Douglas Gregoraaba5e32009-02-04 19:02:06 +0000463}
464
Argyrios Kyrtzidisb8b03e62010-07-02 11:54:55 +0000465TemplateTypeParmDecl *
Douglas Gregor1e68ecc2012-01-05 21:55:30 +0000466TemplateTypeParmDecl::CreateDeserialized(const ASTContext &C, unsigned ID) {
467 void *Mem = AllocateDeserializedDecl(C, ID, sizeof(TemplateTypeParmDecl));
468 return new (Mem) TemplateTypeParmDecl(0, SourceLocation(), SourceLocation(),
469 0, false);
Argyrios Kyrtzidisb8b03e62010-07-02 11:54:55 +0000470}
471
John McCall833ca992009-10-29 08:12:44 +0000472SourceLocation TemplateTypeParmDecl::getDefaultArgumentLoc() const {
Abramo Bagnara77d4ee22011-03-04 12:42:03 +0000473 return hasDefaultArgument()
474 ? DefaultArgument->getTypeLoc().getBeginLoc()
475 : SourceLocation();
476}
477
478SourceRange TemplateTypeParmDecl::getSourceRange() const {
479 if (hasDefaultArgument() && !defaultArgumentWasInherited())
Abramo Bagnara344577e2011-03-06 15:48:19 +0000480 return SourceRange(getLocStart(),
Abramo Bagnara77d4ee22011-03-04 12:42:03 +0000481 DefaultArgument->getTypeLoc().getEndLoc());
482 else
Abramo Bagnara344577e2011-03-06 15:48:19 +0000483 return TypeDecl::getSourceRange();
John McCall833ca992009-10-29 08:12:44 +0000484}
485
Douglas Gregored9c0f92009-10-29 00:04:11 +0000486unsigned TemplateTypeParmDecl::getDepth() const {
487 return TypeForDecl->getAs<TemplateTypeParmType>()->getDepth();
488}
489
490unsigned TemplateTypeParmDecl::getIndex() const {
491 return TypeForDecl->getAs<TemplateTypeParmType>()->getIndex();
492}
493
Chandler Carruth4fb86f82011-05-01 00:51:33 +0000494bool TemplateTypeParmDecl::isParameterPack() const {
495 return TypeForDecl->getAs<TemplateTypeParmType>()->isParameterPack();
496}
497
Douglas Gregoraaba5e32009-02-04 19:02:06 +0000498//===----------------------------------------------------------------------===//
499// NonTypeTemplateParmDecl Method Implementations
500//===----------------------------------------------------------------------===//
501
Douglas Gregor6952f1e2011-01-19 20:10:05 +0000502NonTypeTemplateParmDecl::NonTypeTemplateParmDecl(DeclContext *DC,
Abramo Bagnaraff676cb2011-03-08 08:55:46 +0000503 SourceLocation StartLoc,
504 SourceLocation IdLoc,
505 unsigned D, unsigned P,
506 IdentifierInfo *Id,
Douglas Gregor6952f1e2011-01-19 20:10:05 +0000507 QualType T,
508 TypeSourceInfo *TInfo,
509 const QualType *ExpandedTypes,
510 unsigned NumExpandedTypes,
511 TypeSourceInfo **ExpandedTInfos)
Abramo Bagnaraff676cb2011-03-08 08:55:46 +0000512 : DeclaratorDecl(NonTypeTemplateParm, DC, IdLoc, Id, T, TInfo, StartLoc),
Douglas Gregor6952f1e2011-01-19 20:10:05 +0000513 TemplateParmPosition(D, P), DefaultArgumentAndInherited(0, false),
514 ParameterPack(true), ExpandedParameterPack(true),
515 NumExpandedTypes(NumExpandedTypes)
516{
517 if (ExpandedTypes && ExpandedTInfos) {
518 void **TypesAndInfos = reinterpret_cast<void **>(this + 1);
519 for (unsigned I = 0; I != NumExpandedTypes; ++I) {
520 TypesAndInfos[2*I] = ExpandedTypes[I].getAsOpaquePtr();
521 TypesAndInfos[2*I + 1] = ExpandedTInfos[I];
522 }
523 }
524}
525
Douglas Gregoraaba5e32009-02-04 19:02:06 +0000526NonTypeTemplateParmDecl *
Jay Foad4ba2a172011-01-12 09:06:06 +0000527NonTypeTemplateParmDecl::Create(const ASTContext &C, DeclContext *DC,
Abramo Bagnaraff676cb2011-03-08 08:55:46 +0000528 SourceLocation StartLoc, SourceLocation IdLoc,
529 unsigned D, unsigned P, IdentifierInfo *Id,
530 QualType T, bool ParameterPack,
531 TypeSourceInfo *TInfo) {
532 return new (C) NonTypeTemplateParmDecl(DC, StartLoc, IdLoc, D, P, Id,
533 T, ParameterPack, TInfo);
Douglas Gregoraaba5e32009-02-04 19:02:06 +0000534}
535
Douglas Gregor6952f1e2011-01-19 20:10:05 +0000536NonTypeTemplateParmDecl *
537NonTypeTemplateParmDecl::Create(const ASTContext &C, DeclContext *DC,
Abramo Bagnaraff676cb2011-03-08 08:55:46 +0000538 SourceLocation StartLoc, SourceLocation IdLoc,
539 unsigned D, unsigned P,
Douglas Gregor6952f1e2011-01-19 20:10:05 +0000540 IdentifierInfo *Id, QualType T,
541 TypeSourceInfo *TInfo,
542 const QualType *ExpandedTypes,
543 unsigned NumExpandedTypes,
544 TypeSourceInfo **ExpandedTInfos) {
545 unsigned Size = sizeof(NonTypeTemplateParmDecl)
546 + NumExpandedTypes * 2 * sizeof(void*);
547 void *Mem = C.Allocate(Size);
Abramo Bagnaraff676cb2011-03-08 08:55:46 +0000548 return new (Mem) NonTypeTemplateParmDecl(DC, StartLoc, IdLoc,
549 D, P, Id, T, TInfo,
Douglas Gregor6952f1e2011-01-19 20:10:05 +0000550 ExpandedTypes, NumExpandedTypes,
551 ExpandedTInfos);
552}
553
Douglas Gregor1e68ecc2012-01-05 21:55:30 +0000554NonTypeTemplateParmDecl *
555NonTypeTemplateParmDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
556 void *Mem = AllocateDeserializedDecl(C, ID, sizeof(NonTypeTemplateParmDecl));
557 return new (Mem) NonTypeTemplateParmDecl(0, SourceLocation(),
558 SourceLocation(), 0, 0, 0,
559 QualType(), false, 0);
560}
561
562NonTypeTemplateParmDecl *
563NonTypeTemplateParmDecl::CreateDeserialized(ASTContext &C, unsigned ID,
564 unsigned NumExpandedTypes) {
565 unsigned Size = sizeof(NonTypeTemplateParmDecl)
566 + NumExpandedTypes * 2 * sizeof(void*);
567
568 void *Mem = AllocateDeserializedDecl(C, ID, Size);
569 return new (Mem) NonTypeTemplateParmDecl(0, SourceLocation(),
570 SourceLocation(), 0, 0, 0,
571 QualType(), 0, 0, NumExpandedTypes,
572 0);
573}
574
John McCall76a40212011-02-09 01:13:10 +0000575SourceRange NonTypeTemplateParmDecl::getSourceRange() const {
Abramo Bagnaraee4bfd42011-03-04 11:03:48 +0000576 if (hasDefaultArgument() && !defaultArgumentWasInherited())
Abramo Bagnaraa2026c92011-03-08 16:41:52 +0000577 return SourceRange(getOuterLocStart(),
578 getDefaultArgument()->getSourceRange().getEnd());
579 return DeclaratorDecl::getSourceRange();
John McCall76a40212011-02-09 01:13:10 +0000580}
581
Douglas Gregord684b002009-02-10 19:49:53 +0000582SourceLocation NonTypeTemplateParmDecl::getDefaultArgumentLoc() const {
Abramo Bagnarad92f7a22010-06-09 09:26:05 +0000583 return hasDefaultArgument()
584 ? getDefaultArgument()->getSourceRange().getBegin()
585 : SourceLocation();
Douglas Gregord684b002009-02-10 19:49:53 +0000586}
587
Douglas Gregoraaba5e32009-02-04 19:02:06 +0000588//===----------------------------------------------------------------------===//
589// TemplateTemplateParmDecl Method Implementations
590//===----------------------------------------------------------------------===//
591
David Blaikie99ba9e32011-12-20 02:48:34 +0000592void TemplateTemplateParmDecl::anchor() { }
593
Richard Smith6964b3f2012-09-07 02:06:42 +0000594TemplateTemplateParmDecl::TemplateTemplateParmDecl(
595 DeclContext *DC, SourceLocation L, unsigned D, unsigned P,
596 IdentifierInfo *Id, TemplateParameterList *Params,
597 unsigned NumExpansions, TemplateParameterList * const *Expansions)
598 : TemplateDecl(TemplateTemplateParm, DC, L, Id, Params),
599 TemplateParmPosition(D, P), DefaultArgument(),
600 DefaultArgumentWasInherited(false), ParameterPack(true),
601 ExpandedParameterPack(true), NumExpandedParams(NumExpansions) {
602 if (Expansions)
603 std::memcpy(reinterpret_cast<void*>(this + 1), Expansions,
604 sizeof(TemplateParameterList*) * NumExpandedParams);
605}
606
Douglas Gregoraaba5e32009-02-04 19:02:06 +0000607TemplateTemplateParmDecl *
Jay Foad4ba2a172011-01-12 09:06:06 +0000608TemplateTemplateParmDecl::Create(const ASTContext &C, DeclContext *DC,
Douglas Gregoraaba5e32009-02-04 19:02:06 +0000609 SourceLocation L, unsigned D, unsigned P,
Douglas Gregor61c4d282011-01-05 15:48:55 +0000610 bool ParameterPack, IdentifierInfo *Id,
Douglas Gregoraaba5e32009-02-04 19:02:06 +0000611 TemplateParameterList *Params) {
Douglas Gregor61c4d282011-01-05 15:48:55 +0000612 return new (C) TemplateTemplateParmDecl(DC, L, D, P, ParameterPack, Id,
613 Params);
Douglas Gregoraaba5e32009-02-04 19:02:06 +0000614}
615
Douglas Gregor1e68ecc2012-01-05 21:55:30 +0000616TemplateTemplateParmDecl *
Richard Smith6964b3f2012-09-07 02:06:42 +0000617TemplateTemplateParmDecl::Create(const ASTContext &C, DeclContext *DC,
618 SourceLocation L, unsigned D, unsigned P,
619 IdentifierInfo *Id,
620 TemplateParameterList *Params,
Dmitri Gribenkocfa88f82013-01-12 19:30:44 +0000621 ArrayRef<TemplateParameterList *> Expansions) {
Richard Smith6964b3f2012-09-07 02:06:42 +0000622 void *Mem = C.Allocate(sizeof(TemplateTemplateParmDecl) +
623 sizeof(TemplateParameterList*) * Expansions.size());
624 return new (Mem) TemplateTemplateParmDecl(DC, L, D, P, Id, Params,
625 Expansions.size(),
626 Expansions.data());
627}
628
629TemplateTemplateParmDecl *
Douglas Gregor1e68ecc2012-01-05 21:55:30 +0000630TemplateTemplateParmDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
631 void *Mem = AllocateDeserializedDecl(C, ID, sizeof(TemplateTemplateParmDecl));
632 return new (Mem) TemplateTemplateParmDecl(0, SourceLocation(), 0, 0, false,
633 0, 0);
634}
635
Richard Smith6964b3f2012-09-07 02:06:42 +0000636TemplateTemplateParmDecl *
637TemplateTemplateParmDecl::CreateDeserialized(ASTContext &C, unsigned ID,
638 unsigned NumExpansions) {
639 unsigned Size = sizeof(TemplateTemplateParmDecl) +
640 sizeof(TemplateParameterList*) * NumExpansions;
641 void *Mem = AllocateDeserializedDecl(C, ID, Size);
642 return new (Mem) TemplateTemplateParmDecl(0, SourceLocation(), 0, 0, 0, 0,
643 NumExpansions, 0);
644}
645
Douglas Gregor3e00bad2009-02-17 01:05:43 +0000646//===----------------------------------------------------------------------===//
Douglas Gregor7e063902009-05-11 23:53:27 +0000647// TemplateArgumentList Implementation
648//===----------------------------------------------------------------------===//
Douglas Gregor910f8002010-11-07 23:05:16 +0000649TemplateArgumentList *
650TemplateArgumentList::CreateCopy(ASTContext &Context,
651 const TemplateArgument *Args,
652 unsigned NumArgs) {
653 std::size_t Size = sizeof(TemplateArgumentList)
654 + NumArgs * sizeof(TemplateArgument);
655 void *Mem = Context.Allocate(Size);
656 TemplateArgument *StoredArgs
657 = reinterpret_cast<TemplateArgument *>(
658 static_cast<TemplateArgumentList *>(Mem) + 1);
659 std::uninitialized_copy(Args, Args + NumArgs, StoredArgs);
660 return new (Mem) TemplateArgumentList(StoredArgs, NumArgs, true);
Argyrios Kyrtzidis94d228d2010-06-23 13:48:23 +0000661}
662
Argyrios Kyrtzidis71a76052011-09-22 20:07:09 +0000663FunctionTemplateSpecializationInfo *
664FunctionTemplateSpecializationInfo::Create(ASTContext &C, FunctionDecl *FD,
665 FunctionTemplateDecl *Template,
666 TemplateSpecializationKind TSK,
667 const TemplateArgumentList *TemplateArgs,
668 const TemplateArgumentListInfo *TemplateArgsAsWritten,
669 SourceLocation POI) {
670 const ASTTemplateArgumentListInfo *ArgsAsWritten = 0;
671 if (TemplateArgsAsWritten)
672 ArgsAsWritten = ASTTemplateArgumentListInfo::Create(C,
673 *TemplateArgsAsWritten);
674
675 return new (C) FunctionTemplateSpecializationInfo(FD, Template, TSK,
676 TemplateArgs,
677 ArgsAsWritten,
678 POI);
679}
680
Douglas Gregor7e063902009-05-11 23:53:27 +0000681//===----------------------------------------------------------------------===//
David Blaikie99ba9e32011-12-20 02:48:34 +0000682// TemplateDecl Implementation
683//===----------------------------------------------------------------------===//
684
685void TemplateDecl::anchor() { }
686
687//===----------------------------------------------------------------------===//
Douglas Gregor3e00bad2009-02-17 01:05:43 +0000688// ClassTemplateSpecializationDecl Implementation
689//===----------------------------------------------------------------------===//
690ClassTemplateSpecializationDecl::
Douglas Gregor13c85772010-05-06 00:28:52 +0000691ClassTemplateSpecializationDecl(ASTContext &Context, Kind DK, TagKind TK,
Abramo Bagnaraba877ad2011-03-09 14:09:51 +0000692 DeclContext *DC, SourceLocation StartLoc,
693 SourceLocation IdLoc,
Douglas Gregor3e00bad2009-02-17 01:05:43 +0000694 ClassTemplateDecl *SpecializedTemplate,
Douglas Gregor910f8002010-11-07 23:05:16 +0000695 const TemplateArgument *Args,
696 unsigned NumArgs,
Douglas Gregor8e9e9ef2009-07-29 23:36:44 +0000697 ClassTemplateSpecializationDecl *PrevDecl)
Abramo Bagnaraba877ad2011-03-09 14:09:51 +0000698 : CXXRecordDecl(DK, TK, DC, StartLoc, IdLoc,
Douglas Gregor8e9e9ef2009-07-29 23:36:44 +0000699 SpecializedTemplate->getIdentifier(),
700 PrevDecl),
Douglas Gregor3e00bad2009-02-17 01:05:43 +0000701 SpecializedTemplate(SpecializedTemplate),
Abramo Bagnarac98971d2010-06-12 07:44:57 +0000702 ExplicitInfo(0),
Douglas Gregor910f8002010-11-07 23:05:16 +0000703 TemplateArgs(TemplateArgumentList::CreateCopy(Context, Args, NumArgs)),
Douglas Gregor7e063902009-05-11 23:53:27 +0000704 SpecializationKind(TSK_Undeclared) {
Douglas Gregor3e00bad2009-02-17 01:05:43 +0000705}
Mike Stump1eb44332009-09-09 15:08:12 +0000706
Argyrios Kyrtzidis94d228d2010-06-23 13:48:23 +0000707ClassTemplateSpecializationDecl::ClassTemplateSpecializationDecl(Kind DK)
Abramo Bagnaraba877ad2011-03-09 14:09:51 +0000708 : CXXRecordDecl(DK, TTK_Struct, 0, SourceLocation(), SourceLocation(), 0, 0),
Argyrios Kyrtzidis94d228d2010-06-23 13:48:23 +0000709 ExplicitInfo(0),
710 SpecializationKind(TSK_Undeclared) {
711}
712
Douglas Gregor3e00bad2009-02-17 01:05:43 +0000713ClassTemplateSpecializationDecl *
Douglas Gregor13c85772010-05-06 00:28:52 +0000714ClassTemplateSpecializationDecl::Create(ASTContext &Context, TagKind TK,
Abramo Bagnaraba877ad2011-03-09 14:09:51 +0000715 DeclContext *DC,
716 SourceLocation StartLoc,
717 SourceLocation IdLoc,
Douglas Gregor3e00bad2009-02-17 01:05:43 +0000718 ClassTemplateDecl *SpecializedTemplate,
Douglas Gregor910f8002010-11-07 23:05:16 +0000719 const TemplateArgument *Args,
720 unsigned NumArgs,
Douglas Gregorcc636682009-02-17 23:15:12 +0000721 ClassTemplateSpecializationDecl *PrevDecl) {
Douglas Gregorcc636682009-02-17 23:15:12 +0000722 ClassTemplateSpecializationDecl *Result
Mike Stump1eb44332009-09-09 15:08:12 +0000723 = new (Context)ClassTemplateSpecializationDecl(Context,
Douglas Gregorc8ab2562009-05-31 09:31:02 +0000724 ClassTemplateSpecialization,
Abramo Bagnaraba877ad2011-03-09 14:09:51 +0000725 TK, DC, StartLoc, IdLoc,
Douglas Gregor7e063902009-05-11 23:53:27 +0000726 SpecializedTemplate,
Douglas Gregor910f8002010-11-07 23:05:16 +0000727 Args, NumArgs,
Douglas Gregor8e9e9ef2009-07-29 23:36:44 +0000728 PrevDecl);
Douglas Gregor6bd99292013-02-09 01:35:03 +0000729 Result->MayHaveOutOfDateDef = false;
730
Douglas Gregorcc636682009-02-17 23:15:12 +0000731 Context.getTypeDeclType(Result, PrevDecl);
732 return Result;
Douglas Gregor3e00bad2009-02-17 01:05:43 +0000733}
Douglas Gregorc8ab2562009-05-31 09:31:02 +0000734
Argyrios Kyrtzidis94d228d2010-06-23 13:48:23 +0000735ClassTemplateSpecializationDecl *
Douglas Gregor1e68ecc2012-01-05 21:55:30 +0000736ClassTemplateSpecializationDecl::CreateDeserialized(ASTContext &C,
737 unsigned ID) {
738 void *Mem = AllocateDeserializedDecl(C, ID,
739 sizeof(ClassTemplateSpecializationDecl));
Douglas Gregor6bd99292013-02-09 01:35:03 +0000740 ClassTemplateSpecializationDecl *Result =
741 new (Mem) ClassTemplateSpecializationDecl(ClassTemplateSpecialization);
742 Result->MayHaveOutOfDateDef = false;
743 return Result;
Argyrios Kyrtzidis94d228d2010-06-23 13:48:23 +0000744}
745
Douglas Gregorda2142f2011-02-19 18:51:44 +0000746void
747ClassTemplateSpecializationDecl::getNameForDiagnostic(std::string &S,
748 const PrintingPolicy &Policy,
749 bool Qualified) const {
750 NamedDecl::getNameForDiagnostic(S, Policy, Qualified);
751
752 const TemplateArgumentList &TemplateArgs = getTemplateArgs();
753 S += TemplateSpecializationType::PrintTemplateArgumentList(
754 TemplateArgs.data(),
755 TemplateArgs.size(),
756 Policy);
757}
758
Douglas Gregor37d93e92009-08-02 23:24:31 +0000759ClassTemplateDecl *
Mike Stump1eb44332009-09-09 15:08:12 +0000760ClassTemplateSpecializationDecl::getSpecializedTemplate() const {
761 if (SpecializedPartialSpecialization *PartialSpec
Douglas Gregor37d93e92009-08-02 23:24:31 +0000762 = SpecializedTemplate.dyn_cast<SpecializedPartialSpecialization*>())
763 return PartialSpec->PartialSpecialization->getSpecializedTemplate();
764 return SpecializedTemplate.get<ClassTemplateDecl*>();
765}
766
Abramo Bagnara4a85a732011-03-04 14:20:30 +0000767SourceRange
768ClassTemplateSpecializationDecl::getSourceRange() const {
Abramo Bagnara09d82122011-10-03 20:34:03 +0000769 if (ExplicitInfo) {
Abramo Bagnarab2e80012012-10-15 21:06:42 +0000770 SourceLocation Begin = getTemplateKeywordLoc();
771 if (Begin.isValid()) {
772 // Here we have an explicit (partial) specialization or instantiation.
773 assert(getSpecializationKind() == TSK_ExplicitSpecialization ||
774 getSpecializationKind() == TSK_ExplicitInstantiationDeclaration ||
775 getSpecializationKind() == TSK_ExplicitInstantiationDefinition);
776 if (getExternLoc().isValid())
777 Begin = getExternLoc();
778 SourceLocation End = getRBraceLoc();
779 if (End.isInvalid())
780 End = getTypeAsWritten()->getTypeLoc().getEndLoc();
781 return SourceRange(Begin, End);
782 }
783 // An implicit instantiation of a class template partial specialization
784 // uses ExplicitInfo to record the TypeAsWritten, but the source
785 // locations should be retrieved from the instantiation pattern.
786 typedef ClassTemplatePartialSpecializationDecl CTPSDecl;
787 CTPSDecl *ctpsd = const_cast<CTPSDecl*>(cast<CTPSDecl>(this));
788 CTPSDecl *inst_from = ctpsd->getInstantiatedFromMember();
789 assert(inst_from != 0);
790 return inst_from->getSourceRange();
Abramo Bagnara09d82122011-10-03 20:34:03 +0000791 }
792 else {
793 // No explicit info available.
794 llvm::PointerUnion<ClassTemplateDecl *,
795 ClassTemplatePartialSpecializationDecl *>
796 inst_from = getInstantiatedFrom();
797 if (inst_from.isNull())
798 return getSpecializedTemplate()->getSourceRange();
799 if (ClassTemplateDecl *ctd = inst_from.dyn_cast<ClassTemplateDecl*>())
800 return ctd->getSourceRange();
801 return inst_from.get<ClassTemplatePartialSpecializationDecl*>()
802 ->getSourceRange();
803 }
Abramo Bagnara4a85a732011-03-04 14:20:30 +0000804}
805
Douglas Gregorc8ab2562009-05-31 09:31:02 +0000806//===----------------------------------------------------------------------===//
807// ClassTemplatePartialSpecializationDecl Implementation
808//===----------------------------------------------------------------------===//
David Blaikie99ba9e32011-12-20 02:48:34 +0000809void ClassTemplatePartialSpecializationDecl::anchor() { }
810
Douglas Gregor9a299e02011-03-04 17:52:15 +0000811ClassTemplatePartialSpecializationDecl::
812ClassTemplatePartialSpecializationDecl(ASTContext &Context, TagKind TK,
Abramo Bagnaraba877ad2011-03-09 14:09:51 +0000813 DeclContext *DC,
814 SourceLocation StartLoc,
815 SourceLocation IdLoc,
Douglas Gregor9a299e02011-03-04 17:52:15 +0000816 TemplateParameterList *Params,
817 ClassTemplateDecl *SpecializedTemplate,
818 const TemplateArgument *Args,
819 unsigned NumArgs,
820 TemplateArgumentLoc *ArgInfos,
821 unsigned NumArgInfos,
822 ClassTemplatePartialSpecializationDecl *PrevDecl,
823 unsigned SequenceNumber)
824 : ClassTemplateSpecializationDecl(Context,
825 ClassTemplatePartialSpecialization,
Abramo Bagnaraba877ad2011-03-09 14:09:51 +0000826 TK, DC, StartLoc, IdLoc,
827 SpecializedTemplate,
Douglas Gregor9a299e02011-03-04 17:52:15 +0000828 Args, NumArgs, PrevDecl),
829 TemplateParams(Params), ArgsAsWritten(ArgInfos),
830 NumArgsAsWritten(NumArgInfos), SequenceNumber(SequenceNumber),
831 InstantiatedFromMember(0, false)
832{
Douglas Gregor787a40d2011-03-04 18:32:38 +0000833 AdoptTemplateParameterList(Params, this);
Douglas Gregor9a299e02011-03-04 17:52:15 +0000834}
835
Douglas Gregorc8ab2562009-05-31 09:31:02 +0000836ClassTemplatePartialSpecializationDecl *
837ClassTemplatePartialSpecializationDecl::
Abramo Bagnaraba877ad2011-03-09 14:09:51 +0000838Create(ASTContext &Context, TagKind TK,DeclContext *DC,
839 SourceLocation StartLoc, SourceLocation IdLoc,
Douglas Gregorc8ab2562009-05-31 09:31:02 +0000840 TemplateParameterList *Params,
841 ClassTemplateDecl *SpecializedTemplate,
Douglas Gregor910f8002010-11-07 23:05:16 +0000842 const TemplateArgument *Args,
843 unsigned NumArgs,
John McCalld5532b62009-11-23 01:53:49 +0000844 const TemplateArgumentListInfo &ArgInfos,
John McCall3cb0ebd2010-03-10 03:28:59 +0000845 QualType CanonInjectedType,
Douglas Gregordc60c1e2010-04-30 05:56:50 +0000846 ClassTemplatePartialSpecializationDecl *PrevDecl,
847 unsigned SequenceNumber) {
John McCalld5532b62009-11-23 01:53:49 +0000848 unsigned N = ArgInfos.size();
John McCall833ca992009-10-29 08:12:44 +0000849 TemplateArgumentLoc *ClonedArgs = new (Context) TemplateArgumentLoc[N];
850 for (unsigned I = 0; I != N; ++I)
851 ClonedArgs[I] = ArgInfos[I];
852
Douglas Gregorc8ab2562009-05-31 09:31:02 +0000853 ClassTemplatePartialSpecializationDecl *Result
Abramo Bagnaraba877ad2011-03-09 14:09:51 +0000854 = new (Context)ClassTemplatePartialSpecializationDecl(Context, TK, DC,
855 StartLoc, IdLoc,
856 Params,
Douglas Gregorc8ab2562009-05-31 09:31:02 +0000857 SpecializedTemplate,
Douglas Gregor910f8002010-11-07 23:05:16 +0000858 Args, NumArgs,
John McCall833ca992009-10-29 08:12:44 +0000859 ClonedArgs, N,
Douglas Gregordc60c1e2010-04-30 05:56:50 +0000860 PrevDecl,
861 SequenceNumber);
Douglas Gregorc8ab2562009-05-31 09:31:02 +0000862 Result->setSpecializationKind(TSK_ExplicitSpecialization);
Douglas Gregor6bd99292013-02-09 01:35:03 +0000863 Result->MayHaveOutOfDateDef = false;
John McCall3cb0ebd2010-03-10 03:28:59 +0000864
865 Context.getInjectedClassNameType(Result, CanonInjectedType);
Douglas Gregorc8ab2562009-05-31 09:31:02 +0000866 return Result;
867}
John McCalldd4a3b02009-09-16 22:47:08 +0000868
Argyrios Kyrtzidis94d228d2010-06-23 13:48:23 +0000869ClassTemplatePartialSpecializationDecl *
Douglas Gregor1e68ecc2012-01-05 21:55:30 +0000870ClassTemplatePartialSpecializationDecl::CreateDeserialized(ASTContext &C,
871 unsigned ID) {
872 void *Mem = AllocateDeserializedDecl(C, ID,
873 sizeof(ClassTemplatePartialSpecializationDecl));
Douglas Gregor6bd99292013-02-09 01:35:03 +0000874 ClassTemplatePartialSpecializationDecl *Result
875 = new (Mem) ClassTemplatePartialSpecializationDecl();
876 Result->MayHaveOutOfDateDef = false;
877 return Result;
Argyrios Kyrtzidis94d228d2010-06-23 13:48:23 +0000878}
879
John McCalldd4a3b02009-09-16 22:47:08 +0000880//===----------------------------------------------------------------------===//
881// FriendTemplateDecl Implementation
882//===----------------------------------------------------------------------===//
883
David Blaikie99ba9e32011-12-20 02:48:34 +0000884void FriendTemplateDecl::anchor() { }
885
John McCalldd4a3b02009-09-16 22:47:08 +0000886FriendTemplateDecl *FriendTemplateDecl::Create(ASTContext &Context,
887 DeclContext *DC,
888 SourceLocation L,
889 unsigned NParams,
890 TemplateParameterList **Params,
891 FriendUnion Friend,
892 SourceLocation FLoc) {
893 FriendTemplateDecl *Result
894 = new (Context) FriendTemplateDecl(DC, L, NParams, Params, Friend, FLoc);
895 return Result;
896}
Argyrios Kyrtzidis554e6aa2010-07-22 16:04:10 +0000897
Douglas Gregor1e68ecc2012-01-05 21:55:30 +0000898FriendTemplateDecl *FriendTemplateDecl::CreateDeserialized(ASTContext &C,
899 unsigned ID) {
900 void *Mem = AllocateDeserializedDecl(C, ID, sizeof(FriendTemplateDecl));
901 return new (Mem) FriendTemplateDecl(EmptyShell());
Argyrios Kyrtzidis554e6aa2010-07-22 16:04:10 +0000902}
Richard Smith3e4c6c42011-05-05 21:57:07 +0000903
904//===----------------------------------------------------------------------===//
905// TypeAliasTemplateDecl Implementation
906//===----------------------------------------------------------------------===//
907
908TypeAliasTemplateDecl *TypeAliasTemplateDecl::Create(ASTContext &C,
909 DeclContext *DC,
910 SourceLocation L,
911 DeclarationName Name,
912 TemplateParameterList *Params,
913 NamedDecl *Decl) {
914 AdoptTemplateParameterList(Params, DC);
915 return new (C) TypeAliasTemplateDecl(DC, L, Name, Params, Decl);
916}
917
Douglas Gregor1e68ecc2012-01-05 21:55:30 +0000918TypeAliasTemplateDecl *TypeAliasTemplateDecl::CreateDeserialized(ASTContext &C,
919 unsigned ID) {
920 void *Mem = AllocateDeserializedDecl(C, ID, sizeof(TypeAliasTemplateDecl));
921 return new (Mem) TypeAliasTemplateDecl(0, SourceLocation(), DeclarationName(),
922 0, 0);
Richard Smith3e4c6c42011-05-05 21:57:07 +0000923}
924
925void TypeAliasTemplateDecl::DeallocateCommon(void *Ptr) {
926 static_cast<Common *>(Ptr)->~Common();
927}
928RedeclarableTemplateDecl::CommonBase *
Dmitri Gribenkob76d9712013-01-23 16:52:57 +0000929TypeAliasTemplateDecl::newCommon(ASTContext &C) const {
Richard Smith3e4c6c42011-05-05 21:57:07 +0000930 Common *CommonPtr = new (C) Common;
931 C.AddDeallocation(DeallocateCommon, CommonPtr);
932 return CommonPtr;
933}
934
David Blaikie99ba9e32011-12-20 02:48:34 +0000935//===----------------------------------------------------------------------===//
936// ClassScopeFunctionSpecializationDecl Implementation
937//===----------------------------------------------------------------------===//
938
939void ClassScopeFunctionSpecializationDecl::anchor() { }
Douglas Gregor1e68ecc2012-01-05 21:55:30 +0000940
941ClassScopeFunctionSpecializationDecl *
942ClassScopeFunctionSpecializationDecl::CreateDeserialized(ASTContext &C,
943 unsigned ID) {
944 void *Mem = AllocateDeserializedDecl(C, ID,
945 sizeof(ClassScopeFunctionSpecializationDecl));
Nico Weber6b020092012-06-25 17:21:05 +0000946 return new (Mem) ClassScopeFunctionSpecializationDecl(0, SourceLocation(), 0,
947 false, TemplateArgumentListInfo());
Douglas Gregor1e68ecc2012-01-05 21:55:30 +0000948}