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