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