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