1 //===-- DeclTemplate.h - Classes for representing C++ templates -*- C++ -*-===//
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 /// \file
11 /// \brief Defines the C++ template declaration subclasses.
12 ///
13 //===----------------------------------------------------------------------===//
14
15 #ifndef LLVM_CLANG_AST_DECLTEMPLATE_H
16 #define LLVM_CLANG_AST_DECLTEMPLATE_H
17
18 #include "clang/AST/DeclCXX.h"
19 #include "clang/AST/Redeclarable.h"
20 #include "clang/AST/TemplateBase.h"
21 #include "llvm/ADT/PointerUnion.h"
22 #include "llvm/Support/Compiler.h"
23 #include "llvm/Support/TrailingObjects.h"
24 #include <limits>
25
26 namespace clang {
27
28 enum BuiltinTemplateKind : int;
29 class TemplateParameterList;
30 class TemplateDecl;
31 class RedeclarableTemplateDecl;
32 class FunctionTemplateDecl;
33 class ClassTemplateDecl;
34 class ClassTemplatePartialSpecializationDecl;
35 class TemplateTypeParmDecl;
36 class NonTypeTemplateParmDecl;
37 class TemplateTemplateParmDecl;
38 class TypeAliasTemplateDecl;
39 class VarTemplateDecl;
40 class VarTemplatePartialSpecializationDecl;
41
42 /// \brief Stores a template parameter of any kind.
43 typedef llvm::PointerUnion3<TemplateTypeParmDecl*, NonTypeTemplateParmDecl*,
44 TemplateTemplateParmDecl*> TemplateParameter;
45
46 /// \brief Stores a list of template parameters for a TemplateDecl and its
47 /// derived classes.
LLVM_ALIGNAS(LLVM_PTR_SIZE)48 class LLVM_ALIGNAS(/*alignof(void*)*/ LLVM_PTR_SIZE) TemplateParameterList final
49 : private llvm::TrailingObjects<TemplateParameterList, NamedDecl *> {
50
51 /// The location of the 'template' keyword.
52 SourceLocation TemplateLoc;
53
54 /// The locations of the '<' and '>' angle brackets.
55 SourceLocation LAngleLoc, RAngleLoc;
56
57 /// The number of template parameters in this template
58 /// parameter list.
59 unsigned NumParams : 31;
60
61 /// Whether this template parameter list contains an unexpanded parameter
62 /// pack.
63 unsigned ContainsUnexpandedParameterPack : 1;
64
65 protected:
66 size_t numTrailingObjects(OverloadToken<NamedDecl *>) const {
67 return NumParams;
68 }
69
70 TemplateParameterList(SourceLocation TemplateLoc, SourceLocation LAngleLoc,
71 NamedDecl **Params, unsigned NumParams,
72 SourceLocation RAngleLoc);
73
74 public:
75 static TemplateParameterList *Create(const ASTContext &C,
76 SourceLocation TemplateLoc,
77 SourceLocation LAngleLoc,
78 NamedDecl **Params,
79 unsigned NumParams,
80 SourceLocation RAngleLoc);
81
82 /// \brief Iterates through the template parameters in this list.
83 typedef NamedDecl** iterator;
84
85 /// \brief Iterates through the template parameters in this list.
86 typedef NamedDecl* const* const_iterator;
87
88 iterator begin() { return getTrailingObjects<NamedDecl *>(); }
89 const_iterator begin() const { return getTrailingObjects<NamedDecl *>(); }
90 iterator end() { return begin() + NumParams; }
91 const_iterator end() const { return begin() + NumParams; }
92
93 unsigned size() const { return NumParams; }
94
95 ArrayRef<NamedDecl*> asArray() {
96 return llvm::makeArrayRef(begin(), end());
97 }
98 ArrayRef<const NamedDecl*> asArray() const {
99 return llvm::makeArrayRef(begin(), size());
100 }
101
102 NamedDecl* getParam(unsigned Idx) {
103 assert(Idx < size() && "Template parameter index out-of-range");
104 return begin()[Idx];
105 }
106
107 const NamedDecl* getParam(unsigned Idx) const {
108 assert(Idx < size() && "Template parameter index out-of-range");
109 return begin()[Idx];
110 }
111
112 /// \brief Returns the minimum number of arguments needed to form a
113 /// template specialization.
114 ///
115 /// This may be fewer than the number of template parameters, if some of
116 /// the parameters have default arguments or if there is a parameter pack.
117 unsigned getMinRequiredArguments() const;
118
119 /// \brief Get the depth of this template parameter list in the set of
120 /// template parameter lists.
121 ///
122 /// The first template parameter list in a declaration will have depth 0,
123 /// the second template parameter list will have depth 1, etc.
124 unsigned getDepth() const;
125
126 /// \brief Determine whether this template parameter list contains an
127 /// unexpanded parameter pack.
128 bool containsUnexpandedParameterPack() const {
129 return ContainsUnexpandedParameterPack;
130 }
131
132 SourceLocation getTemplateLoc() const { return TemplateLoc; }
133 SourceLocation getLAngleLoc() const { return LAngleLoc; }
134 SourceLocation getRAngleLoc() const { return RAngleLoc; }
135
136 SourceRange getSourceRange() const LLVM_READONLY {
137 return SourceRange(TemplateLoc, RAngleLoc);
138 }
139
140 friend TrailingObjects;
141 template <size_t N> friend class FixedSizeTemplateParameterListStorage;
142 };
143
144 /// \brief Stores a list of template parameters for a TemplateDecl and its
145 /// derived classes. Suitable for creating on the stack.
146 template <size_t N> class FixedSizeTemplateParameterListStorage {
147 // This is kinda ugly: TemplateParameterList usually gets allocated
148 // in a block of memory with NamedDecls appended to it. Here, to get
149 // it stack allocated, we include the params as a separate
150 // variable. After allocation, the TemplateParameterList object
151 // treats them as part of itself.
152 TemplateParameterList List;
153 NamedDecl *Params[N];
154
155 public:
FixedSizeTemplateParameterListStorage(SourceLocation TemplateLoc,SourceLocation LAngleLoc,NamedDecl ** Params,SourceLocation RAngleLoc)156 FixedSizeTemplateParameterListStorage(SourceLocation TemplateLoc,
157 SourceLocation LAngleLoc,
158 NamedDecl **Params,
159 SourceLocation RAngleLoc)
160 : List(TemplateLoc, LAngleLoc, Params, N, RAngleLoc) {
161 // Because we're doing an evil layout hack above, have some
162 // asserts, just to double-check everything is laid out like
163 // expected.
164 assert(sizeof(*this) ==
165 TemplateParameterList::totalSizeToAlloc<NamedDecl *>(N) &&
166 "Object layout not as expected");
167 assert(this->Params == List.getTrailingObjects<NamedDecl *>() &&
168 "Object layout not as expected");
169 }
get()170 TemplateParameterList *get() { return &List; }
171 };
172
173 /// \brief A template argument list.
174 class LLVM_ALIGNAS(/*alignof(uint64_t)*/ 8) TemplateArgumentList final
175 : private llvm::TrailingObjects<TemplateArgumentList, TemplateArgument> {
176 /// \brief The template argument list.
177 const TemplateArgument *Arguments;
178
179 /// \brief The number of template arguments in this template
180 /// argument list.
181 unsigned NumArguments;
182
183 TemplateArgumentList(const TemplateArgumentList &Other) = delete;
184 void operator=(const TemplateArgumentList &Other) = delete;
185
186 // Constructs an instance with an internal Argument list, containing
187 // a copy of the Args array. (Called by CreateCopy)
188 TemplateArgumentList(const TemplateArgument *Args, unsigned NumArgs);
189
190 public:
191 /// \brief Type used to indicate that the template argument list itself is a
192 /// stack object. It does not own its template arguments.
193 enum OnStackType { OnStack };
194
195 /// \brief Create a new template argument list that copies the given set of
196 /// template arguments.
197 static TemplateArgumentList *CreateCopy(ASTContext &Context,
198 const TemplateArgument *Args,
199 unsigned NumArgs);
200
201 /// \brief Construct a new, temporary template argument list on the stack.
202 ///
203 /// The template argument list does not own the template arguments
204 /// provided.
TemplateArgumentList(OnStackType,const TemplateArgument * Args,unsigned NumArgs)205 explicit TemplateArgumentList(OnStackType, const TemplateArgument *Args,
206 unsigned NumArgs)
207 : Arguments(Args), NumArguments(NumArgs) {}
208
209 /// \brief Produces a shallow copy of the given template argument list.
210 ///
211 /// This operation assumes that the input argument list outlives it.
212 /// This takes the list as a pointer to avoid looking like a copy
213 /// constructor, since this really really isn't safe to use that
214 /// way.
TemplateArgumentList(const TemplateArgumentList * Other)215 explicit TemplateArgumentList(const TemplateArgumentList *Other)
216 : Arguments(Other->data()), NumArguments(Other->size()) {}
217
218 /// \brief Retrieve the template argument at a given index.
get(unsigned Idx)219 const TemplateArgument &get(unsigned Idx) const {
220 assert(Idx < NumArguments && "Invalid template argument index");
221 return data()[Idx];
222 }
223
224 /// \brief Retrieve the template argument at a given index.
225 const TemplateArgument &operator[](unsigned Idx) const { return get(Idx); }
226
227 /// \brief Produce this as an array ref.
asArray()228 ArrayRef<TemplateArgument> asArray() const {
229 return llvm::makeArrayRef(data(), size());
230 }
231
232 /// \brief Retrieve the number of template arguments in this
233 /// template argument list.
size()234 unsigned size() const { return NumArguments; }
235
236 /// \brief Retrieve a pointer to the template argument list.
data()237 const TemplateArgument *data() const { return Arguments; }
238
239 friend TrailingObjects;
240 };
241
242 void *allocateDefaultArgStorageChain(const ASTContext &C);
243
244 /// Storage for a default argument. This is conceptually either empty, or an
245 /// argument value, or a pointer to a previous declaration that had a default
246 /// argument.
247 ///
248 /// However, this is complicated by modules: while we require all the default
249 /// arguments for a template to be equivalent, there may be more than one, and
250 /// we need to track all the originating parameters to determine if the default
251 /// argument is visible.
252 template<typename ParmDecl, typename ArgType>
253 class DefaultArgStorage {
254 /// Storage for both the value *and* another parameter from which we inherit
255 /// the default argument. This is used when multiple default arguments for a
256 /// parameter are merged together from different modules.
257 struct Chain {
258 ParmDecl *PrevDeclWithDefaultArg;
259 ArgType Value;
260 };
261 static_assert(sizeof(Chain) == sizeof(void *) * 2,
262 "non-pointer argument type?");
263
264 llvm::PointerUnion3<ArgType, ParmDecl*, Chain*> ValueOrInherited;
265
getParmOwningDefaultArg(ParmDecl * Parm)266 static ParmDecl *getParmOwningDefaultArg(ParmDecl *Parm) {
267 const DefaultArgStorage &Storage = Parm->getDefaultArgStorage();
268 if (auto *Prev = Storage.ValueOrInherited.template dyn_cast<ParmDecl*>())
269 Parm = Prev;
270 assert(!Parm->getDefaultArgStorage()
271 .ValueOrInherited.template is<ParmDecl *>() &&
272 "should only be one level of indirection");
273 return Parm;
274 }
275
276 public:
DefaultArgStorage()277 DefaultArgStorage() : ValueOrInherited(ArgType()) {}
278
279 /// Determine whether there is a default argument for this parameter.
isSet()280 bool isSet() const { return !ValueOrInherited.isNull(); }
281 /// Determine whether the default argument for this parameter was inherited
282 /// from a previous declaration of the same entity.
isInherited()283 bool isInherited() const { return ValueOrInherited.template is<ParmDecl*>(); }
284 /// Get the default argument's value. This does not consider whether the
285 /// default argument is visible.
get()286 ArgType get() const {
287 const DefaultArgStorage *Storage = this;
288 if (auto *Prev = ValueOrInherited.template dyn_cast<ParmDecl*>())
289 Storage = &Prev->getDefaultArgStorage();
290 if (auto *C = Storage->ValueOrInherited.template dyn_cast<Chain*>())
291 return C->Value;
292 return Storage->ValueOrInherited.template get<ArgType>();
293 }
294 /// Get the parameter from which we inherit the default argument, if any.
295 /// This is the parameter on which the default argument was actually written.
getInheritedFrom()296 const ParmDecl *getInheritedFrom() const {
297 if (auto *D = ValueOrInherited.template dyn_cast<ParmDecl*>())
298 return D;
299 if (auto *C = ValueOrInherited.template dyn_cast<Chain*>())
300 return C->PrevDeclWithDefaultArg;
301 return nullptr;
302 }
303 /// Set the default argument.
set(ArgType Arg)304 void set(ArgType Arg) {
305 assert(!isSet() && "default argument already set");
306 ValueOrInherited = Arg;
307 }
308 /// Set that the default argument was inherited from another parameter.
setInherited(const ASTContext & C,ParmDecl * InheritedFrom)309 void setInherited(const ASTContext &C, ParmDecl *InheritedFrom) {
310 assert(!isInherited() && "default argument already inherited");
311 InheritedFrom = getParmOwningDefaultArg(InheritedFrom);
312 if (!isSet())
313 ValueOrInherited = InheritedFrom;
314 else
315 ValueOrInherited = new (allocateDefaultArgStorageChain(C))
316 Chain{InheritedFrom, ValueOrInherited.template get<ArgType>()};
317 }
318 /// Remove the default argument, even if it was inherited.
clear()319 void clear() {
320 ValueOrInherited = ArgType();
321 }
322 };
323
324 //===----------------------------------------------------------------------===//
325 // Kinds of Templates
326 //===----------------------------------------------------------------------===//
327
328 /// \brief The base class of all kinds of template declarations (e.g.,
329 /// class, function, etc.).
330 ///
331 /// The TemplateDecl class stores the list of template parameters and a
332 /// reference to the templated scoped declaration: the underlying AST node.
333 class TemplateDecl : public NamedDecl {
334 void anchor() override;
335 protected:
336 // This is probably never used.
TemplateDecl(Kind DK,DeclContext * DC,SourceLocation L,DeclarationName Name)337 TemplateDecl(Kind DK, DeclContext *DC, SourceLocation L,
338 DeclarationName Name)
339 : NamedDecl(DK, DC, L, Name), TemplatedDecl(nullptr),
340 TemplateParams(nullptr) {}
341
342 // Construct a template decl with the given name and parameters.
343 // Used when there is not templated element (tt-params).
TemplateDecl(Kind DK,DeclContext * DC,SourceLocation L,DeclarationName Name,TemplateParameterList * Params)344 TemplateDecl(Kind DK, DeclContext *DC, SourceLocation L,
345 DeclarationName Name, TemplateParameterList *Params)
346 : NamedDecl(DK, DC, L, Name), TemplatedDecl(nullptr),
347 TemplateParams(Params) {}
348
349 // Construct a template decl with name, parameters, and templated element.
TemplateDecl(Kind DK,DeclContext * DC,SourceLocation L,DeclarationName Name,TemplateParameterList * Params,NamedDecl * Decl)350 TemplateDecl(Kind DK, DeclContext *DC, SourceLocation L,
351 DeclarationName Name, TemplateParameterList *Params,
352 NamedDecl *Decl)
353 : NamedDecl(DK, DC, L, Name), TemplatedDecl(Decl),
354 TemplateParams(Params) { }
355 public:
356 /// Get the list of template parameters
getTemplateParameters()357 TemplateParameterList *getTemplateParameters() const {
358 return TemplateParams;
359 }
360
361 /// Get the underlying, templated declaration.
getTemplatedDecl()362 NamedDecl *getTemplatedDecl() const { return TemplatedDecl; }
363
364 // Implement isa/cast/dyncast/etc.
classof(const Decl * D)365 static bool classof(const Decl *D) { return classofKind(D->getKind()); }
classofKind(Kind K)366 static bool classofKind(Kind K) {
367 return K >= firstTemplate && K <= lastTemplate;
368 }
369
getSourceRange()370 SourceRange getSourceRange() const override LLVM_READONLY {
371 return SourceRange(TemplateParams->getTemplateLoc(),
372 TemplatedDecl->getSourceRange().getEnd());
373 }
374
375 protected:
376 NamedDecl *TemplatedDecl;
377 TemplateParameterList* TemplateParams;
378
379 public:
380 /// \brief Initialize the underlying templated declaration and
381 /// template parameters.
init(NamedDecl * templatedDecl,TemplateParameterList * templateParams)382 void init(NamedDecl *templatedDecl, TemplateParameterList* templateParams) {
383 assert(!TemplatedDecl && "TemplatedDecl already set!");
384 assert(!TemplateParams && "TemplateParams already set!");
385 TemplatedDecl = templatedDecl;
386 TemplateParams = templateParams;
387 }
388 };
389
390 /// \brief Provides information about a function template specialization,
391 /// which is a FunctionDecl that has been explicitly specialization or
392 /// instantiated from a function template.
393 class FunctionTemplateSpecializationInfo : public llvm::FoldingSetNode {
FunctionTemplateSpecializationInfo(FunctionDecl * FD,FunctionTemplateDecl * Template,TemplateSpecializationKind TSK,const TemplateArgumentList * TemplateArgs,const ASTTemplateArgumentListInfo * TemplateArgsAsWritten,SourceLocation POI)394 FunctionTemplateSpecializationInfo(FunctionDecl *FD,
395 FunctionTemplateDecl *Template,
396 TemplateSpecializationKind TSK,
397 const TemplateArgumentList *TemplateArgs,
398 const ASTTemplateArgumentListInfo *TemplateArgsAsWritten,
399 SourceLocation POI)
400 : Function(FD),
401 Template(Template, TSK - 1),
402 TemplateArguments(TemplateArgs),
403 TemplateArgumentsAsWritten(TemplateArgsAsWritten),
404 PointOfInstantiation(POI) { }
405
406 public:
407 static FunctionTemplateSpecializationInfo *
408 Create(ASTContext &C, FunctionDecl *FD, FunctionTemplateDecl *Template,
409 TemplateSpecializationKind TSK,
410 const TemplateArgumentList *TemplateArgs,
411 const TemplateArgumentListInfo *TemplateArgsAsWritten,
412 SourceLocation POI);
413
414 /// \brief The function template specialization that this structure
415 /// describes.
416 FunctionDecl *Function;
417
418 /// \brief The function template from which this function template
419 /// specialization was generated.
420 ///
421 /// The two bits contain the top 4 values of TemplateSpecializationKind.
422 llvm::PointerIntPair<FunctionTemplateDecl *, 2> Template;
423
424 /// \brief The template arguments used to produce the function template
425 /// specialization from the function template.
426 const TemplateArgumentList *TemplateArguments;
427
428 /// \brief The template arguments as written in the sources, if provided.
429 const ASTTemplateArgumentListInfo *TemplateArgumentsAsWritten;
430
431 /// \brief The point at which this function template specialization was
432 /// first instantiated.
433 SourceLocation PointOfInstantiation;
434
435 /// \brief Retrieve the template from which this function was specialized.
getTemplate()436 FunctionTemplateDecl *getTemplate() const { return Template.getPointer(); }
437
438 /// \brief Determine what kind of template specialization this is.
getTemplateSpecializationKind()439 TemplateSpecializationKind getTemplateSpecializationKind() const {
440 return (TemplateSpecializationKind)(Template.getInt() + 1);
441 }
442
isExplicitSpecialization()443 bool isExplicitSpecialization() const {
444 return getTemplateSpecializationKind() == TSK_ExplicitSpecialization;
445 }
446
447 /// \brief True if this declaration is an explicit specialization,
448 /// explicit instantiation declaration, or explicit instantiation
449 /// definition.
isExplicitInstantiationOrSpecialization()450 bool isExplicitInstantiationOrSpecialization() const {
451 return isTemplateExplicitInstantiationOrSpecialization(
452 getTemplateSpecializationKind());
453 }
454
455 /// \brief Set the template specialization kind.
setTemplateSpecializationKind(TemplateSpecializationKind TSK)456 void setTemplateSpecializationKind(TemplateSpecializationKind TSK) {
457 assert(TSK != TSK_Undeclared &&
458 "Cannot encode TSK_Undeclared for a function template specialization");
459 Template.setInt(TSK - 1);
460 }
461
462 /// \brief Retrieve the first point of instantiation of this function
463 /// template specialization.
464 ///
465 /// The point of instantiation may be an invalid source location if this
466 /// function has yet to be instantiated.
getPointOfInstantiation()467 SourceLocation getPointOfInstantiation() const {
468 return PointOfInstantiation;
469 }
470
471 /// \brief Set the (first) point of instantiation of this function template
472 /// specialization.
setPointOfInstantiation(SourceLocation POI)473 void setPointOfInstantiation(SourceLocation POI) {
474 PointOfInstantiation = POI;
475 }
476
Profile(llvm::FoldingSetNodeID & ID)477 void Profile(llvm::FoldingSetNodeID &ID) {
478 Profile(ID, TemplateArguments->asArray(),
479 Function->getASTContext());
480 }
481
482 static void
Profile(llvm::FoldingSetNodeID & ID,ArrayRef<TemplateArgument> TemplateArgs,ASTContext & Context)483 Profile(llvm::FoldingSetNodeID &ID, ArrayRef<TemplateArgument> TemplateArgs,
484 ASTContext &Context) {
485 ID.AddInteger(TemplateArgs.size());
486 for (unsigned Arg = 0; Arg != TemplateArgs.size(); ++Arg)
487 TemplateArgs[Arg].Profile(ID, Context);
488 }
489 };
490
491 /// \brief Provides information a specialization of a member of a class
492 /// template, which may be a member function, static data member,
493 /// member class or member enumeration.
494 class MemberSpecializationInfo {
495 // The member declaration from which this member was instantiated, and the
496 // manner in which the instantiation occurred (in the lower two bits).
497 llvm::PointerIntPair<NamedDecl *, 2> MemberAndTSK;
498
499 // The point at which this member was first instantiated.
500 SourceLocation PointOfInstantiation;
501
502 public:
503 explicit
504 MemberSpecializationInfo(NamedDecl *IF, TemplateSpecializationKind TSK,
505 SourceLocation POI = SourceLocation())
506 : MemberAndTSK(IF, TSK - 1), PointOfInstantiation(POI) {
507 assert(TSK != TSK_Undeclared &&
508 "Cannot encode undeclared template specializations for members");
509 }
510
511 /// \brief Retrieve the member declaration from which this member was
512 /// instantiated.
getInstantiatedFrom()513 NamedDecl *getInstantiatedFrom() const { return MemberAndTSK.getPointer(); }
514
515 /// \brief Determine what kind of template specialization this is.
getTemplateSpecializationKind()516 TemplateSpecializationKind getTemplateSpecializationKind() const {
517 return (TemplateSpecializationKind)(MemberAndTSK.getInt() + 1);
518 }
519
isExplicitSpecialization()520 bool isExplicitSpecialization() const {
521 return getTemplateSpecializationKind() == TSK_ExplicitSpecialization;
522 }
523
524 /// \brief Set the template specialization kind.
setTemplateSpecializationKind(TemplateSpecializationKind TSK)525 void setTemplateSpecializationKind(TemplateSpecializationKind TSK) {
526 assert(TSK != TSK_Undeclared &&
527 "Cannot encode undeclared template specializations for members");
528 MemberAndTSK.setInt(TSK - 1);
529 }
530
531 /// \brief Retrieve the first point of instantiation of this member.
532 /// If the point of instantiation is an invalid location, then this member
533 /// has not yet been instantiated.
getPointOfInstantiation()534 SourceLocation getPointOfInstantiation() const {
535 return PointOfInstantiation;
536 }
537
538 /// \brief Set the first point of instantiation.
setPointOfInstantiation(SourceLocation POI)539 void setPointOfInstantiation(SourceLocation POI) {
540 PointOfInstantiation = POI;
541 }
542 };
543
544 /// \brief Provides information about a dependent function-template
545 /// specialization declaration.
546 ///
547 /// Since explicit function template specialization and instantiation
548 /// declarations can only appear in namespace scope, and you can only
549 /// specialize a member of a fully-specialized class, the only way to
550 /// get one of these is in a friend declaration like the following:
551 ///
552 /// \code
553 /// template \<class T> void foo(T);
554 /// template \<class T> class A {
555 /// friend void foo<>(T);
556 /// };
557 /// \endcode
558 class LLVM_ALIGNAS(/*alignof(uint64_t)*/ 8)
559 DependentFunctionTemplateSpecializationInfo final
560 : private llvm::TrailingObjects<DependentFunctionTemplateSpecializationInfo,
561 TemplateArgumentLoc,
562 FunctionTemplateDecl *> {
563 /// The number of potential template candidates.
564 unsigned NumTemplates;
565
566 /// The number of template arguments.
567 unsigned NumArgs;
568
569 /// The locations of the left and right angle brackets.
570 SourceRange AngleLocs;
571
numTrailingObjects(OverloadToken<TemplateArgumentLoc>)572 size_t numTrailingObjects(OverloadToken<TemplateArgumentLoc>) const {
573 return NumArgs;
574 }
numTrailingObjects(OverloadToken<FunctionTemplateDecl * >)575 size_t numTrailingObjects(OverloadToken<FunctionTemplateDecl *>) const {
576 return NumTemplates;
577 }
578
579 DependentFunctionTemplateSpecializationInfo(
580 const UnresolvedSetImpl &Templates,
581 const TemplateArgumentListInfo &TemplateArgs);
582
583 public:
584 static DependentFunctionTemplateSpecializationInfo *
585 Create(ASTContext &Context, const UnresolvedSetImpl &Templates,
586 const TemplateArgumentListInfo &TemplateArgs);
587
588 /// \brief Returns the number of function templates that this might
589 /// be a specialization of.
getNumTemplates()590 unsigned getNumTemplates() const { return NumTemplates; }
591
592 /// \brief Returns the i'th template candidate.
getTemplate(unsigned I)593 FunctionTemplateDecl *getTemplate(unsigned I) const {
594 assert(I < getNumTemplates() && "template index out of range");
595 return getTrailingObjects<FunctionTemplateDecl *>()[I];
596 }
597
598 /// \brief Returns the explicit template arguments that were given.
getTemplateArgs()599 const TemplateArgumentLoc *getTemplateArgs() const {
600 return getTrailingObjects<TemplateArgumentLoc>();
601 }
602
603 /// \brief Returns the number of explicit template arguments that were given.
getNumTemplateArgs()604 unsigned getNumTemplateArgs() const { return NumArgs; }
605
606 /// \brief Returns the nth template argument.
getTemplateArg(unsigned I)607 const TemplateArgumentLoc &getTemplateArg(unsigned I) const {
608 assert(I < getNumTemplateArgs() && "template arg index out of range");
609 return getTemplateArgs()[I];
610 }
611
getLAngleLoc()612 SourceLocation getLAngleLoc() const {
613 return AngleLocs.getBegin();
614 }
615
getRAngleLoc()616 SourceLocation getRAngleLoc() const {
617 return AngleLocs.getEnd();
618 }
619
620 friend TrailingObjects;
621 };
622
623 /// Declaration of a redeclarable template.
624 class RedeclarableTemplateDecl : public TemplateDecl,
625 public Redeclarable<RedeclarableTemplateDecl>
626 {
627 typedef Redeclarable<RedeclarableTemplateDecl> redeclarable_base;
getNextRedeclarationImpl()628 RedeclarableTemplateDecl *getNextRedeclarationImpl() override {
629 return getNextRedeclaration();
630 }
getPreviousDeclImpl()631 RedeclarableTemplateDecl *getPreviousDeclImpl() override {
632 return getPreviousDecl();
633 }
getMostRecentDeclImpl()634 RedeclarableTemplateDecl *getMostRecentDeclImpl() override {
635 return getMostRecentDecl();
636 }
637
638 protected:
639 template <typename EntryType> struct SpecEntryTraits {
640 typedef EntryType DeclType;
641
getDeclSpecEntryTraits642 static DeclType *getDecl(EntryType *D) {
643 return D;
644 }
getTemplateArgsSpecEntryTraits645 static ArrayRef<TemplateArgument> getTemplateArgs(EntryType *D) {
646 return D->getTemplateArgs().asArray();
647 }
648 };
649
650 template <typename EntryType, typename SETraits = SpecEntryTraits<EntryType>,
651 typename DeclType = typename SETraits::DeclType>
652 struct SpecIterator
653 : llvm::iterator_adaptor_base<
654 SpecIterator<EntryType, SETraits, DeclType>,
655 typename llvm::FoldingSetVector<EntryType>::iterator,
656 typename std::iterator_traits<typename llvm::FoldingSetVector<
657 EntryType>::iterator>::iterator_category,
658 DeclType *, ptrdiff_t, DeclType *, DeclType *> {
SpecIteratorSpecIterator659 SpecIterator() {}
SpecIteratorSpecIterator660 explicit SpecIterator(
661 typename llvm::FoldingSetVector<EntryType>::iterator SetIter)
662 : SpecIterator::iterator_adaptor_base(std::move(SetIter)) {}
663
664 DeclType *operator*() const {
665 return SETraits::getDecl(&*this->I)->getMostRecentDecl();
666 }
667 DeclType *operator->() const { return **this; }
668 };
669
670 template <typename EntryType>
671 static SpecIterator<EntryType>
makeSpecIterator(llvm::FoldingSetVector<EntryType> & Specs,bool isEnd)672 makeSpecIterator(llvm::FoldingSetVector<EntryType> &Specs, bool isEnd) {
673 return SpecIterator<EntryType>(isEnd ? Specs.end() : Specs.begin());
674 }
675
676 template <class EntryType> typename SpecEntryTraits<EntryType>::DeclType*
677 findSpecializationImpl(llvm::FoldingSetVector<EntryType> &Specs,
678 ArrayRef<TemplateArgument> Args, void *&InsertPos);
679
680 template <class Derived, class EntryType>
681 void addSpecializationImpl(llvm::FoldingSetVector<EntryType> &Specs,
682 EntryType *Entry, void *InsertPos);
683
684 struct CommonBase {
CommonBaseCommonBase685 CommonBase() : InstantiatedFromMember(nullptr, false) { }
686
687 /// \brief The template from which this was most
688 /// directly instantiated (or null).
689 ///
690 /// The boolean value indicates whether this template
691 /// was explicitly specialized.
692 llvm::PointerIntPair<RedeclarableTemplateDecl*, 1, bool>
693 InstantiatedFromMember;
694 };
695
696 /// \brief Pointer to the common data shared by all declarations of this
697 /// template.
698 mutable CommonBase *Common;
699
700 /// \brief Retrieves the "common" pointer shared by all (re-)declarations of
701 /// the same template. Calling this routine may implicitly allocate memory
702 /// for the common pointer.
703 CommonBase *getCommonPtr() const;
704
705 virtual CommonBase *newCommon(ASTContext &C) const = 0;
706
707 // Construct a template decl with name, parameters, and templated element.
RedeclarableTemplateDecl(Kind DK,ASTContext & C,DeclContext * DC,SourceLocation L,DeclarationName Name,TemplateParameterList * Params,NamedDecl * Decl)708 RedeclarableTemplateDecl(Kind DK, ASTContext &C, DeclContext *DC,
709 SourceLocation L, DeclarationName Name,
710 TemplateParameterList *Params, NamedDecl *Decl)
711 : TemplateDecl(DK, DC, L, Name, Params, Decl), redeclarable_base(C),
712 Common() {}
713
714 public:
715 template <class decl_type> friend class RedeclarableTemplate;
716
717 /// \brief Retrieves the canonical declaration of this template.
getCanonicalDecl()718 RedeclarableTemplateDecl *getCanonicalDecl() override {
719 return getFirstDecl();
720 }
getCanonicalDecl()721 const RedeclarableTemplateDecl *getCanonicalDecl() const {
722 return getFirstDecl();
723 }
724
725 /// \brief Determines whether this template was a specialization of a
726 /// member template.
727 ///
728 /// In the following example, the function template \c X<int>::f and the
729 /// member template \c X<int>::Inner are member specializations.
730 ///
731 /// \code
732 /// template<typename T>
733 /// struct X {
734 /// template<typename U> void f(T, U);
735 /// template<typename U> struct Inner;
736 /// };
737 ///
738 /// template<> template<typename T>
739 /// void X<int>::f(int, T);
740 /// template<> template<typename T>
741 /// struct X<int>::Inner { /* ... */ };
742 /// \endcode
isMemberSpecialization()743 bool isMemberSpecialization() const {
744 return getCommonPtr()->InstantiatedFromMember.getInt();
745 }
746
747 /// \brief Note that this member template is a specialization.
setMemberSpecialization()748 void setMemberSpecialization() {
749 assert(getCommonPtr()->InstantiatedFromMember.getPointer() &&
750 "Only member templates can be member template specializations");
751 getCommonPtr()->InstantiatedFromMember.setInt(true);
752 }
753
754 /// \brief Retrieve the member template from which this template was
755 /// instantiated, or NULL if this template was not instantiated from a
756 /// member template.
757 ///
758 /// A template is instantiated from a member template when the member
759 /// template itself is part of a class template (or member thereof). For
760 /// example, given
761 ///
762 /// \code
763 /// template<typename T>
764 /// struct X {
765 /// template<typename U> void f(T, U);
766 /// };
767 ///
768 /// void test(X<int> x) {
769 /// x.f(1, 'a');
770 /// };
771 /// \endcode
772 ///
773 /// \c X<int>::f is a FunctionTemplateDecl that describes the function
774 /// template
775 ///
776 /// \code
777 /// template<typename U> void X<int>::f(int, U);
778 /// \endcode
779 ///
780 /// which was itself created during the instantiation of \c X<int>. Calling
781 /// getInstantiatedFromMemberTemplate() on this FunctionTemplateDecl will
782 /// retrieve the FunctionTemplateDecl for the original template \c f within
783 /// the class template \c X<T>, i.e.,
784 ///
785 /// \code
786 /// template<typename T>
787 /// template<typename U>
788 /// void X<T>::f(T, U);
789 /// \endcode
getInstantiatedFromMemberTemplate()790 RedeclarableTemplateDecl *getInstantiatedFromMemberTemplate() const {
791 return getCommonPtr()->InstantiatedFromMember.getPointer();
792 }
793
setInstantiatedFromMemberTemplate(RedeclarableTemplateDecl * TD)794 void setInstantiatedFromMemberTemplate(RedeclarableTemplateDecl *TD) {
795 assert(!getCommonPtr()->InstantiatedFromMember.getPointer());
796 getCommonPtr()->InstantiatedFromMember.setPointer(TD);
797 }
798
799 typedef redeclarable_base::redecl_range redecl_range;
800 typedef redeclarable_base::redecl_iterator redecl_iterator;
801 using redeclarable_base::redecls_begin;
802 using redeclarable_base::redecls_end;
803 using redeclarable_base::redecls;
804 using redeclarable_base::getPreviousDecl;
805 using redeclarable_base::getMostRecentDecl;
806 using redeclarable_base::isFirstDecl;
807
808 // Implement isa/cast/dyncast/etc.
classof(const Decl * D)809 static bool classof(const Decl *D) { return classofKind(D->getKind()); }
classofKind(Kind K)810 static bool classofKind(Kind K) {
811 return K >= firstRedeclarableTemplate && K <= lastRedeclarableTemplate;
812 }
813
814 friend class ASTReader;
815 friend class ASTDeclReader;
816 friend class ASTDeclWriter;
817 };
818
819 template <> struct RedeclarableTemplateDecl::
820 SpecEntryTraits<FunctionTemplateSpecializationInfo> {
821 typedef FunctionDecl DeclType;
822
823 static DeclType *getDecl(FunctionTemplateSpecializationInfo *I) {
824 return I->Function;
825 }
826 static ArrayRef<TemplateArgument>
827 getTemplateArgs(FunctionTemplateSpecializationInfo *I) {
828 return I->TemplateArguments->asArray();
829 }
830 };
831
832 /// Declaration of a template function.
833 class FunctionTemplateDecl : public RedeclarableTemplateDecl {
834 static void DeallocateCommon(void *Ptr);
835
836 protected:
837 /// \brief Data that is common to all of the declarations of a given
838 /// function template.
839 struct Common : CommonBase {
840 Common() : InjectedArgs(), LazySpecializations() { }
841
842 /// \brief The function template specializations for this function
843 /// template, including explicit specializations and instantiations.
844 llvm::FoldingSetVector<FunctionTemplateSpecializationInfo> Specializations;
845
846 /// \brief The set of "injected" template arguments used within this
847 /// function template.
848 ///
849 /// This pointer refers to the template arguments (there are as
850 /// many template arguments as template parameaters) for the function
851 /// template, and is allocated lazily, since most function templates do not
852 /// require the use of this information.
853 TemplateArgument *InjectedArgs;
854
855 /// \brief If non-null, points to an array of specializations known only
856 /// by their external declaration IDs.
857 ///
858 /// The first value in the array is the number of of specializations
859 /// that follow.
860 uint32_t *LazySpecializations;
861 };
862
863 FunctionTemplateDecl(ASTContext &C, DeclContext *DC, SourceLocation L,
864 DeclarationName Name, TemplateParameterList *Params,
865 NamedDecl *Decl)
866 : RedeclarableTemplateDecl(FunctionTemplate, C, DC, L, Name, Params,
867 Decl) {}
868
869 CommonBase *newCommon(ASTContext &C) const override;
870
871 Common *getCommonPtr() const {
872 return static_cast<Common *>(RedeclarableTemplateDecl::getCommonPtr());
873 }
874
875 friend class FunctionDecl;
876
877 /// \brief Retrieve the set of function template specializations of this
878 /// function template.
879 llvm::FoldingSetVector<FunctionTemplateSpecializationInfo> &
880 getSpecializations() const;
881
882 /// \brief Add a specialization of this function template.
883 ///
884 /// \param InsertPos Insert position in the FoldingSetVector, must have been
885 /// retrieved by an earlier call to findSpecialization().
886 void addSpecialization(FunctionTemplateSpecializationInfo* Info,
887 void *InsertPos);
888
889 public:
890 /// \brief Load any lazily-loaded specializations from the external source.
891 void LoadLazySpecializations() const;
892
893 /// Get the underlying function declaration of the template.
894 FunctionDecl *getTemplatedDecl() const {
895 return static_cast<FunctionDecl*>(TemplatedDecl);
896 }
897
898 /// Returns whether this template declaration defines the primary
899 /// pattern.
900 bool isThisDeclarationADefinition() const {
901 return getTemplatedDecl()->isThisDeclarationADefinition();
902 }
903
904 /// \brief Return the specialization with the provided arguments if it exists,
905 /// otherwise return the insertion point.
906 FunctionDecl *findSpecialization(ArrayRef<TemplateArgument> Args,
907 void *&InsertPos);
908
909 FunctionTemplateDecl *getCanonicalDecl() override {
910 return cast<FunctionTemplateDecl>(
911 RedeclarableTemplateDecl::getCanonicalDecl());
912 }
913 const FunctionTemplateDecl *getCanonicalDecl() const {
914 return cast<FunctionTemplateDecl>(
915 RedeclarableTemplateDecl::getCanonicalDecl());
916 }
917
918 /// \brief Retrieve the previous declaration of this function template, or
919 /// NULL if no such declaration exists.
920 FunctionTemplateDecl *getPreviousDecl() {
921 return cast_or_null<FunctionTemplateDecl>(
922 static_cast<RedeclarableTemplateDecl *>(this)->getPreviousDecl());
923 }
924
925 /// \brief Retrieve the previous declaration of this function template, or
926 /// NULL if no such declaration exists.
927 const FunctionTemplateDecl *getPreviousDecl() const {
928 return cast_or_null<FunctionTemplateDecl>(
929 static_cast<const RedeclarableTemplateDecl *>(this)->getPreviousDecl());
930 }
931
932 FunctionTemplateDecl *getMostRecentDecl() {
933 return cast<FunctionTemplateDecl>(
934 static_cast<RedeclarableTemplateDecl *>(this)
935 ->getMostRecentDecl());
936 }
937 const FunctionTemplateDecl *getMostRecentDecl() const {
938 return const_cast<FunctionTemplateDecl*>(this)->getMostRecentDecl();
939 }
940
941 FunctionTemplateDecl *getInstantiatedFromMemberTemplate() const {
942 return cast_or_null<FunctionTemplateDecl>(
943 RedeclarableTemplateDecl::getInstantiatedFromMemberTemplate());
944 }
945
946 typedef SpecIterator<FunctionTemplateSpecializationInfo> spec_iterator;
947 typedef llvm::iterator_range<spec_iterator> spec_range;
948
949 spec_range specializations() const {
950 return spec_range(spec_begin(), spec_end());
951 }
952 spec_iterator spec_begin() const {
953 return makeSpecIterator(getSpecializations(), false);
954 }
955
956 spec_iterator spec_end() const {
957 return makeSpecIterator(getSpecializations(), true);
958 }
959
960 /// \brief Retrieve the "injected" template arguments that correspond to the
961 /// template parameters of this function template.
962 ///
963 /// Although the C++ standard has no notion of the "injected" template
964 /// arguments for a function template, the notion is convenient when
965 /// we need to perform substitutions inside the definition of a function
966 /// template.
967 ArrayRef<TemplateArgument> getInjectedTemplateArgs();
968
969 /// \brief Create a function template node.
970 static FunctionTemplateDecl *Create(ASTContext &C, DeclContext *DC,
971 SourceLocation L,
972 DeclarationName Name,
973 TemplateParameterList *Params,
974 NamedDecl *Decl);
975
976 /// \brief Create an empty function template node.
977 static FunctionTemplateDecl *CreateDeserialized(ASTContext &C, unsigned ID);
978
979 // Implement isa/cast/dyncast support
980 static bool classof(const Decl *D) { return classofKind(D->getKind()); }
981 static bool classofKind(Kind K) { return K == FunctionTemplate; }
982
983 friend class ASTDeclReader;
984 friend class ASTDeclWriter;
985 };
986
987 //===----------------------------------------------------------------------===//
988 // Kinds of Template Parameters
989 //===----------------------------------------------------------------------===//
990
991 /// \brief Defines the position of a template parameter within a template
992 /// parameter list.
993 ///
994 /// Because template parameter can be listed
995 /// sequentially for out-of-line template members, each template parameter is
996 /// given a Depth - the nesting of template parameter scopes - and a Position -
997 /// the occurrence within the parameter list.
998 /// This class is inheritedly privately by different kinds of template
999 /// parameters and is not part of the Decl hierarchy. Just a facility.
1000 class TemplateParmPosition {
1001 TemplateParmPosition() = delete;
1002
1003 protected:
1004 TemplateParmPosition(unsigned D, unsigned P)
1005 : Depth(D), Position(P)
1006 { }
1007
1008 // FIXME: These probably don't need to be ints. int:5 for depth, int:8 for
1009 // position? Maybe?
1010 unsigned Depth;
1011 unsigned Position;
1012
1013 public:
1014 /// Get the nesting depth of the template parameter.
1015 unsigned getDepth() const { return Depth; }
1016 void setDepth(unsigned D) { Depth = D; }
1017
1018 /// Get the position of the template parameter within its parameter list.
1019 unsigned getPosition() const { return Position; }
1020 void setPosition(unsigned P) { Position = P; }
1021
1022 /// Get the index of the template parameter within its parameter list.
1023 unsigned getIndex() const { return Position; }
1024 };
1025
1026 /// \brief Declaration of a template type parameter.
1027 ///
1028 /// For example, "T" in
1029 /// \code
1030 /// template<typename T> class vector;
1031 /// \endcode
1032 class TemplateTypeParmDecl : public TypeDecl {
1033 /// \brief Whether this template type parameter was declaration with
1034 /// the 'typename' keyword.
1035 ///
1036 /// If false, it was declared with the 'class' keyword.
1037 bool Typename : 1;
1038
1039 /// \brief The default template argument, if any.
1040 typedef DefaultArgStorage<TemplateTypeParmDecl, TypeSourceInfo *>
1041 DefArgStorage;
1042 DefArgStorage DefaultArgument;
1043
1044 TemplateTypeParmDecl(DeclContext *DC, SourceLocation KeyLoc,
1045 SourceLocation IdLoc, IdentifierInfo *Id,
1046 bool Typename)
1047 : TypeDecl(TemplateTypeParm, DC, IdLoc, Id, KeyLoc), Typename(Typename),
1048 DefaultArgument() { }
1049
1050 /// Sema creates these on the stack during auto type deduction.
1051 friend class Sema;
1052
1053 public:
1054 static TemplateTypeParmDecl *Create(const ASTContext &C, DeclContext *DC,
1055 SourceLocation KeyLoc,
1056 SourceLocation NameLoc,
1057 unsigned D, unsigned P,
1058 IdentifierInfo *Id, bool Typename,
1059 bool ParameterPack);
1060 static TemplateTypeParmDecl *CreateDeserialized(const ASTContext &C,
1061 unsigned ID);
1062
1063 /// \brief Whether this template type parameter was declared with
1064 /// the 'typename' keyword.
1065 ///
1066 /// If not, it was declared with the 'class' keyword.
1067 bool wasDeclaredWithTypename() const { return Typename; }
1068
1069 const DefArgStorage &getDefaultArgStorage() const { return DefaultArgument; }
1070
1071 /// \brief Determine whether this template parameter has a default
1072 /// argument.
1073 bool hasDefaultArgument() const { return DefaultArgument.isSet(); }
1074
1075 /// \brief Retrieve the default argument, if any.
1076 QualType getDefaultArgument() const {
1077 return DefaultArgument.get()->getType();
1078 }
1079
1080 /// \brief Retrieves the default argument's source information, if any.
1081 TypeSourceInfo *getDefaultArgumentInfo() const {
1082 return DefaultArgument.get();
1083 }
1084
1085 /// \brief Retrieves the location of the default argument declaration.
1086 SourceLocation getDefaultArgumentLoc() const;
1087
1088 /// \brief Determines whether the default argument was inherited
1089 /// from a previous declaration of this template.
1090 bool defaultArgumentWasInherited() const {
1091 return DefaultArgument.isInherited();
1092 }
1093
1094 /// \brief Set the default argument for this template parameter.
1095 void setDefaultArgument(TypeSourceInfo *DefArg) {
1096 DefaultArgument.set(DefArg);
1097 }
1098 /// \brief Set that this default argument was inherited from another
1099 /// parameter.
1100 void setInheritedDefaultArgument(const ASTContext &C,
1101 TemplateTypeParmDecl *Prev) {
1102 DefaultArgument.setInherited(C, Prev);
1103 }
1104
1105 /// \brief Removes the default argument of this template parameter.
1106 void removeDefaultArgument() {
1107 DefaultArgument.clear();
1108 }
1109
1110 /// \brief Set whether this template type parameter was declared with
1111 /// the 'typename' or 'class' keyword.
1112 void setDeclaredWithTypename(bool withTypename) { Typename = withTypename; }
1113
1114 /// \brief Retrieve the depth of the template parameter.
1115 unsigned getDepth() const;
1116
1117 /// \brief Retrieve the index of the template parameter.
1118 unsigned getIndex() const;
1119
1120 /// \brief Returns whether this is a parameter pack.
1121 bool isParameterPack() const;
1122
1123 SourceRange getSourceRange() const override LLVM_READONLY;
1124
1125 // Implement isa/cast/dyncast/etc.
1126 static bool classof(const Decl *D) { return classofKind(D->getKind()); }
1127 static bool classofKind(Kind K) { return K == TemplateTypeParm; }
1128 };
1129
1130 /// NonTypeTemplateParmDecl - Declares a non-type template parameter,
1131 /// e.g., "Size" in
1132 /// @code
1133 /// template<int Size> class array { };
1134 /// @endcode
1135 class NonTypeTemplateParmDecl final
1136 : public DeclaratorDecl,
1137 protected TemplateParmPosition,
1138 private llvm::TrailingObjects<NonTypeTemplateParmDecl,
1139 std::pair<QualType, TypeSourceInfo *>> {
1140 /// \brief The default template argument, if any, and whether or not
1141 /// it was inherited.
1142 typedef DefaultArgStorage<NonTypeTemplateParmDecl, Expr*> DefArgStorage;
1143 DefArgStorage DefaultArgument;
1144
1145 // FIXME: Collapse this into TemplateParamPosition; or, just move depth/index
1146 // down here to save memory.
1147
1148 /// \brief Whether this non-type template parameter is a parameter pack.
1149 bool ParameterPack;
1150
1151 /// \brief Whether this non-type template parameter is an "expanded"
1152 /// parameter pack, meaning that its type is a pack expansion and we
1153 /// already know the set of types that expansion expands to.
1154 bool ExpandedParameterPack;
1155
1156 /// \brief The number of types in an expanded parameter pack.
1157 unsigned NumExpandedTypes;
1158
1159 size_t numTrailingObjects(
1160 OverloadToken<std::pair<QualType, TypeSourceInfo *>>) const {
1161 return NumExpandedTypes;
1162 }
1163
1164 NonTypeTemplateParmDecl(DeclContext *DC, SourceLocation StartLoc,
1165 SourceLocation IdLoc, unsigned D, unsigned P,
1166 IdentifierInfo *Id, QualType T,
1167 bool ParameterPack, TypeSourceInfo *TInfo)
1168 : DeclaratorDecl(NonTypeTemplateParm, DC, IdLoc, Id, T, TInfo, StartLoc),
1169 TemplateParmPosition(D, P), ParameterPack(ParameterPack),
1170 ExpandedParameterPack(false), NumExpandedTypes(0)
1171 { }
1172
1173 NonTypeTemplateParmDecl(DeclContext *DC, SourceLocation StartLoc,
1174 SourceLocation IdLoc, unsigned D, unsigned P,
1175 IdentifierInfo *Id, QualType T,
1176 TypeSourceInfo *TInfo,
1177 const QualType *ExpandedTypes,
1178 unsigned NumExpandedTypes,
1179 TypeSourceInfo **ExpandedTInfos);
1180
1181 friend class ASTDeclReader;
1182 friend TrailingObjects;
1183
1184 public:
1185 static NonTypeTemplateParmDecl *
1186 Create(const ASTContext &C, DeclContext *DC, SourceLocation StartLoc,
1187 SourceLocation IdLoc, unsigned D, unsigned P, IdentifierInfo *Id,
1188 QualType T, bool ParameterPack, TypeSourceInfo *TInfo);
1189
1190 static NonTypeTemplateParmDecl *
1191 Create(const ASTContext &C, DeclContext *DC, SourceLocation StartLoc,
1192 SourceLocation IdLoc, unsigned D, unsigned P, IdentifierInfo *Id,
1193 QualType T, TypeSourceInfo *TInfo,
1194 const QualType *ExpandedTypes, unsigned NumExpandedTypes,
1195 TypeSourceInfo **ExpandedTInfos);
1196
1197 static NonTypeTemplateParmDecl *CreateDeserialized(ASTContext &C,
1198 unsigned ID);
1199 static NonTypeTemplateParmDecl *CreateDeserialized(ASTContext &C,
1200 unsigned ID,
1201 unsigned NumExpandedTypes);
1202
1203 using TemplateParmPosition::getDepth;
1204 using TemplateParmPosition::setDepth;
1205 using TemplateParmPosition::getPosition;
1206 using TemplateParmPosition::setPosition;
1207 using TemplateParmPosition::getIndex;
1208
1209 SourceRange getSourceRange() const override LLVM_READONLY;
1210
1211 const DefArgStorage &getDefaultArgStorage() const { return DefaultArgument; }
1212
1213 /// \brief Determine whether this template parameter has a default
1214 /// argument.
1215 bool hasDefaultArgument() const { return DefaultArgument.isSet(); }
1216
1217 /// \brief Retrieve the default argument, if any.
1218 Expr *getDefaultArgument() const { return DefaultArgument.get(); }
1219
1220 /// \brief Retrieve the location of the default argument, if any.
1221 SourceLocation getDefaultArgumentLoc() const;
1222
1223 /// \brief Determines whether the default argument was inherited
1224 /// from a previous declaration of this template.
1225 bool defaultArgumentWasInherited() const {
1226 return DefaultArgument.isInherited();
1227 }
1228
1229 /// \brief Set the default argument for this template parameter, and
1230 /// whether that default argument was inherited from another
1231 /// declaration.
1232 void setDefaultArgument(Expr *DefArg) { DefaultArgument.set(DefArg); }
1233 void setInheritedDefaultArgument(const ASTContext &C,
1234 NonTypeTemplateParmDecl *Parm) {
1235 DefaultArgument.setInherited(C, Parm);
1236 }
1237
1238 /// \brief Removes the default argument of this template parameter.
1239 void removeDefaultArgument() { DefaultArgument.clear(); }
1240
1241 /// \brief Whether this parameter is a non-type template parameter pack.
1242 ///
1243 /// If the parameter is a parameter pack, the type may be a
1244 /// \c PackExpansionType. In the following example, the \c Dims parameter
1245 /// is a parameter pack (whose type is 'unsigned').
1246 ///
1247 /// \code
1248 /// template<typename T, unsigned ...Dims> struct multi_array;
1249 /// \endcode
1250 bool isParameterPack() const { return ParameterPack; }
1251
1252 /// \brief Whether this parameter pack is a pack expansion.
1253 ///
1254 /// A non-type template parameter pack is a pack expansion if its type
1255 /// contains an unexpanded parameter pack. In this case, we will have
1256 /// built a PackExpansionType wrapping the type.
1257 bool isPackExpansion() const {
1258 return ParameterPack && getType()->getAs<PackExpansionType>();
1259 }
1260
1261 /// \brief Whether this parameter is a non-type template parameter pack
1262 /// that has a known list of different types at different positions.
1263 ///
1264 /// A parameter pack is an expanded parameter pack when the original
1265 /// parameter pack's type was itself a pack expansion, and that expansion
1266 /// has already been expanded. For example, given:
1267 ///
1268 /// \code
1269 /// template<typename ...Types>
1270 /// struct X {
1271 /// template<Types ...Values>
1272 /// struct Y { /* ... */ };
1273 /// };
1274 /// \endcode
1275 ///
1276 /// The parameter pack \c Values has a \c PackExpansionType as its type,
1277 /// which expands \c Types. When \c Types is supplied with template arguments
1278 /// by instantiating \c X, the instantiation of \c Values becomes an
1279 /// expanded parameter pack. For example, instantiating
1280 /// \c X<int, unsigned int> results in \c Values being an expanded parameter
1281 /// pack with expansion types \c int and \c unsigned int.
1282 ///
1283 /// The \c getExpansionType() and \c getExpansionTypeSourceInfo() functions
1284 /// return the expansion types.
1285 bool isExpandedParameterPack() const { return ExpandedParameterPack; }
1286
1287 /// \brief Retrieves the number of expansion types in an expanded parameter
1288 /// pack.
1289 unsigned getNumExpansionTypes() const {
1290 assert(ExpandedParameterPack && "Not an expansion parameter pack");
1291 return NumExpandedTypes;
1292 }
1293
1294 /// \brief Retrieve a particular expansion type within an expanded parameter
1295 /// pack.
1296 QualType getExpansionType(unsigned I) const {
1297 assert(I < NumExpandedTypes && "Out-of-range expansion type index");
1298 auto TypesAndInfos =
1299 getTrailingObjects<std::pair<QualType, TypeSourceInfo *>>();
1300 return TypesAndInfos[I].first;
1301 }
1302
1303 /// \brief Retrieve a particular expansion type source info within an
1304 /// expanded parameter pack.
1305 TypeSourceInfo *getExpansionTypeSourceInfo(unsigned I) const {
1306 assert(I < NumExpandedTypes && "Out-of-range expansion type index");
1307 auto TypesAndInfos =
1308 getTrailingObjects<std::pair<QualType, TypeSourceInfo *>>();
1309 return TypesAndInfos[I].second;
1310 }
1311
1312 // Implement isa/cast/dyncast/etc.
1313 static bool classof(const Decl *D) { return classofKind(D->getKind()); }
1314 static bool classofKind(Kind K) { return K == NonTypeTemplateParm; }
1315 };
1316
1317 /// TemplateTemplateParmDecl - Declares a template template parameter,
1318 /// e.g., "T" in
1319 /// @code
1320 /// template <template <typename> class T> class container { };
1321 /// @endcode
1322 /// A template template parameter is a TemplateDecl because it defines the
1323 /// name of a template and the template parameters allowable for substitution.
1324 class TemplateTemplateParmDecl final
1325 : public TemplateDecl,
1326 protected TemplateParmPosition,
1327 private llvm::TrailingObjects<TemplateTemplateParmDecl,
1328 TemplateParameterList *> {
1329 void anchor() override;
1330
1331 /// \brief The default template argument, if any.
1332 typedef DefaultArgStorage<TemplateTemplateParmDecl, TemplateArgumentLoc *>
1333 DefArgStorage;
1334 DefArgStorage DefaultArgument;
1335
1336 /// \brief Whether this parameter is a parameter pack.
1337 bool ParameterPack;
1338
1339 /// \brief Whether this template template parameter is an "expanded"
1340 /// parameter pack, meaning that it is a pack expansion and we
1341 /// already know the set of template parameters that expansion expands to.
1342 bool ExpandedParameterPack;
1343
1344 /// \brief The number of parameters in an expanded parameter pack.
1345 unsigned NumExpandedParams;
1346
1347 TemplateTemplateParmDecl(DeclContext *DC, SourceLocation L,
1348 unsigned D, unsigned P, bool ParameterPack,
1349 IdentifierInfo *Id, TemplateParameterList *Params)
1350 : TemplateDecl(TemplateTemplateParm, DC, L, Id, Params),
1351 TemplateParmPosition(D, P), ParameterPack(ParameterPack),
1352 ExpandedParameterPack(false), NumExpandedParams(0)
1353 { }
1354
1355 TemplateTemplateParmDecl(DeclContext *DC, SourceLocation L,
1356 unsigned D, unsigned P,
1357 IdentifierInfo *Id, TemplateParameterList *Params,
1358 unsigned NumExpansions,
1359 TemplateParameterList * const *Expansions);
1360
1361 public:
1362 static TemplateTemplateParmDecl *Create(const ASTContext &C, DeclContext *DC,
1363 SourceLocation L, unsigned D,
1364 unsigned P, bool ParameterPack,
1365 IdentifierInfo *Id,
1366 TemplateParameterList *Params);
1367 static TemplateTemplateParmDecl *Create(const ASTContext &C, DeclContext *DC,
1368 SourceLocation L, unsigned D,
1369 unsigned P,
1370 IdentifierInfo *Id,
1371 TemplateParameterList *Params,
1372 ArrayRef<TemplateParameterList *> Expansions);
1373
1374 static TemplateTemplateParmDecl *CreateDeserialized(ASTContext &C,
1375 unsigned ID);
1376 static TemplateTemplateParmDecl *CreateDeserialized(ASTContext &C,
1377 unsigned ID,
1378 unsigned NumExpansions);
1379
1380 using TemplateParmPosition::getDepth;
1381 using TemplateParmPosition::getPosition;
1382 using TemplateParmPosition::getIndex;
1383
1384 /// \brief Whether this template template parameter is a template
1385 /// parameter pack.
1386 ///
1387 /// \code
1388 /// template<template <class T> ...MetaFunctions> struct Apply;
1389 /// \endcode
1390 bool isParameterPack() const { return ParameterPack; }
1391
1392 /// \brief Whether this parameter pack is a pack expansion.
1393 ///
1394 /// A template template parameter pack is a pack expansion if its template
1395 /// parameter list contains an unexpanded parameter pack.
1396 bool isPackExpansion() const {
1397 return ParameterPack &&
1398 getTemplateParameters()->containsUnexpandedParameterPack();
1399 }
1400
1401 /// \brief Whether this parameter is a template template parameter pack that
1402 /// has a known list of different template parameter lists at different
1403 /// positions.
1404 ///
1405 /// A parameter pack is an expanded parameter pack when the original parameter
1406 /// pack's template parameter list was itself a pack expansion, and that
1407 /// expansion has already been expanded. For exampe, given:
1408 ///
1409 /// \code
1410 /// template<typename...Types> struct Outer {
1411 /// template<template<Types> class...Templates> struct Inner;
1412 /// };
1413 /// \endcode
1414 ///
1415 /// The parameter pack \c Templates is a pack expansion, which expands the
1416 /// pack \c Types. When \c Types is supplied with template arguments by
1417 /// instantiating \c Outer, the instantiation of \c Templates is an expanded
1418 /// parameter pack.
1419 bool isExpandedParameterPack() const { return ExpandedParameterPack; }
1420
1421 /// \brief Retrieves the number of expansion template parameters in
1422 /// an expanded parameter pack.
1423 unsigned getNumExpansionTemplateParameters() const {
1424 assert(ExpandedParameterPack && "Not an expansion parameter pack");
1425 return NumExpandedParams;
1426 }
1427
1428 /// \brief Retrieve a particular expansion type within an expanded parameter
1429 /// pack.
1430 TemplateParameterList *getExpansionTemplateParameters(unsigned I) const {
1431 assert(I < NumExpandedParams && "Out-of-range expansion type index");
1432 return getTrailingObjects<TemplateParameterList *>()[I];
1433 }
1434
1435 const DefArgStorage &getDefaultArgStorage() const { return DefaultArgument; }
1436
1437 /// \brief Determine whether this template parameter has a default
1438 /// argument.
1439 bool hasDefaultArgument() const { return DefaultArgument.isSet(); }
1440
1441 /// \brief Retrieve the default argument, if any.
1442 const TemplateArgumentLoc &getDefaultArgument() const {
1443 static const TemplateArgumentLoc None;
1444 return DefaultArgument.isSet() ? *DefaultArgument.get() : None;
1445 }
1446
1447 /// \brief Retrieve the location of the default argument, if any.
1448 SourceLocation getDefaultArgumentLoc() const;
1449
1450 /// \brief Determines whether the default argument was inherited
1451 /// from a previous declaration of this template.
1452 bool defaultArgumentWasInherited() const {
1453 return DefaultArgument.isInherited();
1454 }
1455
1456 /// \brief Set the default argument for this template parameter, and
1457 /// whether that default argument was inherited from another
1458 /// declaration.
1459 void setDefaultArgument(const ASTContext &C,
1460 const TemplateArgumentLoc &DefArg);
1461 void setInheritedDefaultArgument(const ASTContext &C,
1462 TemplateTemplateParmDecl *Prev) {
1463 DefaultArgument.setInherited(C, Prev);
1464 }
1465
1466 /// \brief Removes the default argument of this template parameter.
1467 void removeDefaultArgument() { DefaultArgument.clear(); }
1468
1469 SourceRange getSourceRange() const override LLVM_READONLY {
1470 SourceLocation End = getLocation();
1471 if (hasDefaultArgument() && !defaultArgumentWasInherited())
1472 End = getDefaultArgument().getSourceRange().getEnd();
1473 return SourceRange(getTemplateParameters()->getTemplateLoc(), End);
1474 }
1475
1476 // Implement isa/cast/dyncast/etc.
1477 static bool classof(const Decl *D) { return classofKind(D->getKind()); }
1478 static bool classofKind(Kind K) { return K == TemplateTemplateParm; }
1479
1480 friend class ASTDeclReader;
1481 friend class ASTDeclWriter;
1482 friend TrailingObjects;
1483 };
1484
1485 /// \brief Represents the builtin template declaration which is used to
1486 /// implement __make_integer_seq. It serves no real purpose beyond existing as
1487 /// a place to hold template parameters.
1488 class BuiltinTemplateDecl : public TemplateDecl {
1489 void anchor() override;
1490
1491 BuiltinTemplateDecl(const ASTContext &C, DeclContext *DC,
1492 DeclarationName Name, BuiltinTemplateKind BTK);
1493
1494 BuiltinTemplateKind BTK;
1495
1496 public:
1497 // Implement isa/cast/dyncast support
1498 static bool classof(const Decl *D) { return classofKind(D->getKind()); }
1499 static bool classofKind(Kind K) { return K == BuiltinTemplate; }
1500
1501 static BuiltinTemplateDecl *Create(const ASTContext &C, DeclContext *DC,
1502 DeclarationName Name,
1503 BuiltinTemplateKind BTK) {
1504 return new (C, DC) BuiltinTemplateDecl(C, DC, Name, BTK);
1505 }
1506
1507 SourceRange getSourceRange() const override LLVM_READONLY {
1508 return SourceRange();
1509 }
1510
1511 BuiltinTemplateKind getBuiltinTemplateKind() const { return BTK; }
1512 };
1513
1514 /// \brief Represents a class template specialization, which refers to
1515 /// a class template with a given set of template arguments.
1516 ///
1517 /// Class template specializations represent both explicit
1518 /// specialization of class templates, as in the example below, and
1519 /// implicit instantiations of class templates.
1520 ///
1521 /// \code
1522 /// template<typename T> class array;
1523 ///
1524 /// template<>
1525 /// class array<bool> { }; // class template specialization array<bool>
1526 /// \endcode
1527 class ClassTemplateSpecializationDecl
1528 : public CXXRecordDecl, public llvm::FoldingSetNode {
1529
1530 /// \brief Structure that stores information about a class template
1531 /// specialization that was instantiated from a class template partial
1532 /// specialization.
1533 struct SpecializedPartialSpecialization {
1534 /// \brief The class template partial specialization from which this
1535 /// class template specialization was instantiated.
1536 ClassTemplatePartialSpecializationDecl *PartialSpecialization;
1537
1538 /// \brief The template argument list deduced for the class template
1539 /// partial specialization itself.
1540 const TemplateArgumentList *TemplateArgs;
1541 };
1542
1543 /// \brief The template that this specialization specializes
1544 llvm::PointerUnion<ClassTemplateDecl *, SpecializedPartialSpecialization *>
1545 SpecializedTemplate;
1546
1547 /// \brief Further info for explicit template specialization/instantiation.
1548 struct ExplicitSpecializationInfo {
1549 /// \brief The type-as-written.
1550 TypeSourceInfo *TypeAsWritten;
1551 /// \brief The location of the extern keyword.
1552 SourceLocation ExternLoc;
1553 /// \brief The location of the template keyword.
1554 SourceLocation TemplateKeywordLoc;
1555
1556 ExplicitSpecializationInfo()
1557 : TypeAsWritten(nullptr), ExternLoc(), TemplateKeywordLoc() {}
1558 };
1559
1560 /// \brief Further info for explicit template specialization/instantiation.
1561 /// Does not apply to implicit specializations.
1562 ExplicitSpecializationInfo *ExplicitInfo;
1563
1564 /// \brief The template arguments used to describe this specialization.
1565 const TemplateArgumentList *TemplateArgs;
1566
1567 /// \brief The point where this template was instantiated (if any)
1568 SourceLocation PointOfInstantiation;
1569
1570 /// \brief The kind of specialization this declaration refers to.
1571 /// Really a value of type TemplateSpecializationKind.
1572 unsigned SpecializationKind : 3;
1573
1574 protected:
1575 ClassTemplateSpecializationDecl(ASTContext &Context, Kind DK, TagKind TK,
1576 DeclContext *DC, SourceLocation StartLoc,
1577 SourceLocation IdLoc,
1578 ClassTemplateDecl *SpecializedTemplate,
1579 const TemplateArgument *Args,
1580 unsigned NumArgs,
1581 ClassTemplateSpecializationDecl *PrevDecl);
1582
1583 explicit ClassTemplateSpecializationDecl(ASTContext &C, Kind DK);
1584
1585 public:
1586 static ClassTemplateSpecializationDecl *
1587 Create(ASTContext &Context, TagKind TK, DeclContext *DC,
1588 SourceLocation StartLoc, SourceLocation IdLoc,
1589 ClassTemplateDecl *SpecializedTemplate,
1590 const TemplateArgument *Args,
1591 unsigned NumArgs,
1592 ClassTemplateSpecializationDecl *PrevDecl);
1593 static ClassTemplateSpecializationDecl *
1594 CreateDeserialized(ASTContext &C, unsigned ID);
1595
1596 void getNameForDiagnostic(raw_ostream &OS, const PrintingPolicy &Policy,
1597 bool Qualified) const override;
1598
1599 // FIXME: This is broken. CXXRecordDecl::getMostRecentDecl() returns a
1600 // different "most recent" declaration from this function for the same
1601 // declaration, because we don't override getMostRecentDeclImpl(). But
1602 // it's not clear that we should override that, because the most recent
1603 // declaration as a CXXRecordDecl sometimes is the injected-class-name.
1604 ClassTemplateSpecializationDecl *getMostRecentDecl() {
1605 CXXRecordDecl *Recent = static_cast<CXXRecordDecl *>(
1606 this)->getMostRecentDecl();
1607 while (!isa<ClassTemplateSpecializationDecl>(Recent)) {
1608 // FIXME: Does injected class name need to be in the redeclarations chain?
1609 assert(Recent->isInjectedClassName() && Recent->getPreviousDecl());
1610 Recent = Recent->getPreviousDecl();
1611 }
1612 return cast<ClassTemplateSpecializationDecl>(Recent);
1613 }
1614
1615 /// \brief Retrieve the template that this specialization specializes.
1616 ClassTemplateDecl *getSpecializedTemplate() const;
1617
1618 /// \brief Retrieve the template arguments of the class template
1619 /// specialization.
1620 const TemplateArgumentList &getTemplateArgs() const {
1621 return *TemplateArgs;
1622 }
1623
1624 /// \brief Determine the kind of specialization that this
1625 /// declaration represents.
1626 TemplateSpecializationKind getSpecializationKind() const {
1627 return static_cast<TemplateSpecializationKind>(SpecializationKind);
1628 }
1629
1630 bool isExplicitSpecialization() const {
1631 return getSpecializationKind() == TSK_ExplicitSpecialization;
1632 }
1633
1634 /// \brief True if this declaration is an explicit specialization,
1635 /// explicit instantiation declaration, or explicit instantiation
1636 /// definition.
1637 bool isExplicitInstantiationOrSpecialization() const {
1638 return isTemplateExplicitInstantiationOrSpecialization(
1639 getTemplateSpecializationKind());
1640 }
1641
1642 void setSpecializationKind(TemplateSpecializationKind TSK) {
1643 SpecializationKind = TSK;
1644 }
1645
1646 /// \brief Get the point of instantiation (if any), or null if none.
1647 SourceLocation getPointOfInstantiation() const {
1648 return PointOfInstantiation;
1649 }
1650
1651 void setPointOfInstantiation(SourceLocation Loc) {
1652 assert(Loc.isValid() && "point of instantiation must be valid!");
1653 PointOfInstantiation = Loc;
1654 }
1655
1656 /// \brief If this class template specialization is an instantiation of
1657 /// a template (rather than an explicit specialization), return the
1658 /// class template or class template partial specialization from which it
1659 /// was instantiated.
1660 llvm::PointerUnion<ClassTemplateDecl *,
1661 ClassTemplatePartialSpecializationDecl *>
1662 getInstantiatedFrom() const {
1663 if (!isTemplateInstantiation(getSpecializationKind()))
1664 return llvm::PointerUnion<ClassTemplateDecl *,
1665 ClassTemplatePartialSpecializationDecl *>();
1666
1667 return getSpecializedTemplateOrPartial();
1668 }
1669
1670 /// \brief Retrieve the class template or class template partial
1671 /// specialization which was specialized by this.
1672 llvm::PointerUnion<ClassTemplateDecl *,
1673 ClassTemplatePartialSpecializationDecl *>
1674 getSpecializedTemplateOrPartial() const {
1675 if (SpecializedPartialSpecialization *PartialSpec
1676 = SpecializedTemplate.dyn_cast<SpecializedPartialSpecialization*>())
1677 return PartialSpec->PartialSpecialization;
1678
1679 return SpecializedTemplate.get<ClassTemplateDecl*>();
1680 }
1681
1682 /// \brief Retrieve the set of template arguments that should be used
1683 /// to instantiate members of the class template or class template partial
1684 /// specialization from which this class template specialization was
1685 /// instantiated.
1686 ///
1687 /// \returns For a class template specialization instantiated from the primary
1688 /// template, this function will return the same template arguments as
1689 /// getTemplateArgs(). For a class template specialization instantiated from
1690 /// a class template partial specialization, this function will return the
1691 /// deduced template arguments for the class template partial specialization
1692 /// itself.
1693 const TemplateArgumentList &getTemplateInstantiationArgs() const {
1694 if (SpecializedPartialSpecialization *PartialSpec
1695 = SpecializedTemplate.dyn_cast<SpecializedPartialSpecialization*>())
1696 return *PartialSpec->TemplateArgs;
1697
1698 return getTemplateArgs();
1699 }
1700
1701 /// \brief Note that this class template specialization is actually an
1702 /// instantiation of the given class template partial specialization whose
1703 /// template arguments have been deduced.
1704 void setInstantiationOf(ClassTemplatePartialSpecializationDecl *PartialSpec,
1705 const TemplateArgumentList *TemplateArgs) {
1706 assert(!SpecializedTemplate.is<SpecializedPartialSpecialization*>() &&
1707 "Already set to a class template partial specialization!");
1708 SpecializedPartialSpecialization *PS
1709 = new (getASTContext()) SpecializedPartialSpecialization();
1710 PS->PartialSpecialization = PartialSpec;
1711 PS->TemplateArgs = TemplateArgs;
1712 SpecializedTemplate = PS;
1713 }
1714
1715 /// \brief Note that this class template specialization is an instantiation
1716 /// of the given class template.
1717 void setInstantiationOf(ClassTemplateDecl *TemplDecl) {
1718 assert(!SpecializedTemplate.is<SpecializedPartialSpecialization*>() &&
1719 "Previously set to a class template partial specialization!");
1720 SpecializedTemplate = TemplDecl;
1721 }
1722
1723 /// \brief Sets the type of this specialization as it was written by
1724 /// the user. This will be a class template specialization type.
1725 void setTypeAsWritten(TypeSourceInfo *T) {
1726 if (!ExplicitInfo)
1727 ExplicitInfo = new (getASTContext()) ExplicitSpecializationInfo;
1728 ExplicitInfo->TypeAsWritten = T;
1729 }
1730 /// \brief Gets the type of this specialization as it was written by
1731 /// the user, if it was so written.
1732 TypeSourceInfo *getTypeAsWritten() const {
1733 return ExplicitInfo ? ExplicitInfo->TypeAsWritten : nullptr;
1734 }
1735
1736 /// \brief Gets the location of the extern keyword, if present.
1737 SourceLocation getExternLoc() const {
1738 return ExplicitInfo ? ExplicitInfo->ExternLoc : SourceLocation();
1739 }
1740 /// \brief Sets the location of the extern keyword.
1741 void setExternLoc(SourceLocation Loc) {
1742 if (!ExplicitInfo)
1743 ExplicitInfo = new (getASTContext()) ExplicitSpecializationInfo;
1744 ExplicitInfo->ExternLoc = Loc;
1745 }
1746
1747 /// \brief Sets the location of the template keyword.
1748 void setTemplateKeywordLoc(SourceLocation Loc) {
1749 if (!ExplicitInfo)
1750 ExplicitInfo = new (getASTContext()) ExplicitSpecializationInfo;
1751 ExplicitInfo->TemplateKeywordLoc = Loc;
1752 }
1753 /// \brief Gets the location of the template keyword, if present.
1754 SourceLocation getTemplateKeywordLoc() const {
1755 return ExplicitInfo ? ExplicitInfo->TemplateKeywordLoc : SourceLocation();
1756 }
1757
1758 SourceRange getSourceRange() const override LLVM_READONLY;
1759
1760 void Profile(llvm::FoldingSetNodeID &ID) const {
1761 Profile(ID, TemplateArgs->asArray(), getASTContext());
1762 }
1763
1764 static void
1765 Profile(llvm::FoldingSetNodeID &ID, ArrayRef<TemplateArgument> TemplateArgs,
1766 ASTContext &Context) {
1767 ID.AddInteger(TemplateArgs.size());
1768 for (unsigned Arg = 0; Arg != TemplateArgs.size(); ++Arg)
1769 TemplateArgs[Arg].Profile(ID, Context);
1770 }
1771
1772 static bool classof(const Decl *D) { return classofKind(D->getKind()); }
1773 static bool classofKind(Kind K) {
1774 return K >= firstClassTemplateSpecialization &&
1775 K <= lastClassTemplateSpecialization;
1776 }
1777
1778 friend class ASTDeclReader;
1779 friend class ASTDeclWriter;
1780 };
1781
1782 class ClassTemplatePartialSpecializationDecl
1783 : public ClassTemplateSpecializationDecl {
1784 void anchor() override;
1785
1786 /// \brief The list of template parameters
1787 TemplateParameterList* TemplateParams;
1788
1789 /// \brief The source info for the template arguments as written.
1790 /// FIXME: redundant with TypeAsWritten?
1791 const ASTTemplateArgumentListInfo *ArgsAsWritten;
1792
1793 /// \brief The class template partial specialization from which this
1794 /// class template partial specialization was instantiated.
1795 ///
1796 /// The boolean value will be true to indicate that this class template
1797 /// partial specialization was specialized at this level.
1798 llvm::PointerIntPair<ClassTemplatePartialSpecializationDecl *, 1, bool>
1799 InstantiatedFromMember;
1800
1801 ClassTemplatePartialSpecializationDecl(ASTContext &Context, TagKind TK,
1802 DeclContext *DC,
1803 SourceLocation StartLoc,
1804 SourceLocation IdLoc,
1805 TemplateParameterList *Params,
1806 ClassTemplateDecl *SpecializedTemplate,
1807 const TemplateArgument *Args,
1808 unsigned NumArgs,
1809 const ASTTemplateArgumentListInfo *ArgsAsWritten,
1810 ClassTemplatePartialSpecializationDecl *PrevDecl);
1811
1812 ClassTemplatePartialSpecializationDecl(ASTContext &C)
1813 : ClassTemplateSpecializationDecl(C, ClassTemplatePartialSpecialization),
1814 TemplateParams(nullptr), ArgsAsWritten(nullptr),
1815 InstantiatedFromMember(nullptr, false) {}
1816
1817 public:
1818 static ClassTemplatePartialSpecializationDecl *
1819 Create(ASTContext &Context, TagKind TK, DeclContext *DC,
1820 SourceLocation StartLoc, SourceLocation IdLoc,
1821 TemplateParameterList *Params,
1822 ClassTemplateDecl *SpecializedTemplate,
1823 const TemplateArgument *Args,
1824 unsigned NumArgs,
1825 const TemplateArgumentListInfo &ArgInfos,
1826 QualType CanonInjectedType,
1827 ClassTemplatePartialSpecializationDecl *PrevDecl);
1828
1829 static ClassTemplatePartialSpecializationDecl *
1830 CreateDeserialized(ASTContext &C, unsigned ID);
1831
1832 ClassTemplatePartialSpecializationDecl *getMostRecentDecl() {
1833 return cast<ClassTemplatePartialSpecializationDecl>(
1834 static_cast<ClassTemplateSpecializationDecl *>(
1835 this)->getMostRecentDecl());
1836 }
1837
1838 /// Get the list of template parameters
1839 TemplateParameterList *getTemplateParameters() const {
1840 return TemplateParams;
1841 }
1842
1843 /// Get the template arguments as written.
1844 const ASTTemplateArgumentListInfo *getTemplateArgsAsWritten() const {
1845 return ArgsAsWritten;
1846 }
1847
1848 /// \brief Retrieve the member class template partial specialization from
1849 /// which this particular class template partial specialization was
1850 /// instantiated.
1851 ///
1852 /// \code
1853 /// template<typename T>
1854 /// struct Outer {
1855 /// template<typename U> struct Inner;
1856 /// template<typename U> struct Inner<U*> { }; // #1
1857 /// };
1858 ///
1859 /// Outer<float>::Inner<int*> ii;
1860 /// \endcode
1861 ///
1862 /// In this example, the instantiation of \c Outer<float>::Inner<int*> will
1863 /// end up instantiating the partial specialization
1864 /// \c Outer<float>::Inner<U*>, which itself was instantiated from the class
1865 /// template partial specialization \c Outer<T>::Inner<U*>. Given
1866 /// \c Outer<float>::Inner<U*>, this function would return
1867 /// \c Outer<T>::Inner<U*>.
1868 ClassTemplatePartialSpecializationDecl *getInstantiatedFromMember() const {
1869 const ClassTemplatePartialSpecializationDecl *First =
1870 cast<ClassTemplatePartialSpecializationDecl>(getFirstDecl());
1871 return First->InstantiatedFromMember.getPointer();
1872 }
1873
1874 void setInstantiatedFromMember(
1875 ClassTemplatePartialSpecializationDecl *PartialSpec) {
1876 ClassTemplatePartialSpecializationDecl *First =
1877 cast<ClassTemplatePartialSpecializationDecl>(getFirstDecl());
1878 First->InstantiatedFromMember.setPointer(PartialSpec);
1879 }
1880
1881 /// \brief Determines whether this class template partial specialization
1882 /// template was a specialization of a member partial specialization.
1883 ///
1884 /// In the following example, the member template partial specialization
1885 /// \c X<int>::Inner<T*> is a member specialization.
1886 ///
1887 /// \code
1888 /// template<typename T>
1889 /// struct X {
1890 /// template<typename U> struct Inner;
1891 /// template<typename U> struct Inner<U*>;
1892 /// };
1893 ///
1894 /// template<> template<typename T>
1895 /// struct X<int>::Inner<T*> { /* ... */ };
1896 /// \endcode
1897 bool isMemberSpecialization() {
1898 ClassTemplatePartialSpecializationDecl *First =
1899 cast<ClassTemplatePartialSpecializationDecl>(getFirstDecl());
1900 return First->InstantiatedFromMember.getInt();
1901 }
1902
1903 /// \brief Note that this member template is a specialization.
1904 void setMemberSpecialization() {
1905 ClassTemplatePartialSpecializationDecl *First =
1906 cast<ClassTemplatePartialSpecializationDecl>(getFirstDecl());
1907 assert(First->InstantiatedFromMember.getPointer() &&
1908 "Only member templates can be member template specializations");
1909 return First->InstantiatedFromMember.setInt(true);
1910 }
1911
1912 /// Retrieves the injected specialization type for this partial
1913 /// specialization. This is not the same as the type-decl-type for
1914 /// this partial specialization, which is an InjectedClassNameType.
1915 QualType getInjectedSpecializationType() const {
1916 assert(getTypeForDecl() && "partial specialization has no type set!");
1917 return cast<InjectedClassNameType>(getTypeForDecl())
1918 ->getInjectedSpecializationType();
1919 }
1920
1921 // FIXME: Add Profile support!
1922
1923 static bool classof(const Decl *D) { return classofKind(D->getKind()); }
1924 static bool classofKind(Kind K) {
1925 return K == ClassTemplatePartialSpecialization;
1926 }
1927
1928 friend class ASTDeclReader;
1929 friend class ASTDeclWriter;
1930 };
1931
1932 /// Declaration of a class template.
1933 class ClassTemplateDecl : public RedeclarableTemplateDecl {
1934 static void DeallocateCommon(void *Ptr);
1935
1936 protected:
1937 /// \brief Data that is common to all of the declarations of a given
1938 /// class template.
1939 struct Common : CommonBase {
1940 Common() : LazySpecializations() { }
1941
1942 /// \brief The class template specializations for this class
1943 /// template, including explicit specializations and instantiations.
1944 llvm::FoldingSetVector<ClassTemplateSpecializationDecl> Specializations;
1945
1946 /// \brief The class template partial specializations for this class
1947 /// template.
1948 llvm::FoldingSetVector<ClassTemplatePartialSpecializationDecl>
1949 PartialSpecializations;
1950
1951 /// \brief The injected-class-name type for this class template.
1952 QualType InjectedClassNameType;
1953
1954 /// \brief If non-null, points to an array of specializations (including
1955 /// partial specializations) known only by their external declaration IDs.
1956 ///
1957 /// The first value in the array is the number of of specializations/
1958 /// partial specializations that follow.
1959 uint32_t *LazySpecializations;
1960 };
1961
1962 /// \brief Retrieve the set of specializations of this class template.
1963 llvm::FoldingSetVector<ClassTemplateSpecializationDecl> &
1964 getSpecializations() const;
1965
1966 /// \brief Retrieve the set of partial specializations of this class
1967 /// template.
1968 llvm::FoldingSetVector<ClassTemplatePartialSpecializationDecl> &
1969 getPartialSpecializations();
1970
1971 ClassTemplateDecl(ASTContext &C, DeclContext *DC, SourceLocation L,
1972 DeclarationName Name, TemplateParameterList *Params,
1973 NamedDecl *Decl)
1974 : RedeclarableTemplateDecl(ClassTemplate, C, DC, L, Name, Params, Decl) {}
1975
1976 CommonBase *newCommon(ASTContext &C) const override;
1977
1978 Common *getCommonPtr() const {
1979 return static_cast<Common *>(RedeclarableTemplateDecl::getCommonPtr());
1980 }
1981
1982 public:
1983 /// \brief Load any lazily-loaded specializations from the external source.
1984 void LoadLazySpecializations() const;
1985
1986 /// \brief Get the underlying class declarations of the template.
1987 CXXRecordDecl *getTemplatedDecl() const {
1988 return static_cast<CXXRecordDecl *>(TemplatedDecl);
1989 }
1990
1991 /// \brief Returns whether this template declaration defines the primary
1992 /// class pattern.
1993 bool isThisDeclarationADefinition() const {
1994 return getTemplatedDecl()->isThisDeclarationADefinition();
1995 }
1996
1997 /// \brief Create a class template node.
1998 static ClassTemplateDecl *Create(ASTContext &C, DeclContext *DC,
1999 SourceLocation L,
2000 DeclarationName Name,
2001 TemplateParameterList *Params,
2002 NamedDecl *Decl,
2003 ClassTemplateDecl *PrevDecl);
2004
2005 /// \brief Create an empty class template node.
2006 static ClassTemplateDecl *CreateDeserialized(ASTContext &C, unsigned ID);
2007
2008 /// \brief Return the specialization with the provided arguments if it exists,
2009 /// otherwise return the insertion point.
2010 ClassTemplateSpecializationDecl *
2011 findSpecialization(ArrayRef<TemplateArgument> Args, void *&InsertPos);
2012
2013 /// \brief Insert the specified specialization knowing that it is not already
2014 /// in. InsertPos must be obtained from findSpecialization.
2015 void AddSpecialization(ClassTemplateSpecializationDecl *D, void *InsertPos);
2016
2017 ClassTemplateDecl *getCanonicalDecl() override {
2018 return cast<ClassTemplateDecl>(
2019 RedeclarableTemplateDecl::getCanonicalDecl());
2020 }
2021 const ClassTemplateDecl *getCanonicalDecl() const {
2022 return cast<ClassTemplateDecl>(
2023 RedeclarableTemplateDecl::getCanonicalDecl());
2024 }
2025
2026 /// \brief Retrieve the previous declaration of this class template, or
2027 /// NULL if no such declaration exists.
2028 ClassTemplateDecl *getPreviousDecl() {
2029 return cast_or_null<ClassTemplateDecl>(
2030 static_cast<RedeclarableTemplateDecl *>(this)->getPreviousDecl());
2031 }
2032
2033 /// \brief Retrieve the previous declaration of this class template, or
2034 /// NULL if no such declaration exists.
2035 const ClassTemplateDecl *getPreviousDecl() const {
2036 return cast_or_null<ClassTemplateDecl>(
2037 static_cast<const RedeclarableTemplateDecl *>(
2038 this)->getPreviousDecl());
2039 }
2040
2041 ClassTemplateDecl *getMostRecentDecl() {
2042 return cast<ClassTemplateDecl>(
2043 static_cast<RedeclarableTemplateDecl *>(this)->getMostRecentDecl());
2044 }
2045 const ClassTemplateDecl *getMostRecentDecl() const {
2046 return const_cast<ClassTemplateDecl*>(this)->getMostRecentDecl();
2047 }
2048
2049 ClassTemplateDecl *getInstantiatedFromMemberTemplate() const {
2050 return cast_or_null<ClassTemplateDecl>(
2051 RedeclarableTemplateDecl::getInstantiatedFromMemberTemplate());
2052 }
2053
2054 /// \brief Return the partial specialization with the provided arguments if it
2055 /// exists, otherwise return the insertion point.
2056 ClassTemplatePartialSpecializationDecl *
2057 findPartialSpecialization(ArrayRef<TemplateArgument> Args, void *&InsertPos);
2058
2059 /// \brief Insert the specified partial specialization knowing that it is not
2060 /// already in. InsertPos must be obtained from findPartialSpecialization.
2061 void AddPartialSpecialization(ClassTemplatePartialSpecializationDecl *D,
2062 void *InsertPos);
2063
2064 /// \brief Retrieve the partial specializations as an ordered list.
2065 void getPartialSpecializations(
2066 SmallVectorImpl<ClassTemplatePartialSpecializationDecl *> &PS);
2067
2068 /// \brief Find a class template partial specialization with the given
2069 /// type T.
2070 ///
2071 /// \param T a dependent type that names a specialization of this class
2072 /// template.
2073 ///
2074 /// \returns the class template partial specialization that exactly matches
2075 /// the type \p T, or NULL if no such partial specialization exists.
2076 ClassTemplatePartialSpecializationDecl *findPartialSpecialization(QualType T);
2077
2078 /// \brief Find a class template partial specialization which was instantiated
2079 /// from the given member partial specialization.
2080 ///
2081 /// \param D a member class template partial specialization.
2082 ///
2083 /// \returns the class template partial specialization which was instantiated
2084 /// from the given member partial specialization, or NULL if no such partial
2085 /// specialization exists.
2086 ClassTemplatePartialSpecializationDecl *
2087 findPartialSpecInstantiatedFromMember(
2088 ClassTemplatePartialSpecializationDecl *D);
2089
2090 /// \brief Retrieve the template specialization type of the
2091 /// injected-class-name for this class template.
2092 ///
2093 /// The injected-class-name for a class template \c X is \c
2094 /// X<template-args>, where \c template-args is formed from the
2095 /// template arguments that correspond to the template parameters of
2096 /// \c X. For example:
2097 ///
2098 /// \code
2099 /// template<typename T, int N>
2100 /// struct array {
2101 /// typedef array this_type; // "array" is equivalent to "array<T, N>"
2102 /// };
2103 /// \endcode
2104 QualType getInjectedClassNameSpecialization();
2105
2106 typedef SpecIterator<ClassTemplateSpecializationDecl> spec_iterator;
2107 typedef llvm::iterator_range<spec_iterator> spec_range;
2108
2109 spec_range specializations() const {
2110 return spec_range(spec_begin(), spec_end());
2111 }
2112
2113 spec_iterator spec_begin() const {
2114 return makeSpecIterator(getSpecializations(), false);
2115 }
2116
2117 spec_iterator spec_end() const {
2118 return makeSpecIterator(getSpecializations(), true);
2119 }
2120
2121 // Implement isa/cast/dyncast support
2122 static bool classof(const Decl *D) { return classofKind(D->getKind()); }
2123 static bool classofKind(Kind K) { return K == ClassTemplate; }
2124
2125 friend class ASTDeclReader;
2126 friend class ASTDeclWriter;
2127 };
2128
2129 /// \brief Declaration of a friend template.
2130 ///
2131 /// For example:
2132 /// \code
2133 /// template \<typename T> class A {
2134 /// friend class MyVector<T>; // not a friend template
2135 /// template \<typename U> friend class B; // not a friend template
2136 /// template \<typename U> friend class Foo<T>::Nested; // friend template
2137 /// };
2138 /// \endcode
2139 ///
2140 /// \note This class is not currently in use. All of the above
2141 /// will yield a FriendDecl, not a FriendTemplateDecl.
2142 class FriendTemplateDecl : public Decl {
2143 virtual void anchor();
2144 public:
2145 typedef llvm::PointerUnion<NamedDecl*,TypeSourceInfo*> FriendUnion;
2146
2147 private:
2148 // The number of template parameters; always non-zero.
2149 unsigned NumParams;
2150
2151 // The parameter list.
2152 TemplateParameterList **Params;
2153
2154 // The declaration that's a friend of this class.
2155 FriendUnion Friend;
2156
2157 // Location of the 'friend' specifier.
2158 SourceLocation FriendLoc;
2159
2160
2161 FriendTemplateDecl(DeclContext *DC, SourceLocation Loc,
2162 unsigned NParams,
2163 TemplateParameterList **Params,
2164 FriendUnion Friend,
2165 SourceLocation FriendLoc)
2166 : Decl(Decl::FriendTemplate, DC, Loc),
2167 NumParams(NParams),
2168 Params(Params),
2169 Friend(Friend),
2170 FriendLoc(FriendLoc)
2171 {}
2172
2173 FriendTemplateDecl(EmptyShell Empty)
2174 : Decl(Decl::FriendTemplate, Empty),
2175 NumParams(0),
2176 Params(nullptr)
2177 {}
2178
2179 public:
2180 static FriendTemplateDecl *Create(ASTContext &Context,
2181 DeclContext *DC, SourceLocation Loc,
2182 unsigned NParams,
2183 TemplateParameterList **Params,
2184 FriendUnion Friend,
2185 SourceLocation FriendLoc);
2186
2187 static FriendTemplateDecl *CreateDeserialized(ASTContext &C, unsigned ID);
2188
2189 /// If this friend declaration names a templated type (or
2190 /// a dependent member type of a templated type), return that
2191 /// type; otherwise return null.
2192 TypeSourceInfo *getFriendType() const {
2193 return Friend.dyn_cast<TypeSourceInfo*>();
2194 }
2195
2196 /// If this friend declaration names a templated function (or
2197 /// a member function of a templated type), return that type;
2198 /// otherwise return null.
2199 NamedDecl *getFriendDecl() const {
2200 return Friend.dyn_cast<NamedDecl*>();
2201 }
2202
2203 /// \brief Retrieves the location of the 'friend' keyword.
2204 SourceLocation getFriendLoc() const {
2205 return FriendLoc;
2206 }
2207
2208 TemplateParameterList *getTemplateParameterList(unsigned i) const {
2209 assert(i <= NumParams);
2210 return Params[i];
2211 }
2212
2213 unsigned getNumTemplateParameters() const {
2214 return NumParams;
2215 }
2216
2217 // Implement isa/cast/dyncast/etc.
2218 static bool classof(const Decl *D) { return classofKind(D->getKind()); }
2219 static bool classofKind(Kind K) { return K == Decl::FriendTemplate; }
2220
2221 friend class ASTDeclReader;
2222 };
2223
2224 /// \brief Declaration of an alias template.
2225 ///
2226 /// For example:
2227 /// \code
2228 /// template \<typename T> using V = std::map<T*, int, MyCompare<T>>;
2229 /// \endcode
2230 class TypeAliasTemplateDecl : public RedeclarableTemplateDecl {
2231 static void DeallocateCommon(void *Ptr);
2232
2233 protected:
2234 typedef CommonBase Common;
2235
2236 TypeAliasTemplateDecl(ASTContext &C, DeclContext *DC, SourceLocation L,
2237 DeclarationName Name, TemplateParameterList *Params,
2238 NamedDecl *Decl)
2239 : RedeclarableTemplateDecl(TypeAliasTemplate, C, DC, L, Name, Params,
2240 Decl) {}
2241
2242 CommonBase *newCommon(ASTContext &C) const override;
2243
2244 Common *getCommonPtr() {
2245 return static_cast<Common *>(RedeclarableTemplateDecl::getCommonPtr());
2246 }
2247
2248 public:
2249 /// Get the underlying function declaration of the template.
2250 TypeAliasDecl *getTemplatedDecl() const {
2251 return static_cast<TypeAliasDecl*>(TemplatedDecl);
2252 }
2253
2254
2255 TypeAliasTemplateDecl *getCanonicalDecl() override {
2256 return cast<TypeAliasTemplateDecl>(
2257 RedeclarableTemplateDecl::getCanonicalDecl());
2258 }
2259 const TypeAliasTemplateDecl *getCanonicalDecl() const {
2260 return cast<TypeAliasTemplateDecl>(
2261 RedeclarableTemplateDecl::getCanonicalDecl());
2262 }
2263
2264 /// \brief Retrieve the previous declaration of this function template, or
2265 /// NULL if no such declaration exists.
2266 TypeAliasTemplateDecl *getPreviousDecl() {
2267 return cast_or_null<TypeAliasTemplateDecl>(
2268 static_cast<RedeclarableTemplateDecl *>(this)->getPreviousDecl());
2269 }
2270
2271 /// \brief Retrieve the previous declaration of this function template, or
2272 /// NULL if no such declaration exists.
2273 const TypeAliasTemplateDecl *getPreviousDecl() const {
2274 return cast_or_null<TypeAliasTemplateDecl>(
2275 static_cast<const RedeclarableTemplateDecl *>(
2276 this)->getPreviousDecl());
2277 }
2278
2279 TypeAliasTemplateDecl *getInstantiatedFromMemberTemplate() const {
2280 return cast_or_null<TypeAliasTemplateDecl>(
2281 RedeclarableTemplateDecl::getInstantiatedFromMemberTemplate());
2282 }
2283
2284
2285 /// \brief Create a function template node.
2286 static TypeAliasTemplateDecl *Create(ASTContext &C, DeclContext *DC,
2287 SourceLocation L,
2288 DeclarationName Name,
2289 TemplateParameterList *Params,
2290 NamedDecl *Decl);
2291
2292 /// \brief Create an empty alias template node.
2293 static TypeAliasTemplateDecl *CreateDeserialized(ASTContext &C, unsigned ID);
2294
2295 // Implement isa/cast/dyncast support
2296 static bool classof(const Decl *D) { return classofKind(D->getKind()); }
2297 static bool classofKind(Kind K) { return K == TypeAliasTemplate; }
2298
2299 friend class ASTDeclReader;
2300 friend class ASTDeclWriter;
2301 };
2302
2303 /// \brief Declaration of a function specialization at template class scope.
2304 ///
2305 /// This is a non-standard extension needed to support MSVC.
2306 ///
2307 /// For example:
2308 /// \code
2309 /// template <class T>
2310 /// class A {
2311 /// template <class U> void foo(U a) { }
2312 /// template<> void foo(int a) { }
2313 /// }
2314 /// \endcode
2315 ///
2316 /// "template<> foo(int a)" will be saved in Specialization as a normal
2317 /// CXXMethodDecl. Then during an instantiation of class A, it will be
2318 /// transformed into an actual function specialization.
2319 class ClassScopeFunctionSpecializationDecl : public Decl {
2320 virtual void anchor();
2321
2322 ClassScopeFunctionSpecializationDecl(DeclContext *DC, SourceLocation Loc,
2323 CXXMethodDecl *FD, bool Args,
2324 TemplateArgumentListInfo TemplArgs)
2325 : Decl(Decl::ClassScopeFunctionSpecialization, DC, Loc),
2326 Specialization(FD), HasExplicitTemplateArgs(Args),
2327 TemplateArgs(TemplArgs) {}
2328
2329 ClassScopeFunctionSpecializationDecl(EmptyShell Empty)
2330 : Decl(Decl::ClassScopeFunctionSpecialization, Empty) {}
2331
2332 CXXMethodDecl *Specialization;
2333 bool HasExplicitTemplateArgs;
2334 TemplateArgumentListInfo TemplateArgs;
2335
2336 public:
2337 CXXMethodDecl *getSpecialization() const { return Specialization; }
2338 bool hasExplicitTemplateArgs() const { return HasExplicitTemplateArgs; }
2339 const TemplateArgumentListInfo& templateArgs() const { return TemplateArgs; }
2340
2341 static ClassScopeFunctionSpecializationDecl *Create(ASTContext &C,
2342 DeclContext *DC,
2343 SourceLocation Loc,
2344 CXXMethodDecl *FD,
2345 bool HasExplicitTemplateArgs,
2346 TemplateArgumentListInfo TemplateArgs) {
2347 return new (C, DC) ClassScopeFunctionSpecializationDecl(
2348 DC, Loc, FD, HasExplicitTemplateArgs, TemplateArgs);
2349 }
2350
2351 static ClassScopeFunctionSpecializationDecl *
2352 CreateDeserialized(ASTContext &Context, unsigned ID);
2353
2354 // Implement isa/cast/dyncast/etc.
2355 static bool classof(const Decl *D) { return classofKind(D->getKind()); }
2356 static bool classofKind(Kind K) {
2357 return K == Decl::ClassScopeFunctionSpecialization;
2358 }
2359
2360 friend class ASTDeclReader;
2361 friend class ASTDeclWriter;
2362 };
2363
2364 /// Implementation of inline functions that require the template declarations
2365 inline AnyFunctionDecl::AnyFunctionDecl(FunctionTemplateDecl *FTD)
2366 : Function(FTD) { }
2367
2368 /// \brief Represents a variable template specialization, which refers to
2369 /// a variable template with a given set of template arguments.
2370 ///
2371 /// Variable template specializations represent both explicit
2372 /// specializations of variable templates, as in the example below, and
2373 /// implicit instantiations of variable templates.
2374 ///
2375 /// \code
2376 /// template<typename T> constexpr T pi = T(3.1415926535897932385);
2377 ///
2378 /// template<>
2379 /// constexpr float pi<float>; // variable template specialization pi<float>
2380 /// \endcode
2381 class VarTemplateSpecializationDecl : public VarDecl,
2382 public llvm::FoldingSetNode {
2383
2384 /// \brief Structure that stores information about a variable template
2385 /// specialization that was instantiated from a variable template partial
2386 /// specialization.
2387 struct SpecializedPartialSpecialization {
2388 /// \brief The variable template partial specialization from which this
2389 /// variable template specialization was instantiated.
2390 VarTemplatePartialSpecializationDecl *PartialSpecialization;
2391
2392 /// \brief The template argument list deduced for the variable template
2393 /// partial specialization itself.
2394 const TemplateArgumentList *TemplateArgs;
2395 };
2396
2397 /// \brief The template that this specialization specializes.
2398 llvm::PointerUnion<VarTemplateDecl *, SpecializedPartialSpecialization *>
2399 SpecializedTemplate;
2400
2401 /// \brief Further info for explicit template specialization/instantiation.
2402 struct ExplicitSpecializationInfo {
2403 /// \brief The type-as-written.
2404 TypeSourceInfo *TypeAsWritten;
2405 /// \brief The location of the extern keyword.
2406 SourceLocation ExternLoc;
2407 /// \brief The location of the template keyword.
2408 SourceLocation TemplateKeywordLoc;
2409
2410 ExplicitSpecializationInfo()
2411 : TypeAsWritten(nullptr), ExternLoc(), TemplateKeywordLoc() {}
2412 };
2413
2414 /// \brief Further info for explicit template specialization/instantiation.
2415 /// Does not apply to implicit specializations.
2416 ExplicitSpecializationInfo *ExplicitInfo;
2417
2418 /// \brief The template arguments used to describe this specialization.
2419 const TemplateArgumentList *TemplateArgs;
2420 TemplateArgumentListInfo TemplateArgsInfo;
2421
2422 /// \brief The point where this template was instantiated (if any).
2423 SourceLocation PointOfInstantiation;
2424
2425 /// \brief The kind of specialization this declaration refers to.
2426 /// Really a value of type TemplateSpecializationKind.
2427 unsigned SpecializationKind : 3;
2428
2429 protected:
2430 VarTemplateSpecializationDecl(Kind DK, ASTContext &Context, DeclContext *DC,
2431 SourceLocation StartLoc, SourceLocation IdLoc,
2432 VarTemplateDecl *SpecializedTemplate,
2433 QualType T, TypeSourceInfo *TInfo,
2434 StorageClass S, const TemplateArgument *Args,
2435 unsigned NumArgs);
2436
2437 explicit VarTemplateSpecializationDecl(Kind DK, ASTContext &Context);
2438
2439 public:
2440 static VarTemplateSpecializationDecl *
2441 Create(ASTContext &Context, DeclContext *DC, SourceLocation StartLoc,
2442 SourceLocation IdLoc, VarTemplateDecl *SpecializedTemplate, QualType T,
2443 TypeSourceInfo *TInfo, StorageClass S, const TemplateArgument *Args,
2444 unsigned NumArgs);
2445 static VarTemplateSpecializationDecl *CreateDeserialized(ASTContext &C,
2446 unsigned ID);
2447
2448 void getNameForDiagnostic(raw_ostream &OS, const PrintingPolicy &Policy,
2449 bool Qualified) const override;
2450
2451 VarTemplateSpecializationDecl *getMostRecentDecl() {
2452 VarDecl *Recent = static_cast<VarDecl *>(this)->getMostRecentDecl();
2453 return cast<VarTemplateSpecializationDecl>(Recent);
2454 }
2455
2456 /// \brief Retrieve the template that this specialization specializes.
2457 VarTemplateDecl *getSpecializedTemplate() const;
2458
2459 /// \brief Retrieve the template arguments of the variable template
2460 /// specialization.
2461 const TemplateArgumentList &getTemplateArgs() const { return *TemplateArgs; }
2462
2463 // TODO: Always set this when creating the new specialization?
2464 void setTemplateArgsInfo(const TemplateArgumentListInfo &ArgsInfo);
2465
2466 const TemplateArgumentListInfo &getTemplateArgsInfo() const {
2467 return TemplateArgsInfo;
2468 }
2469
2470 /// \brief Determine the kind of specialization that this
2471 /// declaration represents.
2472 TemplateSpecializationKind getSpecializationKind() const {
2473 return static_cast<TemplateSpecializationKind>(SpecializationKind);
2474 }
2475
2476 bool isExplicitSpecialization() const {
2477 return getSpecializationKind() == TSK_ExplicitSpecialization;
2478 }
2479
2480 /// \brief True if this declaration is an explicit specialization,
2481 /// explicit instantiation declaration, or explicit instantiation
2482 /// definition.
2483 bool isExplicitInstantiationOrSpecialization() const {
2484 return isTemplateExplicitInstantiationOrSpecialization(
2485 getTemplateSpecializationKind());
2486 }
2487
2488 void setSpecializationKind(TemplateSpecializationKind TSK) {
2489 SpecializationKind = TSK;
2490 }
2491
2492 /// \brief Get the point of instantiation (if any), or null if none.
2493 SourceLocation getPointOfInstantiation() const {
2494 return PointOfInstantiation;
2495 }
2496
2497 void setPointOfInstantiation(SourceLocation Loc) {
2498 assert(Loc.isValid() && "point of instantiation must be valid!");
2499 PointOfInstantiation = Loc;
2500 }
2501
2502 /// \brief If this variable template specialization is an instantiation of
2503 /// a template (rather than an explicit specialization), return the
2504 /// variable template or variable template partial specialization from which
2505 /// it was instantiated.
2506 llvm::PointerUnion<VarTemplateDecl *, VarTemplatePartialSpecializationDecl *>
2507 getInstantiatedFrom() const {
2508 if (getSpecializationKind() != TSK_ImplicitInstantiation &&
2509 getSpecializationKind() != TSK_ExplicitInstantiationDefinition &&
2510 getSpecializationKind() != TSK_ExplicitInstantiationDeclaration)
2511 return llvm::PointerUnion<VarTemplateDecl *,
2512 VarTemplatePartialSpecializationDecl *>();
2513
2514 if (SpecializedPartialSpecialization *PartialSpec =
2515 SpecializedTemplate.dyn_cast<SpecializedPartialSpecialization *>())
2516 return PartialSpec->PartialSpecialization;
2517
2518 return SpecializedTemplate.get<VarTemplateDecl *>();
2519 }
2520
2521 /// \brief Retrieve the variable template or variable template partial
2522 /// specialization which was specialized by this.
2523 llvm::PointerUnion<VarTemplateDecl *, VarTemplatePartialSpecializationDecl *>
2524 getSpecializedTemplateOrPartial() const {
2525 if (SpecializedPartialSpecialization *PartialSpec =
2526 SpecializedTemplate.dyn_cast<SpecializedPartialSpecialization *>())
2527 return PartialSpec->PartialSpecialization;
2528
2529 return SpecializedTemplate.get<VarTemplateDecl *>();
2530 }
2531
2532 /// \brief Retrieve the set of template arguments that should be used
2533 /// to instantiate the initializer of the variable template or variable
2534 /// template partial specialization from which this variable template
2535 /// specialization was instantiated.
2536 ///
2537 /// \returns For a variable template specialization instantiated from the
2538 /// primary template, this function will return the same template arguments
2539 /// as getTemplateArgs(). For a variable template specialization instantiated
2540 /// from a variable template partial specialization, this function will the
2541 /// return deduced template arguments for the variable template partial
2542 /// specialization itself.
2543 const TemplateArgumentList &getTemplateInstantiationArgs() const {
2544 if (SpecializedPartialSpecialization *PartialSpec =
2545 SpecializedTemplate.dyn_cast<SpecializedPartialSpecialization *>())
2546 return *PartialSpec->TemplateArgs;
2547
2548 return getTemplateArgs();
2549 }
2550
2551 /// \brief Note that this variable template specialization is actually an
2552 /// instantiation of the given variable template partial specialization whose
2553 /// template arguments have been deduced.
2554 void setInstantiationOf(VarTemplatePartialSpecializationDecl *PartialSpec,
2555 const TemplateArgumentList *TemplateArgs) {
2556 assert(!SpecializedTemplate.is<SpecializedPartialSpecialization *>() &&
2557 "Already set to a variable template partial specialization!");
2558 SpecializedPartialSpecialization *PS =
2559 new (getASTContext()) SpecializedPartialSpecialization();
2560 PS->PartialSpecialization = PartialSpec;
2561 PS->TemplateArgs = TemplateArgs;
2562 SpecializedTemplate = PS;
2563 }
2564
2565 /// \brief Note that this variable template specialization is an instantiation
2566 /// of the given variable template.
2567 void setInstantiationOf(VarTemplateDecl *TemplDecl) {
2568 assert(!SpecializedTemplate.is<SpecializedPartialSpecialization *>() &&
2569 "Previously set to a variable template partial specialization!");
2570 SpecializedTemplate = TemplDecl;
2571 }
2572
2573 /// \brief Sets the type of this specialization as it was written by
2574 /// the user.
2575 void setTypeAsWritten(TypeSourceInfo *T) {
2576 if (!ExplicitInfo)
2577 ExplicitInfo = new (getASTContext()) ExplicitSpecializationInfo;
2578 ExplicitInfo->TypeAsWritten = T;
2579 }
2580 /// \brief Gets the type of this specialization as it was written by
2581 /// the user, if it was so written.
2582 TypeSourceInfo *getTypeAsWritten() const {
2583 return ExplicitInfo ? ExplicitInfo->TypeAsWritten : nullptr;
2584 }
2585
2586 /// \brief Gets the location of the extern keyword, if present.
2587 SourceLocation getExternLoc() const {
2588 return ExplicitInfo ? ExplicitInfo->ExternLoc : SourceLocation();
2589 }
2590 /// \brief Sets the location of the extern keyword.
2591 void setExternLoc(SourceLocation Loc) {
2592 if (!ExplicitInfo)
2593 ExplicitInfo = new (getASTContext()) ExplicitSpecializationInfo;
2594 ExplicitInfo->ExternLoc = Loc;
2595 }
2596
2597 /// \brief Sets the location of the template keyword.
2598 void setTemplateKeywordLoc(SourceLocation Loc) {
2599 if (!ExplicitInfo)
2600 ExplicitInfo = new (getASTContext()) ExplicitSpecializationInfo;
2601 ExplicitInfo->TemplateKeywordLoc = Loc;
2602 }
2603 /// \brief Gets the location of the template keyword, if present.
2604 SourceLocation getTemplateKeywordLoc() const {
2605 return ExplicitInfo ? ExplicitInfo->TemplateKeywordLoc : SourceLocation();
2606 }
2607
2608 void Profile(llvm::FoldingSetNodeID &ID) const {
2609 Profile(ID, TemplateArgs->asArray(), getASTContext());
2610 }
2611
2612 static void Profile(llvm::FoldingSetNodeID &ID,
2613 ArrayRef<TemplateArgument> TemplateArgs,
2614 ASTContext &Context) {
2615 ID.AddInteger(TemplateArgs.size());
2616 for (unsigned Arg = 0; Arg != TemplateArgs.size(); ++Arg)
2617 TemplateArgs[Arg].Profile(ID, Context);
2618 }
2619
2620 static bool classof(const Decl *D) { return classofKind(D->getKind()); }
2621 static bool classofKind(Kind K) {
2622 return K >= firstVarTemplateSpecialization &&
2623 K <= lastVarTemplateSpecialization;
2624 }
2625
2626 friend class ASTDeclReader;
2627 friend class ASTDeclWriter;
2628 };
2629
2630 class VarTemplatePartialSpecializationDecl
2631 : public VarTemplateSpecializationDecl {
2632 void anchor() override;
2633
2634 /// \brief The list of template parameters
2635 TemplateParameterList *TemplateParams;
2636
2637 /// \brief The source info for the template arguments as written.
2638 /// FIXME: redundant with TypeAsWritten?
2639 const ASTTemplateArgumentListInfo *ArgsAsWritten;
2640
2641 /// \brief The variable template partial specialization from which this
2642 /// variable template partial specialization was instantiated.
2643 ///
2644 /// The boolean value will be true to indicate that this variable template
2645 /// partial specialization was specialized at this level.
2646 llvm::PointerIntPair<VarTemplatePartialSpecializationDecl *, 1, bool>
2647 InstantiatedFromMember;
2648
2649 VarTemplatePartialSpecializationDecl(
2650 ASTContext &Context, DeclContext *DC, SourceLocation StartLoc,
2651 SourceLocation IdLoc, TemplateParameterList *Params,
2652 VarTemplateDecl *SpecializedTemplate, QualType T, TypeSourceInfo *TInfo,
2653 StorageClass S, const TemplateArgument *Args, unsigned NumArgs,
2654 const ASTTemplateArgumentListInfo *ArgInfos);
2655
2656 VarTemplatePartialSpecializationDecl(ASTContext &Context)
2657 : VarTemplateSpecializationDecl(VarTemplatePartialSpecialization, Context),
2658 TemplateParams(nullptr), ArgsAsWritten(nullptr),
2659 InstantiatedFromMember(nullptr, false) {}
2660
2661 public:
2662 static VarTemplatePartialSpecializationDecl *
2663 Create(ASTContext &Context, DeclContext *DC, SourceLocation StartLoc,
2664 SourceLocation IdLoc, TemplateParameterList *Params,
2665 VarTemplateDecl *SpecializedTemplate, QualType T,
2666 TypeSourceInfo *TInfo, StorageClass S, const TemplateArgument *Args,
2667 unsigned NumArgs, const TemplateArgumentListInfo &ArgInfos);
2668
2669 static VarTemplatePartialSpecializationDecl *CreateDeserialized(ASTContext &C,
2670 unsigned ID);
2671
2672 VarTemplatePartialSpecializationDecl *getMostRecentDecl() {
2673 return cast<VarTemplatePartialSpecializationDecl>(
2674 static_cast<VarTemplateSpecializationDecl *>(
2675 this)->getMostRecentDecl());
2676 }
2677
2678 /// Get the list of template parameters
2679 TemplateParameterList *getTemplateParameters() const {
2680 return TemplateParams;
2681 }
2682
2683 /// Get the template arguments as written.
2684 const ASTTemplateArgumentListInfo *getTemplateArgsAsWritten() const {
2685 return ArgsAsWritten;
2686 }
2687
2688 /// \brief Retrieve the member variable template partial specialization from
2689 /// which this particular variable template partial specialization was
2690 /// instantiated.
2691 ///
2692 /// \code
2693 /// template<typename T>
2694 /// struct Outer {
2695 /// template<typename U> U Inner;
2696 /// template<typename U> U* Inner<U*> = (U*)(0); // #1
2697 /// };
2698 ///
2699 /// template int* Outer<float>::Inner<int*>;
2700 /// \endcode
2701 ///
2702 /// In this example, the instantiation of \c Outer<float>::Inner<int*> will
2703 /// end up instantiating the partial specialization
2704 /// \c Outer<float>::Inner<U*>, which itself was instantiated from the
2705 /// variable template partial specialization \c Outer<T>::Inner<U*>. Given
2706 /// \c Outer<float>::Inner<U*>, this function would return
2707 /// \c Outer<T>::Inner<U*>.
2708 VarTemplatePartialSpecializationDecl *getInstantiatedFromMember() const {
2709 const VarTemplatePartialSpecializationDecl *First =
2710 cast<VarTemplatePartialSpecializationDecl>(getFirstDecl());
2711 return First->InstantiatedFromMember.getPointer();
2712 }
2713
2714 void
2715 setInstantiatedFromMember(VarTemplatePartialSpecializationDecl *PartialSpec) {
2716 VarTemplatePartialSpecializationDecl *First =
2717 cast<VarTemplatePartialSpecializationDecl>(getFirstDecl());
2718 First->InstantiatedFromMember.setPointer(PartialSpec);
2719 }
2720
2721 /// \brief Determines whether this variable template partial specialization
2722 /// was a specialization of a member partial specialization.
2723 ///
2724 /// In the following example, the member template partial specialization
2725 /// \c X<int>::Inner<T*> is a member specialization.
2726 ///
2727 /// \code
2728 /// template<typename T>
2729 /// struct X {
2730 /// template<typename U> U Inner;
2731 /// template<typename U> U* Inner<U*> = (U*)(0);
2732 /// };
2733 ///
2734 /// template<> template<typename T>
2735 /// U* X<int>::Inner<T*> = (T*)(0) + 1;
2736 /// \endcode
2737 bool isMemberSpecialization() {
2738 VarTemplatePartialSpecializationDecl *First =
2739 cast<VarTemplatePartialSpecializationDecl>(getFirstDecl());
2740 return First->InstantiatedFromMember.getInt();
2741 }
2742
2743 /// \brief Note that this member template is a specialization.
2744 void setMemberSpecialization() {
2745 VarTemplatePartialSpecializationDecl *First =
2746 cast<VarTemplatePartialSpecializationDecl>(getFirstDecl());
2747 assert(First->InstantiatedFromMember.getPointer() &&
2748 "Only member templates can be member template specializations");
2749 return First->InstantiatedFromMember.setInt(true);
2750 }
2751
2752 static bool classof(const Decl *D) { return classofKind(D->getKind()); }
2753 static bool classofKind(Kind K) {
2754 return K == VarTemplatePartialSpecialization;
2755 }
2756
2757 friend class ASTDeclReader;
2758 friend class ASTDeclWriter;
2759 };
2760
2761 /// Declaration of a variable template.
2762 class VarTemplateDecl : public RedeclarableTemplateDecl {
2763 static void DeallocateCommon(void *Ptr);
2764
2765 protected:
2766 /// \brief Data that is common to all of the declarations of a given
2767 /// variable template.
2768 struct Common : CommonBase {
2769 Common() : LazySpecializations() {}
2770
2771 /// \brief The variable template specializations for this variable
2772 /// template, including explicit specializations and instantiations.
2773 llvm::FoldingSetVector<VarTemplateSpecializationDecl> Specializations;
2774
2775 /// \brief The variable template partial specializations for this variable
2776 /// template.
2777 llvm::FoldingSetVector<VarTemplatePartialSpecializationDecl>
2778 PartialSpecializations;
2779
2780 /// \brief If non-null, points to an array of specializations (including
2781 /// partial specializations) known ownly by their external declaration IDs.
2782 ///
2783 /// The first value in the array is the number of of specializations/
2784 /// partial specializations that follow.
2785 uint32_t *LazySpecializations;
2786 };
2787
2788 /// \brief Retrieve the set of specializations of this variable template.
2789 llvm::FoldingSetVector<VarTemplateSpecializationDecl> &
2790 getSpecializations() const;
2791
2792 /// \brief Retrieve the set of partial specializations of this class
2793 /// template.
2794 llvm::FoldingSetVector<VarTemplatePartialSpecializationDecl> &
2795 getPartialSpecializations();
2796
2797 VarTemplateDecl(ASTContext &C, DeclContext *DC, SourceLocation L,
2798 DeclarationName Name, TemplateParameterList *Params,
2799 NamedDecl *Decl)
2800 : RedeclarableTemplateDecl(VarTemplate, C, DC, L, Name, Params, Decl) {}
2801
2802 CommonBase *newCommon(ASTContext &C) const override;
2803
2804 Common *getCommonPtr() const {
2805 return static_cast<Common *>(RedeclarableTemplateDecl::getCommonPtr());
2806 }
2807
2808 public:
2809 /// \brief Load any lazily-loaded specializations from the external source.
2810 void LoadLazySpecializations() const;
2811
2812 /// \brief Get the underlying variable declarations of the template.
2813 VarDecl *getTemplatedDecl() const {
2814 return static_cast<VarDecl *>(TemplatedDecl);
2815 }
2816
2817 /// \brief Returns whether this template declaration defines the primary
2818 /// variable pattern.
2819 bool isThisDeclarationADefinition() const {
2820 return getTemplatedDecl()->isThisDeclarationADefinition();
2821 }
2822
2823 VarTemplateDecl *getDefinition();
2824
2825 /// \brief Create a variable template node.
2826 static VarTemplateDecl *Create(ASTContext &C, DeclContext *DC,
2827 SourceLocation L, DeclarationName Name,
2828 TemplateParameterList *Params,
2829 VarDecl *Decl);
2830
2831 /// \brief Create an empty variable template node.
2832 static VarTemplateDecl *CreateDeserialized(ASTContext &C, unsigned ID);
2833
2834 /// \brief Return the specialization with the provided arguments if it exists,
2835 /// otherwise return the insertion point.
2836 VarTemplateSpecializationDecl *
2837 findSpecialization(ArrayRef<TemplateArgument> Args, void *&InsertPos);
2838
2839 /// \brief Insert the specified specialization knowing that it is not already
2840 /// in. InsertPos must be obtained from findSpecialization.
2841 void AddSpecialization(VarTemplateSpecializationDecl *D, void *InsertPos);
2842
2843 VarTemplateDecl *getCanonicalDecl() override {
2844 return cast<VarTemplateDecl>(RedeclarableTemplateDecl::getCanonicalDecl());
2845 }
2846 const VarTemplateDecl *getCanonicalDecl() const {
2847 return cast<VarTemplateDecl>(RedeclarableTemplateDecl::getCanonicalDecl());
2848 }
2849
2850 /// \brief Retrieve the previous declaration of this variable template, or
2851 /// NULL if no such declaration exists.
2852 VarTemplateDecl *getPreviousDecl() {
2853 return cast_or_null<VarTemplateDecl>(
2854 static_cast<RedeclarableTemplateDecl *>(this)->getPreviousDecl());
2855 }
2856
2857 /// \brief Retrieve the previous declaration of this variable template, or
2858 /// NULL if no such declaration exists.
2859 const VarTemplateDecl *getPreviousDecl() const {
2860 return cast_or_null<VarTemplateDecl>(
2861 static_cast<const RedeclarableTemplateDecl *>(
2862 this)->getPreviousDecl());
2863 }
2864
2865 VarTemplateDecl *getMostRecentDecl() {
2866 return cast<VarTemplateDecl>(
2867 static_cast<RedeclarableTemplateDecl *>(this)->getMostRecentDecl());
2868 }
2869 const VarTemplateDecl *getMostRecentDecl() const {
2870 return const_cast<VarTemplateDecl *>(this)->getMostRecentDecl();
2871 }
2872
2873 VarTemplateDecl *getInstantiatedFromMemberTemplate() const {
2874 return cast_or_null<VarTemplateDecl>(
2875 RedeclarableTemplateDecl::getInstantiatedFromMemberTemplate());
2876 }
2877
2878 /// \brief Return the partial specialization with the provided arguments if it
2879 /// exists, otherwise return the insertion point.
2880 VarTemplatePartialSpecializationDecl *
2881 findPartialSpecialization(ArrayRef<TemplateArgument> Args, void *&InsertPos);
2882
2883 /// \brief Insert the specified partial specialization knowing that it is not
2884 /// already in. InsertPos must be obtained from findPartialSpecialization.
2885 void AddPartialSpecialization(VarTemplatePartialSpecializationDecl *D,
2886 void *InsertPos);
2887
2888 /// \brief Retrieve the partial specializations as an ordered list.
2889 void getPartialSpecializations(
2890 SmallVectorImpl<VarTemplatePartialSpecializationDecl *> &PS);
2891
2892 /// \brief Find a variable template partial specialization which was
2893 /// instantiated
2894 /// from the given member partial specialization.
2895 ///
2896 /// \param D a member variable template partial specialization.
2897 ///
2898 /// \returns the variable template partial specialization which was
2899 /// instantiated
2900 /// from the given member partial specialization, or NULL if no such partial
2901 /// specialization exists.
2902 VarTemplatePartialSpecializationDecl *findPartialSpecInstantiatedFromMember(
2903 VarTemplatePartialSpecializationDecl *D);
2904
2905 typedef SpecIterator<VarTemplateSpecializationDecl> spec_iterator;
2906 typedef llvm::iterator_range<spec_iterator> spec_range;
2907
2908 spec_range specializations() const {
2909 return spec_range(spec_begin(), spec_end());
2910 }
2911
2912 spec_iterator spec_begin() const {
2913 return makeSpecIterator(getSpecializations(), false);
2914 }
2915
2916 spec_iterator spec_end() const {
2917 return makeSpecIterator(getSpecializations(), true);
2918 }
2919
2920 // Implement isa/cast/dyncast support
2921 static bool classof(const Decl *D) { return classofKind(D->getKind()); }
2922 static bool classofKind(Kind K) { return K == VarTemplate; }
2923
2924 friend class ASTDeclReader;
2925 friend class ASTDeclWriter;
2926 };
2927
2928 } /* end of namespace clang */
2929
2930 #endif
2931