1 //===-- DeclTemplate.h - Classes for representing C++ templates -*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This file defines the C++ template declaration subclasses. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #ifndef LLVM_CLANG_AST_DECLTEMPLATE_H 15 #define LLVM_CLANG_AST_DECLTEMPLATE_H 16 17 #include "clang/AST/DeclCXX.h" 18 #include "clang/AST/TemplateBase.h" 19 #include "llvm/ADT/PointerUnion.h" 20 #include <limits> 21 22 namespace clang { 23 24 class TemplateParameterList; 25 class TemplateDecl; 26 class RedeclarableTemplateDecl; 27 class FunctionTemplateDecl; 28 class ClassTemplateDecl; 29 class ClassTemplatePartialSpecializationDecl; 30 class TemplateTypeParmDecl; 31 class NonTypeTemplateParmDecl; 32 class TemplateTemplateParmDecl; 33 class TypeAliasTemplateDecl; 34 35 /// \brief Stores a template parameter of any kind. 36 typedef llvm::PointerUnion3<TemplateTypeParmDecl*, NonTypeTemplateParmDecl*, 37 TemplateTemplateParmDecl*> TemplateParameter; 38 39 /// TemplateParameterList - Stores a list of template parameters for a 40 /// TemplateDecl and its derived classes. 41 class TemplateParameterList { 42 /// The location of the 'template' keyword. 43 SourceLocation TemplateLoc; 44 45 /// The locations of the '<' and '>' angle brackets. 46 SourceLocation LAngleLoc, RAngleLoc; 47 48 /// The number of template parameters in this template 49 /// parameter list. 50 unsigned NumParams; 51 52 protected: 53 TemplateParameterList(SourceLocation TemplateLoc, SourceLocation LAngleLoc, 54 NamedDecl **Params, unsigned NumParams, 55 SourceLocation RAngleLoc); 56 57 public: 58 static TemplateParameterList *Create(const ASTContext &C, 59 SourceLocation TemplateLoc, 60 SourceLocation LAngleLoc, 61 NamedDecl **Params, 62 unsigned NumParams, 63 SourceLocation RAngleLoc); 64 65 /// iterator - Iterates through the template parameters in this list. 66 typedef NamedDecl** iterator; 67 68 /// const_iterator - Iterates through the template parameters in this list. 69 typedef NamedDecl* const* const_iterator; 70 71 iterator begin() { return reinterpret_cast<NamedDecl **>(this + 1); } 72 const_iterator begin() const { 73 return reinterpret_cast<NamedDecl * const *>(this + 1); 74 } 75 iterator end() { return begin() + NumParams; } 76 const_iterator end() const { return begin() + NumParams; } 77 78 unsigned size() const { return NumParams; } 79 80 NamedDecl* getParam(unsigned Idx) { 81 assert(Idx < size() && "Template parameter index out-of-range"); 82 return begin()[Idx]; 83 } 84 85 const NamedDecl* getParam(unsigned Idx) const { 86 assert(Idx < size() && "Template parameter index out-of-range"); 87 return begin()[Idx]; 88 } 89 90 /// \brief Returns the minimum number of arguments needed to form a 91 /// template specialization. This may be fewer than the number of 92 /// template parameters, if some of the parameters have default 93 /// arguments or if there is a parameter pack. 94 unsigned getMinRequiredArguments() const; 95 96 /// \brief Get the depth of this template parameter list in the set of 97 /// template parameter lists. 98 /// 99 /// The first template parameter list in a declaration will have depth 0, 100 /// the second template parameter list will have depth 1, etc. 101 unsigned getDepth() const; 102 103 SourceLocation getTemplateLoc() const { return TemplateLoc; } 104 SourceLocation getLAngleLoc() const { return LAngleLoc; } 105 SourceLocation getRAngleLoc() const { return RAngleLoc; } 106 107 SourceRange getSourceRange() const { 108 return SourceRange(TemplateLoc, RAngleLoc); 109 } 110 }; 111 112 /// FixedSizeTemplateParameterList - Stores a list of template parameters for a 113 /// TemplateDecl and its derived classes. Suitable for creating on the stack. 114 template<size_t N> 115 class FixedSizeTemplateParameterList : public TemplateParameterList { 116 NamedDecl *Params[N]; 117 118 public: 119 FixedSizeTemplateParameterList(SourceLocation TemplateLoc, SourceLocation LAngleLoc, 120 NamedDecl **Params, SourceLocation RAngleLoc) : 121 TemplateParameterList(TemplateLoc, LAngleLoc, Params, N, RAngleLoc) { 122 } 123 }; 124 125 /// \brief A template argument list. 126 class TemplateArgumentList { 127 /// \brief The template argument list. 128 /// 129 /// The integer value will be non-zero to indicate that this 130 /// template argument list does own the pointer. 131 llvm::PointerIntPair<const TemplateArgument *, 1> Arguments; 132 133 /// \brief The number of template arguments in this template 134 /// argument list. 135 unsigned NumArguments; 136 137 TemplateArgumentList(const TemplateArgumentList &Other); // DO NOT IMPL 138 void operator=(const TemplateArgumentList &Other); // DO NOT IMPL 139 140 TemplateArgumentList(const TemplateArgument *Args, unsigned NumArgs, 141 bool Owned) 142 : Arguments(Args, Owned), NumArguments(NumArgs) { } 143 144 public: 145 /// \brief Type used to indicate that the template argument list itself is a 146 /// stack object. It does not own its template arguments. 147 enum OnStackType { OnStack }; 148 149 /// \brief Create a new template argument list that copies the given set of 150 /// template arguments. 151 static TemplateArgumentList *CreateCopy(ASTContext &Context, 152 const TemplateArgument *Args, 153 unsigned NumArgs); 154 155 /// \brief Construct a new, temporary template argument list on the stack. 156 /// 157 /// The template argument list does not own the template arguments 158 /// provided. 159 explicit TemplateArgumentList(OnStackType, 160 const TemplateArgument *Args, unsigned NumArgs) 161 : Arguments(Args, false), NumArguments(NumArgs) { } 162 163 /// \brief Produces a shallow copy of the given template argument list. 164 /// 165 /// This operation assumes that the input argument list outlives it. 166 /// This takes the list as a pointer to avoid looking like a copy 167 /// constructor, since this really really isn't safe to use that 168 /// way. 169 explicit TemplateArgumentList(const TemplateArgumentList *Other) 170 : Arguments(Other->data(), false), NumArguments(Other->size()) { } 171 172 /// \brief Retrieve the template argument at a given index. 173 const TemplateArgument &get(unsigned Idx) const { 174 assert(Idx < NumArguments && "Invalid template argument index"); 175 return data()[Idx]; 176 } 177 178 /// \brief Retrieve the template argument at a given index. 179 const TemplateArgument &operator[](unsigned Idx) const { return get(Idx); } 180 181 /// \brief Retrieve the number of template arguments in this 182 /// template argument list. 183 unsigned size() const { return NumArguments; } 184 185 /// \brief Retrieve a pointer to the template argument list. 186 const TemplateArgument *data() const { 187 return Arguments.getPointer(); 188 } 189 }; 190 191 //===----------------------------------------------------------------------===// 192 // Kinds of Templates 193 //===----------------------------------------------------------------------===// 194 195 /// TemplateDecl - The base class of all kinds of template declarations (e.g., 196 /// class, function, etc.). The TemplateDecl class stores the list of template 197 /// parameters and a reference to the templated scoped declaration: the 198 /// underlying AST node. 199 class TemplateDecl : public NamedDecl { 200 protected: 201 // This is probably never used. 202 TemplateDecl(Kind DK, DeclContext *DC, SourceLocation L, 203 DeclarationName Name) 204 : NamedDecl(DK, DC, L, Name), TemplatedDecl(0), TemplateParams(0) { } 205 206 // Construct a template decl with the given name and parameters. 207 // Used when there is not templated element (tt-params, alias?). 208 TemplateDecl(Kind DK, DeclContext *DC, SourceLocation L, 209 DeclarationName Name, TemplateParameterList *Params) 210 : NamedDecl(DK, DC, L, Name), TemplatedDecl(0), TemplateParams(Params) { } 211 212 // Construct a template decl with name, parameters, and templated element. 213 TemplateDecl(Kind DK, DeclContext *DC, SourceLocation L, 214 DeclarationName Name, TemplateParameterList *Params, 215 NamedDecl *Decl) 216 : NamedDecl(DK, DC, L, Name), TemplatedDecl(Decl), 217 TemplateParams(Params) { } 218 public: 219 /// Get the list of template parameters 220 TemplateParameterList *getTemplateParameters() const { 221 return TemplateParams; 222 } 223 224 /// Get the underlying, templated declaration. 225 NamedDecl *getTemplatedDecl() const { return TemplatedDecl; } 226 227 // Implement isa/cast/dyncast/etc. 228 static bool classof(const Decl *D) { return classofKind(D->getKind()); } 229 static bool classof(const TemplateDecl *D) { return true; } 230 static bool classof(const RedeclarableTemplateDecl *D) { return true; } 231 static bool classof(const FunctionTemplateDecl *D) { return true; } 232 static bool classof(const ClassTemplateDecl *D) { return true; } 233 static bool classof(const TemplateTemplateParmDecl *D) { return true; } 234 static bool classof(const TypeAliasTemplateDecl *D) { return true; } 235 static bool classofKind(Kind K) { 236 return K >= firstTemplate && K <= lastTemplate; 237 } 238 239 SourceRange getSourceRange() const { 240 return SourceRange(TemplateParams->getTemplateLoc(), 241 TemplatedDecl->getSourceRange().getEnd()); 242 } 243 244 protected: 245 NamedDecl *TemplatedDecl; 246 TemplateParameterList* TemplateParams; 247 248 public: 249 /// \brief Initialize the underlying templated declaration and 250 /// template parameters. 251 void init(NamedDecl *templatedDecl, TemplateParameterList* templateParams) { 252 assert(TemplatedDecl == 0 && "TemplatedDecl already set!"); 253 assert(TemplateParams == 0 && "TemplateParams already set!"); 254 TemplatedDecl = templatedDecl; 255 TemplateParams = templateParams; 256 } 257 }; 258 259 /// \brief Provides information about a function template specialization, 260 /// which is a FunctionDecl that has been explicitly specialization or 261 /// instantiated from a function template. 262 class FunctionTemplateSpecializationInfo : public llvm::FoldingSetNode { 263 FunctionTemplateSpecializationInfo(FunctionDecl *FD, 264 FunctionTemplateDecl *Template, 265 TemplateSpecializationKind TSK, 266 const TemplateArgumentList *TemplateArgs, 267 const ASTTemplateArgumentListInfo *TemplateArgsAsWritten, 268 SourceLocation POI) 269 : Function(FD), 270 Template(Template, TSK - 1), 271 TemplateArguments(TemplateArgs), 272 TemplateArgumentsAsWritten(TemplateArgsAsWritten), 273 PointOfInstantiation(POI) { } 274 275 public: 276 static FunctionTemplateSpecializationInfo * 277 Create(ASTContext &C, FunctionDecl *FD, FunctionTemplateDecl *Template, 278 TemplateSpecializationKind TSK, 279 const TemplateArgumentList *TemplateArgs, 280 const TemplateArgumentListInfo *TemplateArgsAsWritten, 281 SourceLocation POI); 282 283 /// \brief The function template specialization that this structure 284 /// describes. 285 FunctionDecl *Function; 286 287 /// \brief The function template from which this function template 288 /// specialization was generated. 289 /// 290 /// The two bits are contain the top 4 values of TemplateSpecializationKind. 291 llvm::PointerIntPair<FunctionTemplateDecl *, 2> Template; 292 293 /// \brief The template arguments used to produce the function template 294 /// specialization from the function template. 295 const TemplateArgumentList *TemplateArguments; 296 297 /// \brief The template arguments as written in the sources, if provided. 298 const ASTTemplateArgumentListInfo *TemplateArgumentsAsWritten; 299 300 /// \brief The point at which this function template specialization was 301 /// first instantiated. 302 SourceLocation PointOfInstantiation; 303 304 /// \brief Retrieve the template from which this function was specialized. 305 FunctionTemplateDecl *getTemplate() const { return Template.getPointer(); } 306 307 /// \brief Determine what kind of template specialization this is. 308 TemplateSpecializationKind getTemplateSpecializationKind() const { 309 return (TemplateSpecializationKind)(Template.getInt() + 1); 310 } 311 312 bool isExplicitSpecialization() const { 313 return getTemplateSpecializationKind() == TSK_ExplicitSpecialization; 314 } 315 316 /// \brief Set the template specialization kind. 317 void setTemplateSpecializationKind(TemplateSpecializationKind TSK) { 318 assert(TSK != TSK_Undeclared && 319 "Cannot encode TSK_Undeclared for a function template specialization"); 320 Template.setInt(TSK - 1); 321 } 322 323 /// \brief Retrieve the first point of instantiation of this function 324 /// template specialization. 325 /// 326 /// The point of instantiation may be an invalid source location if this 327 /// function has yet to be instantiated. 328 SourceLocation getPointOfInstantiation() const { 329 return PointOfInstantiation; 330 } 331 332 /// \brief Set the (first) point of instantiation of this function template 333 /// specialization. 334 void setPointOfInstantiation(SourceLocation POI) { 335 PointOfInstantiation = POI; 336 } 337 338 void Profile(llvm::FoldingSetNodeID &ID) { 339 Profile(ID, TemplateArguments->data(), 340 TemplateArguments->size(), 341 Function->getASTContext()); 342 } 343 344 static void 345 Profile(llvm::FoldingSetNodeID &ID, const TemplateArgument *TemplateArgs, 346 unsigned NumTemplateArgs, ASTContext &Context) { 347 ID.AddInteger(NumTemplateArgs); 348 for (unsigned Arg = 0; Arg != NumTemplateArgs; ++Arg) 349 TemplateArgs[Arg].Profile(ID, Context); 350 } 351 }; 352 353 /// \brief Provides information a specialization of a member of a class 354 /// template, which may be a member function, static data member, or 355 /// member class. 356 class MemberSpecializationInfo { 357 // The member declaration from which this member was instantiated, and the 358 // manner in which the instantiation occurred (in the lower two bits). 359 llvm::PointerIntPair<NamedDecl *, 2> MemberAndTSK; 360 361 // The point at which this member was first instantiated. 362 SourceLocation PointOfInstantiation; 363 364 public: 365 explicit 366 MemberSpecializationInfo(NamedDecl *IF, TemplateSpecializationKind TSK, 367 SourceLocation POI = SourceLocation()) 368 : MemberAndTSK(IF, TSK - 1), PointOfInstantiation(POI) { 369 assert(TSK != TSK_Undeclared && 370 "Cannot encode undeclared template specializations for members"); 371 } 372 373 /// \brief Retrieve the member declaration from which this member was 374 /// instantiated. 375 NamedDecl *getInstantiatedFrom() const { return MemberAndTSK.getPointer(); } 376 377 /// \brief Determine what kind of template specialization this is. 378 TemplateSpecializationKind getTemplateSpecializationKind() const { 379 return (TemplateSpecializationKind)(MemberAndTSK.getInt() + 1); 380 } 381 382 /// \brief Set the template specialization kind. 383 void setTemplateSpecializationKind(TemplateSpecializationKind TSK) { 384 assert(TSK != TSK_Undeclared && 385 "Cannot encode undeclared template specializations for members"); 386 MemberAndTSK.setInt(TSK - 1); 387 } 388 389 /// \brief Retrieve the first point of instantiation of this member. 390 /// If the point of instantiation is an invalid location, then this member 391 /// has not yet been instantiated. 392 SourceLocation getPointOfInstantiation() const { 393 return PointOfInstantiation; 394 } 395 396 /// \brief Set the first point of instantiation. 397 void setPointOfInstantiation(SourceLocation POI) { 398 PointOfInstantiation = POI; 399 } 400 }; 401 402 /// \brief Provides information about a dependent function-template 403 /// specialization declaration. Since explicit function template 404 /// specialization and instantiation declarations can only appear in 405 /// namespace scope, and you can only specialize a member of a 406 /// fully-specialized class, the only way to get one of these is in 407 /// a friend declaration like the following: 408 /// 409 /// template <class T> void foo(T); 410 /// template <class T> class A { 411 /// friend void foo<>(T); 412 /// }; 413 class DependentFunctionTemplateSpecializationInfo { 414 union { 415 // Force sizeof to be a multiple of sizeof(void*) so that the 416 // trailing data is aligned. 417 void *Aligner; 418 419 struct { 420 /// The number of potential template candidates. 421 unsigned NumTemplates; 422 423 /// The number of template arguments. 424 unsigned NumArgs; 425 } d; 426 }; 427 428 /// The locations of the left and right angle brackets. 429 SourceRange AngleLocs; 430 431 FunctionTemplateDecl * const *getTemplates() const { 432 return reinterpret_cast<FunctionTemplateDecl*const*>(this+1); 433 } 434 435 public: 436 DependentFunctionTemplateSpecializationInfo( 437 const UnresolvedSetImpl &Templates, 438 const TemplateArgumentListInfo &TemplateArgs); 439 440 /// \brief Returns the number of function templates that this might 441 /// be a specialization of. 442 unsigned getNumTemplates() const { 443 return d.NumTemplates; 444 } 445 446 /// \brief Returns the i'th template candidate. 447 FunctionTemplateDecl *getTemplate(unsigned I) const { 448 assert(I < getNumTemplates() && "template index out of range"); 449 return getTemplates()[I]; 450 } 451 452 /// \brief Returns the explicit template arguments that were given. 453 const TemplateArgumentLoc *getTemplateArgs() const { 454 return reinterpret_cast<const TemplateArgumentLoc*>( 455 &getTemplates()[getNumTemplates()]); 456 } 457 458 /// \brief Returns the number of explicit template arguments that were given. 459 unsigned getNumTemplateArgs() const { 460 return d.NumArgs; 461 } 462 463 /// \brief Returns the nth template argument. 464 const TemplateArgumentLoc &getTemplateArg(unsigned I) const { 465 assert(I < getNumTemplateArgs() && "template arg index out of range"); 466 return getTemplateArgs()[I]; 467 } 468 469 SourceLocation getLAngleLoc() const { 470 return AngleLocs.getBegin(); 471 } 472 473 SourceLocation getRAngleLoc() const { 474 return AngleLocs.getEnd(); 475 } 476 }; 477 478 /// Declaration of a redeclarable template. 479 class RedeclarableTemplateDecl : public TemplateDecl { 480 481 RedeclarableTemplateDecl *getPreviousDeclarationImpl() { 482 return CommonOrPrev.dyn_cast<RedeclarableTemplateDecl*>(); 483 } 484 485 RedeclarableTemplateDecl *getCanonicalDeclImpl(); 486 487 void setPreviousDeclarationImpl(RedeclarableTemplateDecl *Prev); 488 489 RedeclarableTemplateDecl *getInstantiatedFromMemberTemplateImpl() { 490 return getCommonPtr()->InstantiatedFromMember.getPointer(); 491 } 492 493 void setInstantiatedFromMemberTemplateImpl(RedeclarableTemplateDecl *TD) { 494 assert(!getCommonPtr()->InstantiatedFromMember.getPointer()); 495 getCommonPtr()->InstantiatedFromMember.setPointer(TD); 496 } 497 498 protected: 499 template <typename EntryType> struct SpecEntryTraits { 500 typedef EntryType DeclType; 501 502 static DeclType *getMostRecentDeclaration(EntryType *D) { 503 return D->getMostRecentDeclaration(); 504 } 505 }; 506 507 template <typename EntryType, 508 typename _SETraits = SpecEntryTraits<EntryType>, 509 typename _DeclType = typename _SETraits::DeclType> 510 class SpecIterator : public std::iterator<std::forward_iterator_tag, 511 _DeclType*, ptrdiff_t, 512 _DeclType*, _DeclType*> { 513 typedef _SETraits SETraits; 514 typedef _DeclType DeclType; 515 516 typedef typename llvm::FoldingSet<EntryType>::iterator SetIteratorType; 517 518 SetIteratorType SetIter; 519 520 public: 521 SpecIterator() : SetIter() {} 522 SpecIterator(SetIteratorType SetIter) : SetIter(SetIter) {} 523 524 DeclType *operator*() const { 525 return SETraits::getMostRecentDeclaration(&*SetIter); 526 } 527 DeclType *operator->() const { return **this; } 528 529 SpecIterator &operator++() { ++SetIter; return *this; } 530 SpecIterator operator++(int) { 531 SpecIterator tmp(*this); 532 ++(*this); 533 return tmp; 534 } 535 536 bool operator==(SpecIterator Other) const { 537 return SetIter == Other.SetIter; 538 } 539 bool operator!=(SpecIterator Other) const { 540 return SetIter != Other.SetIter; 541 } 542 }; 543 544 template <typename EntryType> 545 SpecIterator<EntryType> makeSpecIterator(llvm::FoldingSet<EntryType> &Specs, 546 bool isEnd) { 547 return SpecIterator<EntryType>(isEnd ? Specs.end() : Specs.begin()); 548 } 549 550 template <class EntryType> typename SpecEntryTraits<EntryType>::DeclType* 551 findSpecializationImpl(llvm::FoldingSet<EntryType> &Specs, 552 const TemplateArgument *Args, unsigned NumArgs, 553 void *&InsertPos); 554 555 struct CommonBase { 556 CommonBase() : InstantiatedFromMember(0, false) { } 557 558 /// \brief The template from which this was most 559 /// directly instantiated (or null). 560 /// 561 /// The boolean value indicates whether this template 562 /// was explicitly specialized. 563 llvm::PointerIntPair<RedeclarableTemplateDecl*, 1, bool> 564 InstantiatedFromMember; 565 566 /// \brief The latest declaration of this template. 567 RedeclarableTemplateDecl *Latest; 568 }; 569 570 /// \brief A pointer to the previous declaration (if this is a redeclaration) 571 /// or to the data that is common to all declarations of this template. 572 llvm::PointerUnion<CommonBase*, RedeclarableTemplateDecl*> CommonOrPrev; 573 574 /// \brief Retrieves the "common" pointer shared by all (re-)declarations of 575 /// the same template. Calling this routine may implicitly allocate memory 576 /// for the common pointer. 577 CommonBase *getCommonPtr(); 578 579 virtual CommonBase *newCommon(ASTContext &C) = 0; 580 581 // Construct a template decl with name, parameters, and templated element. 582 RedeclarableTemplateDecl(Kind DK, DeclContext *DC, SourceLocation L, 583 DeclarationName Name, TemplateParameterList *Params, 584 NamedDecl *Decl) 585 : TemplateDecl(DK, DC, L, Name, Params, Decl), 586 CommonOrPrev((CommonBase*)0) { } 587 588 public: 589 template <class decl_type> friend class RedeclarableTemplate; 590 591 RedeclarableTemplateDecl *getCanonicalDecl() { 592 return getCanonicalDeclImpl(); 593 } 594 595 /// \brief Retrieve the previous declaration of this template, or 596 /// NULL if no such declaration exists. 597 RedeclarableTemplateDecl *getPreviousDeclaration() { 598 return getPreviousDeclarationImpl(); 599 } 600 601 /// \brief Retrieve the previous declaration of this template, or 602 /// NULL if no such declaration exists. 603 const RedeclarableTemplateDecl *getPreviousDeclaration() const { 604 return 605 const_cast<RedeclarableTemplateDecl*>(this)->getPreviousDeclaration(); 606 } 607 608 /// \brief Retrieve the first declaration of this template, or itself 609 /// if this the first one. 610 RedeclarableTemplateDecl *getFirstDeclaration() { 611 return getCanonicalDecl(); 612 } 613 614 /// \brief Retrieve the first declaration of this template, or itself 615 /// if this the first one. 616 const RedeclarableTemplateDecl *getFirstDeclaration() const { 617 return 618 const_cast<RedeclarableTemplateDecl*>(this)->getFirstDeclaration(); 619 } 620 621 /// \brief Retrieve the most recent declaration of this template, or itself 622 /// if this the most recent one. 623 RedeclarableTemplateDecl *getMostRecentDeclaration() { 624 return getCommonPtr()->Latest; 625 } 626 627 /// \brief Retrieve the most recent declaration of this template, or itself 628 /// if this the most recent one. 629 const RedeclarableTemplateDecl *getMostRecentDeclaration() const { 630 return 631 const_cast<RedeclarableTemplateDecl*>(this)->getMostRecentDeclaration(); 632 } 633 634 /// \brief Determines whether this template was a specialization of a 635 /// member template. 636 /// 637 /// In the following example, the function template \c X<int>::f and the 638 /// member template \c X<int>::Inner are member specializations. 639 /// 640 /// \code 641 /// template<typename T> 642 /// struct X { 643 /// template<typename U> void f(T, U); 644 /// template<typename U> struct Inner; 645 /// }; 646 /// 647 /// template<> template<typename T> 648 /// void X<int>::f(int, T); 649 /// template<> template<typename T> 650 /// struct X<int>::Inner { /* ... */ }; 651 /// \endcode 652 bool isMemberSpecialization() { 653 return getCommonPtr()->InstantiatedFromMember.getInt(); 654 } 655 656 /// \brief Note that this member template is a specialization. 657 void setMemberSpecialization() { 658 assert(getCommonPtr()->InstantiatedFromMember.getPointer() && 659 "Only member templates can be member template specializations"); 660 getCommonPtr()->InstantiatedFromMember.setInt(true); 661 } 662 663 /// \brief Retrieve the previous declaration of this template, or 664 /// NULL if no such declaration exists. 665 RedeclarableTemplateDecl *getInstantiatedFromMemberTemplate() { 666 return getInstantiatedFromMemberTemplateImpl(); 667 } 668 669 virtual RedeclarableTemplateDecl *getNextRedeclaration(); 670 671 // Implement isa/cast/dyncast/etc. 672 static bool classof(const Decl *D) { return classofKind(D->getKind()); } 673 static bool classof(const RedeclarableTemplateDecl *D) { return true; } 674 static bool classof(const FunctionTemplateDecl *D) { return true; } 675 static bool classof(const ClassTemplateDecl *D) { return true; } 676 static bool classof(const TypeAliasTemplateDecl *D) { return true; } 677 static bool classofKind(Kind K) { 678 return K >= firstRedeclarableTemplate && K <= lastRedeclarableTemplate; 679 } 680 681 friend class ASTDeclReader; 682 friend class ASTDeclWriter; 683 }; 684 685 template <class decl_type> 686 class RedeclarableTemplate { 687 RedeclarableTemplateDecl *thisDecl() { 688 return static_cast<decl_type*>(this); 689 } 690 691 public: 692 /// \brief Retrieve the previous declaration of this function template, or 693 /// NULL if no such declaration exists. 694 decl_type *getPreviousDeclaration() { 695 return static_cast<decl_type*>(thisDecl()->getPreviousDeclarationImpl()); 696 } 697 698 /// \brief Retrieve the previous declaration of this function template, or 699 /// NULL if no such declaration exists. 700 const decl_type *getPreviousDeclaration() const { 701 return const_cast<RedeclarableTemplate*>(this)->getPreviousDeclaration(); 702 } 703 704 /// \brief Set the previous declaration of this function template. 705 void setPreviousDeclaration(decl_type *Prev) { 706 thisDecl()->setPreviousDeclarationImpl(Prev); 707 } 708 709 decl_type *getCanonicalDecl() { 710 return static_cast<decl_type*>(thisDecl()->getCanonicalDeclImpl()); 711 } 712 713 const decl_type *getCanonicalDecl() const { 714 return const_cast<RedeclarableTemplate*>(this)->getCanonicalDecl(); 715 } 716 717 /// \brief Retrieve the member template that this template was instantiated 718 /// from. 719 /// 720 /// This routine will return non-NULL for member templates of 721 /// class templates. For example, given: 722 /// 723 /// \code 724 /// template <typename T> 725 /// struct X { 726 /// template <typename U> void f(); 727 /// template <typename U> struct A {}; 728 /// }; 729 /// \endcode 730 /// 731 /// X<int>::f<float> is a CXXMethodDecl (whose parent is X<int>, a 732 /// ClassTemplateSpecializationDecl) for which getPrimaryTemplate() will 733 /// return X<int>::f, a FunctionTemplateDecl (whose parent is again 734 /// X<int>) for which getInstantiatedFromMemberTemplate() will return 735 /// X<T>::f, a FunctionTemplateDecl (whose parent is X<T>, a 736 /// ClassTemplateDecl). 737 /// 738 /// X<int>::A<float> is a ClassTemplateSpecializationDecl (whose parent 739 /// is X<int>, also a CTSD) for which getSpecializedTemplate() will 740 /// return X<int>::A<U>, a ClassTemplateDecl (whose parent is again 741 /// X<int>) for which getInstantiatedFromMemberTemplate() will return 742 /// X<T>::A<U>, a ClassTemplateDecl (whose parent is X<T>, also a CTD). 743 /// 744 /// \returns NULL if this is not an instantiation of a member template. 745 decl_type *getInstantiatedFromMemberTemplate() { 746 return static_cast<decl_type*>( 747 thisDecl()->getInstantiatedFromMemberTemplateImpl()); 748 } 749 750 void setInstantiatedFromMemberTemplate(decl_type *TD) { 751 thisDecl()->setInstantiatedFromMemberTemplateImpl(TD); 752 } 753 }; 754 755 template <> struct RedeclarableTemplateDecl:: 756 SpecEntryTraits<FunctionTemplateSpecializationInfo> { 757 typedef FunctionDecl DeclType; 758 759 static DeclType * 760 getMostRecentDeclaration(FunctionTemplateSpecializationInfo *I) { 761 return I->Function->getMostRecentDeclaration(); 762 } 763 }; 764 765 /// Declaration of a template function. 766 class FunctionTemplateDecl : public RedeclarableTemplateDecl, 767 public RedeclarableTemplate<FunctionTemplateDecl> { 768 static void DeallocateCommon(void *Ptr); 769 770 protected: 771 typedef RedeclarableTemplate<FunctionTemplateDecl> redeclarable_base; 772 773 /// \brief Data that is common to all of the declarations of a given 774 /// function template. 775 struct Common : CommonBase { 776 Common() : InjectedArgs(0) { } 777 778 /// \brief The function template specializations for this function 779 /// template, including explicit specializations and instantiations. 780 llvm::FoldingSet<FunctionTemplateSpecializationInfo> Specializations; 781 782 /// \brief The set of "injected" template arguments used within this 783 /// function template. 784 /// 785 /// This pointer refers to the template arguments (there are as 786 /// many template arguments as template parameaters) for the function 787 /// template, and is allocated lazily, since most function templates do not 788 /// require the use of this information. 789 TemplateArgument *InjectedArgs; 790 }; 791 792 FunctionTemplateDecl(DeclContext *DC, SourceLocation L, DeclarationName Name, 793 TemplateParameterList *Params, NamedDecl *Decl) 794 : RedeclarableTemplateDecl(FunctionTemplate, DC, L, Name, Params, Decl) { } 795 796 CommonBase *newCommon(ASTContext &C); 797 798 Common *getCommonPtr() { 799 return static_cast<Common *>(RedeclarableTemplateDecl::getCommonPtr()); 800 } 801 802 friend class FunctionDecl; 803 804 /// \brief Retrieve the set of function template specializations of this 805 /// function template. 806 llvm::FoldingSet<FunctionTemplateSpecializationInfo> &getSpecializations() { 807 return getCommonPtr()->Specializations; 808 } 809 810 /// \brief Add a specialization of this function template. 811 /// 812 /// \param InsertPos Insert position in the FoldingSet, must have been 813 /// retrieved by an earlier call to findSpecialization(). 814 void addSpecialization(FunctionTemplateSpecializationInfo* Info, 815 void *InsertPos); 816 817 public: 818 /// Get the underlying function declaration of the template. 819 FunctionDecl *getTemplatedDecl() const { 820 return static_cast<FunctionDecl*>(TemplatedDecl); 821 } 822 823 /// Returns whether this template declaration defines the primary 824 /// pattern. 825 bool isThisDeclarationADefinition() const { 826 return getTemplatedDecl()->isThisDeclarationADefinition(); 827 } 828 829 /// \brief Return the specialization with the provided arguments if it exists, 830 /// otherwise return the insertion point. 831 FunctionDecl *findSpecialization(const TemplateArgument *Args, 832 unsigned NumArgs, void *&InsertPos); 833 834 FunctionTemplateDecl *getCanonicalDecl() { 835 return redeclarable_base::getCanonicalDecl(); 836 } 837 const FunctionTemplateDecl *getCanonicalDecl() const { 838 return redeclarable_base::getCanonicalDecl(); 839 } 840 841 /// \brief Retrieve the previous declaration of this function template, or 842 /// NULL if no such declaration exists. 843 FunctionTemplateDecl *getPreviousDeclaration() { 844 return redeclarable_base::getPreviousDeclaration(); 845 } 846 847 /// \brief Retrieve the previous declaration of this function template, or 848 /// NULL if no such declaration exists. 849 const FunctionTemplateDecl *getPreviousDeclaration() const { 850 return redeclarable_base::getPreviousDeclaration(); 851 } 852 853 FunctionTemplateDecl *getInstantiatedFromMemberTemplate() { 854 return redeclarable_base::getInstantiatedFromMemberTemplate(); 855 } 856 857 typedef SpecIterator<FunctionTemplateSpecializationInfo> spec_iterator; 858 859 spec_iterator spec_begin() { 860 return makeSpecIterator(getSpecializations(), false); 861 } 862 863 spec_iterator spec_end() { 864 return makeSpecIterator(getSpecializations(), true); 865 } 866 867 /// \brief Retrieve the "injected" template arguments that correspond to the 868 /// template parameters of this function template. 869 /// 870 /// Although the C++ standard has no notion of the "injected" template 871 /// arguments for a function template, the notion is convenient when 872 /// we need to perform substitutions inside the definition of a function 873 /// template. 874 std::pair<const TemplateArgument *, unsigned> getInjectedTemplateArgs(); 875 876 /// \brief Create a function template node. 877 static FunctionTemplateDecl *Create(ASTContext &C, DeclContext *DC, 878 SourceLocation L, 879 DeclarationName Name, 880 TemplateParameterList *Params, 881 NamedDecl *Decl); 882 883 /// \brief Create an empty function template node. 884 static FunctionTemplateDecl *Create(ASTContext &C, EmptyShell); 885 886 // Implement isa/cast/dyncast support 887 static bool classof(const Decl *D) { return classofKind(D->getKind()); } 888 static bool classof(const FunctionTemplateDecl *D) { return true; } 889 static bool classofKind(Kind K) { return K == FunctionTemplate; } 890 891 friend class ASTDeclReader; 892 friend class ASTDeclWriter; 893 }; 894 895 //===----------------------------------------------------------------------===// 896 // Kinds of Template Parameters 897 //===----------------------------------------------------------------------===// 898 899 /// The TemplateParmPosition class defines the position of a template parameter 900 /// within a template parameter list. Because template parameter can be listed 901 /// sequentially for out-of-line template members, each template parameter is 902 /// given a Depth - the nesting of template parameter scopes - and a Position - 903 /// the occurrence within the parameter list. 904 /// This class is inheritedly privately by different kinds of template 905 /// parameters and is not part of the Decl hierarchy. Just a facility. 906 class TemplateParmPosition { 907 protected: 908 // FIXME: This should probably never be called, but it's here as 909 TemplateParmPosition() 910 : Depth(0), Position(0) 911 { /* llvm_unreachable("Cannot create positionless template parameter"); */ } 912 913 TemplateParmPosition(unsigned D, unsigned P) 914 : Depth(D), Position(P) 915 { } 916 917 // FIXME: These probably don't need to be ints. int:5 for depth, int:8 for 918 // position? Maybe? 919 unsigned Depth; 920 unsigned Position; 921 922 public: 923 /// Get the nesting depth of the template parameter. 924 unsigned getDepth() const { return Depth; } 925 void setDepth(unsigned D) { Depth = D; } 926 927 /// Get the position of the template parameter within its parameter list. 928 unsigned getPosition() const { return Position; } 929 void setPosition(unsigned P) { Position = P; } 930 931 /// Get the index of the template parameter within its parameter list. 932 unsigned getIndex() const { return Position; } 933 }; 934 935 /// TemplateTypeParmDecl - Declaration of a template type parameter, 936 /// e.g., "T" in 937 /// @code 938 /// template<typename T> class vector; 939 /// @endcode 940 class TemplateTypeParmDecl : public TypeDecl { 941 /// \brief Whether this template type parameter was declaration with 942 /// the 'typename' keyword. If false, it was declared with the 943 /// 'class' keyword. 944 bool Typename : 1; 945 946 /// \brief Whether this template type parameter inherited its 947 /// default argument. 948 bool InheritedDefault : 1; 949 950 /// \brief The default template argument, if any. 951 TypeSourceInfo *DefaultArgument; 952 953 TemplateTypeParmDecl(DeclContext *DC, SourceLocation KeyLoc, 954 SourceLocation IdLoc, IdentifierInfo *Id, 955 bool Typename) 956 : TypeDecl(TemplateTypeParm, DC, IdLoc, Id, KeyLoc), Typename(Typename), 957 InheritedDefault(false), DefaultArgument() { } 958 959 /// Sema creates these on the stack during auto type deduction. 960 friend class Sema; 961 962 public: 963 static TemplateTypeParmDecl *Create(const ASTContext &C, DeclContext *DC, 964 SourceLocation KeyLoc, 965 SourceLocation NameLoc, 966 unsigned D, unsigned P, 967 IdentifierInfo *Id, bool Typename, 968 bool ParameterPack); 969 static TemplateTypeParmDecl *Create(const ASTContext &C, EmptyShell Empty); 970 971 /// \brief Whether this template type parameter was declared with 972 /// the 'typename' keyword. If not, it was declared with the 'class' 973 /// keyword. 974 bool wasDeclaredWithTypename() const { return Typename; } 975 976 /// \brief Determine whether this template parameter has a default 977 /// argument. 978 bool hasDefaultArgument() const { return DefaultArgument != 0; } 979 980 /// \brief Retrieve the default argument, if any. 981 QualType getDefaultArgument() const { return DefaultArgument->getType(); } 982 983 /// \brief Retrieves the default argument's source information, if any. 984 TypeSourceInfo *getDefaultArgumentInfo() const { return DefaultArgument; } 985 986 /// \brief Retrieves the location of the default argument declaration. 987 SourceLocation getDefaultArgumentLoc() const; 988 989 /// \brief Determines whether the default argument was inherited 990 /// from a previous declaration of this template. 991 bool defaultArgumentWasInherited() const { return InheritedDefault; } 992 993 /// \brief Set the default argument for this template parameter, and 994 /// whether that default argument was inherited from another 995 /// declaration. 996 void setDefaultArgument(TypeSourceInfo *DefArg, bool Inherited) { 997 DefaultArgument = DefArg; 998 InheritedDefault = Inherited; 999 } 1000 1001 /// \brief Removes the default argument of this template parameter. 1002 void removeDefaultArgument() { 1003 DefaultArgument = 0; 1004 InheritedDefault = false; 1005 } 1006 1007 /// \brief Set whether this template type parameter was declared with 1008 /// the 'typename' or 'class' keyword. 1009 void setDeclaredWithTypename(bool withTypename) { Typename = withTypename; } 1010 1011 /// \brief Retrieve the depth of the template parameter. 1012 unsigned getDepth() const; 1013 1014 /// \brief Retrieve the index of the template parameter. 1015 unsigned getIndex() const; 1016 1017 /// \brief Returns whether this is a parameter pack. 1018 bool isParameterPack() const; 1019 1020 SourceRange getSourceRange() const; 1021 1022 // Implement isa/cast/dyncast/etc. 1023 static bool classof(const Decl *D) { return classofKind(D->getKind()); } 1024 static bool classof(const TemplateTypeParmDecl *D) { return true; } 1025 static bool classofKind(Kind K) { return K == TemplateTypeParm; } 1026 }; 1027 1028 /// NonTypeTemplateParmDecl - Declares a non-type template parameter, 1029 /// e.g., "Size" in 1030 /// @code 1031 /// template<int Size> class array { }; 1032 /// @endcode 1033 class NonTypeTemplateParmDecl 1034 : public DeclaratorDecl, protected TemplateParmPosition { 1035 /// \brief The default template argument, if any, and whether or not 1036 /// it was inherited. 1037 llvm::PointerIntPair<Expr*, 1, bool> DefaultArgumentAndInherited; 1038 1039 // FIXME: Collapse this into TemplateParamPosition; or, just move depth/index 1040 // down here to save memory. 1041 1042 /// \brief Whether this non-type template parameter is a parameter pack. 1043 bool ParameterPack; 1044 1045 /// \brief Whether this non-type template parameter is an "expanded" 1046 /// parameter pack, meaning that its type is a pack expansion and we 1047 /// already know the set of types that expansion expands to. 1048 bool ExpandedParameterPack; 1049 1050 /// \brief The number of types in an expanded parameter pack. 1051 unsigned NumExpandedTypes; 1052 1053 NonTypeTemplateParmDecl(DeclContext *DC, SourceLocation StartLoc, 1054 SourceLocation IdLoc, unsigned D, unsigned P, 1055 IdentifierInfo *Id, QualType T, 1056 bool ParameterPack, TypeSourceInfo *TInfo) 1057 : DeclaratorDecl(NonTypeTemplateParm, DC, IdLoc, Id, T, TInfo, StartLoc), 1058 TemplateParmPosition(D, P), DefaultArgumentAndInherited(0, false), 1059 ParameterPack(ParameterPack), ExpandedParameterPack(false), 1060 NumExpandedTypes(0) 1061 { } 1062 1063 NonTypeTemplateParmDecl(DeclContext *DC, SourceLocation StartLoc, 1064 SourceLocation IdLoc, unsigned D, unsigned P, 1065 IdentifierInfo *Id, QualType T, 1066 TypeSourceInfo *TInfo, 1067 const QualType *ExpandedTypes, 1068 unsigned NumExpandedTypes, 1069 TypeSourceInfo **ExpandedTInfos); 1070 1071 friend class ASTDeclReader; 1072 1073 public: 1074 static NonTypeTemplateParmDecl * 1075 Create(const ASTContext &C, DeclContext *DC, SourceLocation StartLoc, 1076 SourceLocation IdLoc, unsigned D, unsigned P, IdentifierInfo *Id, 1077 QualType T, bool ParameterPack, TypeSourceInfo *TInfo); 1078 1079 static NonTypeTemplateParmDecl * 1080 Create(const ASTContext &C, DeclContext *DC, SourceLocation StartLoc, 1081 SourceLocation IdLoc, unsigned D, unsigned P, IdentifierInfo *Id, 1082 QualType T, TypeSourceInfo *TInfo, 1083 const QualType *ExpandedTypes, unsigned NumExpandedTypes, 1084 TypeSourceInfo **ExpandedTInfos); 1085 1086 using TemplateParmPosition::getDepth; 1087 using TemplateParmPosition::setDepth; 1088 using TemplateParmPosition::getPosition; 1089 using TemplateParmPosition::setPosition; 1090 using TemplateParmPosition::getIndex; 1091 1092 SourceRange getSourceRange() const; 1093 1094 /// \brief Determine whether this template parameter has a default 1095 /// argument. 1096 bool hasDefaultArgument() const { 1097 return DefaultArgumentAndInherited.getPointer() != 0; 1098 } 1099 1100 /// \brief Retrieve the default argument, if any. 1101 Expr *getDefaultArgument() const { 1102 return DefaultArgumentAndInherited.getPointer(); 1103 } 1104 1105 /// \brief Retrieve the location of the default argument, if any. 1106 SourceLocation getDefaultArgumentLoc() const; 1107 1108 /// \brief Determines whether the default argument was inherited 1109 /// from a previous declaration of this template. 1110 bool defaultArgumentWasInherited() const { 1111 return DefaultArgumentAndInherited.getInt(); 1112 } 1113 1114 /// \brief Set the default argument for this template parameter, and 1115 /// whether that default argument was inherited from another 1116 /// declaration. 1117 void setDefaultArgument(Expr *DefArg, bool Inherited) { 1118 DefaultArgumentAndInherited.setPointer(DefArg); 1119 DefaultArgumentAndInherited.setInt(Inherited); 1120 } 1121 1122 /// \brief Removes the default argument of this template parameter. 1123 void removeDefaultArgument() { 1124 DefaultArgumentAndInherited.setPointer(0); 1125 DefaultArgumentAndInherited.setInt(false); 1126 } 1127 1128 /// \brief Whether this parameter is a non-type template parameter pack. 1129 /// 1130 /// If the parameter is a parameter pack, the type may be a 1131 /// \c PackExpansionType. In the following example, the \c Dims parameter 1132 /// is a parameter pack (whose type is 'unsigned'). 1133 /// 1134 /// \code 1135 /// template<typename T, unsigned ...Dims> struct multi_array; 1136 /// \endcode 1137 bool isParameterPack() const { return ParameterPack; } 1138 1139 /// \brief Whether this parameter is a non-type template parameter pack 1140 /// that has different types at different positions. 1141 /// 1142 /// A parameter pack is an expanded parameter pack when the original 1143 /// parameter pack's type was itself a pack expansion, and that expansion 1144 /// has already been expanded. For example, given: 1145 /// 1146 /// \code 1147 /// template<typename ...Types> 1148 /// struct X { 1149 /// template<Types ...Values> 1150 /// struct Y { /* ... */ }; 1151 /// }; 1152 /// \endcode 1153 /// 1154 /// The parameter pack \c Values has a \c PackExpansionType as its type, 1155 /// which expands \c Types. When \c Types is supplied with template arguments 1156 /// by instantiating \c X, the instantiation of \c Values becomes an 1157 /// expanded parameter pack. For example, instantiating 1158 /// \c X<int, unsigned int> results in \c Values being an expanded parameter 1159 /// pack with expansion types \c int and \c unsigned int. 1160 /// 1161 /// The \c getExpansionType() and \c getExpansionTypeSourceInfo() functions 1162 /// return the expansion types. 1163 bool isExpandedParameterPack() const { return ExpandedParameterPack; } 1164 1165 /// \brief Retrieves the number of expansion types in an expanded parameter pack. 1166 unsigned getNumExpansionTypes() const { 1167 assert(ExpandedParameterPack && "Not an expansion parameter pack"); 1168 return NumExpandedTypes; 1169 } 1170 1171 /// \brief Retrieve a particular expansion type within an expanded parameter 1172 /// pack. 1173 QualType getExpansionType(unsigned I) const { 1174 assert(I < NumExpandedTypes && "Out-of-range expansion type index"); 1175 void * const *TypesAndInfos = reinterpret_cast<void * const*>(this + 1); 1176 return QualType::getFromOpaquePtr(TypesAndInfos[2*I]); 1177 } 1178 1179 /// \brief Retrieve a particular expansion type source info within an 1180 /// expanded parameter pack. 1181 TypeSourceInfo *getExpansionTypeSourceInfo(unsigned I) const { 1182 assert(I < NumExpandedTypes && "Out-of-range expansion type index"); 1183 void * const *TypesAndInfos = reinterpret_cast<void * const*>(this + 1); 1184 return static_cast<TypeSourceInfo *>(TypesAndInfos[2*I+1]); 1185 } 1186 1187 // Implement isa/cast/dyncast/etc. 1188 static bool classof(const Decl *D) { return classofKind(D->getKind()); } 1189 static bool classof(const NonTypeTemplateParmDecl *D) { return true; } 1190 static bool classofKind(Kind K) { return K == NonTypeTemplateParm; } 1191 }; 1192 1193 /// TemplateTemplateParmDecl - Declares a template template parameter, 1194 /// e.g., "T" in 1195 /// @code 1196 /// template <template <typename> class T> class container { }; 1197 /// @endcode 1198 /// A template template parameter is a TemplateDecl because it defines the 1199 /// name of a template and the template parameters allowable for substitution. 1200 class TemplateTemplateParmDecl 1201 : public TemplateDecl, protected TemplateParmPosition { 1202 1203 /// DefaultArgument - The default template argument, if any. 1204 TemplateArgumentLoc DefaultArgument; 1205 /// Whether or not the default argument was inherited. 1206 bool DefaultArgumentWasInherited; 1207 1208 /// \brief Whether this parameter is a parameter pack. 1209 bool ParameterPack; 1210 1211 TemplateTemplateParmDecl(DeclContext *DC, SourceLocation L, 1212 unsigned D, unsigned P, bool ParameterPack, 1213 IdentifierInfo *Id, TemplateParameterList *Params) 1214 : TemplateDecl(TemplateTemplateParm, DC, L, Id, Params), 1215 TemplateParmPosition(D, P), DefaultArgument(), 1216 DefaultArgumentWasInherited(false), ParameterPack(ParameterPack) 1217 { } 1218 1219 public: 1220 static TemplateTemplateParmDecl *Create(const ASTContext &C, DeclContext *DC, 1221 SourceLocation L, unsigned D, 1222 unsigned P, bool ParameterPack, 1223 IdentifierInfo *Id, 1224 TemplateParameterList *Params); 1225 1226 using TemplateParmPosition::getDepth; 1227 using TemplateParmPosition::getPosition; 1228 using TemplateParmPosition::getIndex; 1229 1230 /// \brief Whether this template template parameter is a template 1231 /// parameter pack. 1232 /// 1233 /// \code 1234 /// template<template <class T> ...MetaFunctions> struct Apply; 1235 /// \endcode 1236 bool isParameterPack() const { return ParameterPack; } 1237 1238 /// \brief Determine whether this template parameter has a default 1239 /// argument. 1240 bool hasDefaultArgument() const { 1241 return !DefaultArgument.getArgument().isNull(); 1242 } 1243 1244 /// \brief Retrieve the default argument, if any. 1245 const TemplateArgumentLoc &getDefaultArgument() const { 1246 return DefaultArgument; 1247 } 1248 1249 /// \brief Retrieve the location of the default argument, if any. 1250 SourceLocation getDefaultArgumentLoc() const; 1251 1252 /// \brief Determines whether the default argument was inherited 1253 /// from a previous declaration of this template. 1254 bool defaultArgumentWasInherited() const { 1255 return DefaultArgumentWasInherited; 1256 } 1257 1258 /// \brief Set the default argument for this template parameter, and 1259 /// whether that default argument was inherited from another 1260 /// declaration. 1261 void setDefaultArgument(const TemplateArgumentLoc &DefArg, bool Inherited) { 1262 DefaultArgument = DefArg; 1263 DefaultArgumentWasInherited = Inherited; 1264 } 1265 1266 /// \brief Removes the default argument of this template parameter. 1267 void removeDefaultArgument() { 1268 DefaultArgument = TemplateArgumentLoc(); 1269 DefaultArgumentWasInherited = false; 1270 } 1271 1272 SourceRange getSourceRange() const { 1273 SourceLocation End = getLocation(); 1274 if (hasDefaultArgument() && !defaultArgumentWasInherited()) 1275 End = getDefaultArgument().getSourceRange().getEnd(); 1276 return SourceRange(getTemplateParameters()->getTemplateLoc(), End); 1277 } 1278 1279 // Implement isa/cast/dyncast/etc. 1280 static bool classof(const Decl *D) { return classofKind(D->getKind()); } 1281 static bool classof(const TemplateTemplateParmDecl *D) { return true; } 1282 static bool classofKind(Kind K) { return K == TemplateTemplateParm; } 1283 1284 friend class ASTDeclReader; 1285 friend class ASTDeclWriter; 1286 }; 1287 1288 /// \brief Represents a class template specialization, which refers to 1289 /// a class template with a given set of template arguments. 1290 /// 1291 /// Class template specializations represent both explicit 1292 /// specialization of class templates, as in the example below, and 1293 /// implicit instantiations of class templates. 1294 /// 1295 /// \code 1296 /// template<typename T> class array; 1297 /// 1298 /// template<> 1299 /// class array<bool> { }; // class template specialization array<bool> 1300 /// \endcode 1301 class ClassTemplateSpecializationDecl 1302 : public CXXRecordDecl, public llvm::FoldingSetNode { 1303 1304 /// \brief Structure that stores information about a class template 1305 /// specialization that was instantiated from a class template partial 1306 /// specialization. 1307 struct SpecializedPartialSpecialization { 1308 /// \brief The class template partial specialization from which this 1309 /// class template specialization was instantiated. 1310 ClassTemplatePartialSpecializationDecl *PartialSpecialization; 1311 1312 /// \brief The template argument list deduced for the class template 1313 /// partial specialization itself. 1314 TemplateArgumentList *TemplateArgs; 1315 }; 1316 1317 /// \brief The template that this specialization specializes 1318 llvm::PointerUnion<ClassTemplateDecl *, SpecializedPartialSpecialization *> 1319 SpecializedTemplate; 1320 1321 /// \brief Further info for explicit template specialization/instantiation. 1322 struct ExplicitSpecializationInfo { 1323 /// \brief The type-as-written. 1324 TypeSourceInfo *TypeAsWritten; 1325 /// \brief The location of the extern keyword. 1326 SourceLocation ExternLoc; 1327 /// \brief The location of the template keyword. 1328 SourceLocation TemplateKeywordLoc; 1329 1330 ExplicitSpecializationInfo() 1331 : TypeAsWritten(0), ExternLoc(), TemplateKeywordLoc() {} 1332 }; 1333 1334 /// \brief Further info for explicit template specialization/instantiation. 1335 /// Does not apply to implicit specializations. 1336 ExplicitSpecializationInfo *ExplicitInfo; 1337 1338 /// \brief The template arguments used to describe this specialization. 1339 TemplateArgumentList *TemplateArgs; 1340 1341 /// \brief The point where this template was instantiated (if any) 1342 SourceLocation PointOfInstantiation; 1343 1344 /// \brief The kind of specialization this declaration refers to. 1345 /// Really a value of type TemplateSpecializationKind. 1346 unsigned SpecializationKind : 3; 1347 1348 protected: 1349 ClassTemplateSpecializationDecl(ASTContext &Context, Kind DK, TagKind TK, 1350 DeclContext *DC, SourceLocation StartLoc, 1351 SourceLocation IdLoc, 1352 ClassTemplateDecl *SpecializedTemplate, 1353 const TemplateArgument *Args, 1354 unsigned NumArgs, 1355 ClassTemplateSpecializationDecl *PrevDecl); 1356 1357 explicit ClassTemplateSpecializationDecl(Kind DK); 1358 1359 public: 1360 static ClassTemplateSpecializationDecl * 1361 Create(ASTContext &Context, TagKind TK, DeclContext *DC, 1362 SourceLocation StartLoc, SourceLocation IdLoc, 1363 ClassTemplateDecl *SpecializedTemplate, 1364 const TemplateArgument *Args, 1365 unsigned NumArgs, 1366 ClassTemplateSpecializationDecl *PrevDecl); 1367 static ClassTemplateSpecializationDecl * 1368 Create(ASTContext &Context, EmptyShell Empty); 1369 1370 virtual void getNameForDiagnostic(std::string &S, 1371 const PrintingPolicy &Policy, 1372 bool Qualified) const; 1373 1374 ClassTemplateSpecializationDecl *getMostRecentDeclaration() { 1375 CXXRecordDecl *Recent 1376 = cast<CXXRecordDecl>(CXXRecordDecl::getMostRecentDeclaration()); 1377 if (!isa<ClassTemplateSpecializationDecl>(Recent)) { 1378 // FIXME: Does injected class name need to be in the redeclarations chain? 1379 assert(Recent->isInjectedClassName() && Recent->getPreviousDeclaration()); 1380 Recent = Recent->getPreviousDeclaration(); 1381 } 1382 return cast<ClassTemplateSpecializationDecl>(Recent); 1383 } 1384 1385 /// \brief Retrieve the template that this specialization specializes. 1386 ClassTemplateDecl *getSpecializedTemplate() const; 1387 1388 /// \brief Retrieve the template arguments of the class template 1389 /// specialization. 1390 const TemplateArgumentList &getTemplateArgs() const { 1391 return *TemplateArgs; 1392 } 1393 1394 /// \brief Determine the kind of specialization that this 1395 /// declaration represents. 1396 TemplateSpecializationKind getSpecializationKind() const { 1397 return static_cast<TemplateSpecializationKind>(SpecializationKind); 1398 } 1399 1400 bool isExplicitSpecialization() const { 1401 return getSpecializationKind() == TSK_ExplicitSpecialization; 1402 } 1403 1404 void setSpecializationKind(TemplateSpecializationKind TSK) { 1405 SpecializationKind = TSK; 1406 } 1407 1408 /// \brief Get the point of instantiation (if any), or null if none. 1409 SourceLocation getPointOfInstantiation() const { 1410 return PointOfInstantiation; 1411 } 1412 1413 void setPointOfInstantiation(SourceLocation Loc) { 1414 assert(Loc.isValid() && "point of instantiation must be valid!"); 1415 PointOfInstantiation = Loc; 1416 } 1417 1418 /// \brief If this class template specialization is an instantiation of 1419 /// a template (rather than an explicit specialization), return the 1420 /// class template or class template partial specialization from which it 1421 /// was instantiated. 1422 llvm::PointerUnion<ClassTemplateDecl *, 1423 ClassTemplatePartialSpecializationDecl *> 1424 getInstantiatedFrom() const { 1425 if (getSpecializationKind() != TSK_ImplicitInstantiation && 1426 getSpecializationKind() != TSK_ExplicitInstantiationDefinition && 1427 getSpecializationKind() != TSK_ExplicitInstantiationDeclaration) 1428 return llvm::PointerUnion<ClassTemplateDecl *, 1429 ClassTemplatePartialSpecializationDecl *>(); 1430 1431 if (SpecializedPartialSpecialization *PartialSpec 1432 = SpecializedTemplate.dyn_cast<SpecializedPartialSpecialization*>()) 1433 return PartialSpec->PartialSpecialization; 1434 1435 return const_cast<ClassTemplateDecl*>( 1436 SpecializedTemplate.get<ClassTemplateDecl*>()); 1437 } 1438 1439 /// \brief Retrieve the class template or class template partial 1440 /// specialization which was specialized by this. 1441 llvm::PointerUnion<ClassTemplateDecl *, 1442 ClassTemplatePartialSpecializationDecl *> 1443 getSpecializedTemplateOrPartial() const { 1444 if (SpecializedPartialSpecialization *PartialSpec 1445 = SpecializedTemplate.dyn_cast<SpecializedPartialSpecialization*>()) 1446 return PartialSpec->PartialSpecialization; 1447 1448 return const_cast<ClassTemplateDecl*>( 1449 SpecializedTemplate.get<ClassTemplateDecl*>()); 1450 } 1451 1452 /// \brief Retrieve the set of template arguments that should be used 1453 /// to instantiate members of the class template or class template partial 1454 /// specialization from which this class template specialization was 1455 /// instantiated. 1456 /// 1457 /// \returns For a class template specialization instantiated from the primary 1458 /// template, this function will return the same template arguments as 1459 /// getTemplateArgs(). For a class template specialization instantiated from 1460 /// a class template partial specialization, this function will return the 1461 /// deduced template arguments for the class template partial specialization 1462 /// itself. 1463 const TemplateArgumentList &getTemplateInstantiationArgs() const { 1464 if (SpecializedPartialSpecialization *PartialSpec 1465 = SpecializedTemplate.dyn_cast<SpecializedPartialSpecialization*>()) 1466 return *PartialSpec->TemplateArgs; 1467 1468 return getTemplateArgs(); 1469 } 1470 1471 /// \brief Note that this class template specialization is actually an 1472 /// instantiation of the given class template partial specialization whose 1473 /// template arguments have been deduced. 1474 void setInstantiationOf(ClassTemplatePartialSpecializationDecl *PartialSpec, 1475 TemplateArgumentList *TemplateArgs) { 1476 assert(!SpecializedTemplate.is<SpecializedPartialSpecialization*>() && 1477 "Already set to a class template partial specialization!"); 1478 SpecializedPartialSpecialization *PS 1479 = new (getASTContext()) SpecializedPartialSpecialization(); 1480 PS->PartialSpecialization = PartialSpec; 1481 PS->TemplateArgs = TemplateArgs; 1482 SpecializedTemplate = PS; 1483 } 1484 1485 /// \brief Note that this class template specialization is an instantiation 1486 /// of the given class template. 1487 void setInstantiationOf(ClassTemplateDecl *TemplDecl) { 1488 assert(!SpecializedTemplate.is<SpecializedPartialSpecialization*>() && 1489 "Previously set to a class template partial specialization!"); 1490 SpecializedTemplate = TemplDecl; 1491 } 1492 1493 /// \brief Sets the type of this specialization as it was written by 1494 /// the user. This will be a class template specialization type. 1495 void setTypeAsWritten(TypeSourceInfo *T) { 1496 if (!ExplicitInfo) 1497 ExplicitInfo = new (getASTContext()) ExplicitSpecializationInfo; 1498 ExplicitInfo->TypeAsWritten = T; 1499 } 1500 /// \brief Gets the type of this specialization as it was written by 1501 /// the user, if it was so written. 1502 TypeSourceInfo *getTypeAsWritten() const { 1503 return ExplicitInfo ? ExplicitInfo->TypeAsWritten : 0; 1504 } 1505 1506 /// \brief Gets the location of the extern keyword, if present. 1507 SourceLocation getExternLoc() const { 1508 return ExplicitInfo ? ExplicitInfo->ExternLoc : SourceLocation(); 1509 } 1510 /// \brief Sets the location of the extern keyword. 1511 void setExternLoc(SourceLocation Loc) { 1512 if (!ExplicitInfo) 1513 ExplicitInfo = new (getASTContext()) ExplicitSpecializationInfo; 1514 ExplicitInfo->ExternLoc = Loc; 1515 } 1516 1517 /// \brief Sets the location of the template keyword. 1518 void setTemplateKeywordLoc(SourceLocation Loc) { 1519 if (!ExplicitInfo) 1520 ExplicitInfo = new (getASTContext()) ExplicitSpecializationInfo; 1521 ExplicitInfo->TemplateKeywordLoc = Loc; 1522 } 1523 /// \brief Gets the location of the template keyword, if present. 1524 SourceLocation getTemplateKeywordLoc() const { 1525 return ExplicitInfo ? ExplicitInfo->TemplateKeywordLoc : SourceLocation(); 1526 } 1527 1528 SourceRange getSourceRange() const; 1529 1530 void Profile(llvm::FoldingSetNodeID &ID) const { 1531 Profile(ID, TemplateArgs->data(), TemplateArgs->size(), getASTContext()); 1532 } 1533 1534 static void 1535 Profile(llvm::FoldingSetNodeID &ID, const TemplateArgument *TemplateArgs, 1536 unsigned NumTemplateArgs, ASTContext &Context) { 1537 ID.AddInteger(NumTemplateArgs); 1538 for (unsigned Arg = 0; Arg != NumTemplateArgs; ++Arg) 1539 TemplateArgs[Arg].Profile(ID, Context); 1540 } 1541 1542 static bool classof(const Decl *D) { return classofKind(D->getKind()); } 1543 static bool classofKind(Kind K) { 1544 return K >= firstClassTemplateSpecialization && 1545 K <= lastClassTemplateSpecialization; 1546 } 1547 1548 static bool classof(const ClassTemplateSpecializationDecl *) { 1549 return true; 1550 } 1551 1552 static bool classof(const ClassTemplatePartialSpecializationDecl *) { 1553 return true; 1554 } 1555 1556 friend class ASTDeclReader; 1557 friend class ASTDeclWriter; 1558 }; 1559 1560 class ClassTemplatePartialSpecializationDecl 1561 : public ClassTemplateSpecializationDecl { 1562 /// \brief The list of template parameters 1563 TemplateParameterList* TemplateParams; 1564 1565 /// \brief The source info for the template arguments as written. 1566 /// FIXME: redundant with TypeAsWritten? 1567 TemplateArgumentLoc *ArgsAsWritten; 1568 unsigned NumArgsAsWritten; 1569 1570 /// \brief Sequence number indicating when this class template partial 1571 /// specialization was added to the set of partial specializations for 1572 /// its owning class template. 1573 unsigned SequenceNumber; 1574 1575 /// \brief The class template partial specialization from which this 1576 /// class template partial specialization was instantiated. 1577 /// 1578 /// The boolean value will be true to indicate that this class template 1579 /// partial specialization was specialized at this level. 1580 llvm::PointerIntPair<ClassTemplatePartialSpecializationDecl *, 1, bool> 1581 InstantiatedFromMember; 1582 1583 ClassTemplatePartialSpecializationDecl(ASTContext &Context, TagKind TK, 1584 DeclContext *DC, 1585 SourceLocation StartLoc, 1586 SourceLocation IdLoc, 1587 TemplateParameterList *Params, 1588 ClassTemplateDecl *SpecializedTemplate, 1589 const TemplateArgument *Args, 1590 unsigned NumArgs, 1591 TemplateArgumentLoc *ArgInfos, 1592 unsigned NumArgInfos, 1593 ClassTemplatePartialSpecializationDecl *PrevDecl, 1594 unsigned SequenceNumber); 1595 1596 ClassTemplatePartialSpecializationDecl() 1597 : ClassTemplateSpecializationDecl(ClassTemplatePartialSpecialization), 1598 TemplateParams(0), ArgsAsWritten(0), 1599 NumArgsAsWritten(0), SequenceNumber(0), 1600 InstantiatedFromMember(0, false) { } 1601 1602 public: 1603 static ClassTemplatePartialSpecializationDecl * 1604 Create(ASTContext &Context, TagKind TK,DeclContext *DC, 1605 SourceLocation StartLoc, SourceLocation IdLoc, 1606 TemplateParameterList *Params, 1607 ClassTemplateDecl *SpecializedTemplate, 1608 const TemplateArgument *Args, 1609 unsigned NumArgs, 1610 const TemplateArgumentListInfo &ArgInfos, 1611 QualType CanonInjectedType, 1612 ClassTemplatePartialSpecializationDecl *PrevDecl, 1613 unsigned SequenceNumber); 1614 1615 static ClassTemplatePartialSpecializationDecl * 1616 Create(ASTContext &Context, EmptyShell Empty); 1617 1618 ClassTemplatePartialSpecializationDecl *getMostRecentDeclaration() { 1619 return cast<ClassTemplatePartialSpecializationDecl>( 1620 ClassTemplateSpecializationDecl::getMostRecentDeclaration()); 1621 } 1622 1623 /// Get the list of template parameters 1624 TemplateParameterList *getTemplateParameters() const { 1625 return TemplateParams; 1626 } 1627 1628 /// Get the template arguments as written. 1629 TemplateArgumentLoc *getTemplateArgsAsWritten() const { 1630 return ArgsAsWritten; 1631 } 1632 1633 /// Get the number of template arguments as written. 1634 unsigned getNumTemplateArgsAsWritten() const { 1635 return NumArgsAsWritten; 1636 } 1637 1638 /// \brief Get the sequence number for this class template partial 1639 /// specialization. 1640 unsigned getSequenceNumber() const { return SequenceNumber; } 1641 1642 /// \brief Retrieve the member class template partial specialization from 1643 /// which this particular class template partial specialization was 1644 /// instantiated. 1645 /// 1646 /// \code 1647 /// template<typename T> 1648 /// struct Outer { 1649 /// template<typename U> struct Inner; 1650 /// template<typename U> struct Inner<U*> { }; // #1 1651 /// }; 1652 /// 1653 /// Outer<float>::Inner<int*> ii; 1654 /// \endcode 1655 /// 1656 /// In this example, the instantiation of \c Outer<float>::Inner<int*> will 1657 /// end up instantiating the partial specialization 1658 /// \c Outer<float>::Inner<U*>, which itself was instantiated from the class 1659 /// template partial specialization \c Outer<T>::Inner<U*>. Given 1660 /// \c Outer<float>::Inner<U*>, this function would return 1661 /// \c Outer<T>::Inner<U*>. 1662 ClassTemplatePartialSpecializationDecl *getInstantiatedFromMember() { 1663 ClassTemplatePartialSpecializationDecl *First 1664 = cast<ClassTemplatePartialSpecializationDecl>(getFirstDeclaration()); 1665 return First->InstantiatedFromMember.getPointer(); 1666 } 1667 1668 void setInstantiatedFromMember( 1669 ClassTemplatePartialSpecializationDecl *PartialSpec) { 1670 ClassTemplatePartialSpecializationDecl *First 1671 = cast<ClassTemplatePartialSpecializationDecl>(getFirstDeclaration()); 1672 First->InstantiatedFromMember.setPointer(PartialSpec); 1673 } 1674 1675 /// \brief Determines whether this class template partial specialization 1676 /// template was a specialization of a member partial specialization. 1677 /// 1678 /// In the following example, the member template partial specialization 1679 /// \c X<int>::Inner<T*> is a member specialization. 1680 /// 1681 /// \code 1682 /// template<typename T> 1683 /// struct X { 1684 /// template<typename U> struct Inner; 1685 /// template<typename U> struct Inner<U*>; 1686 /// }; 1687 /// 1688 /// template<> template<typename T> 1689 /// struct X<int>::Inner<T*> { /* ... */ }; 1690 /// \endcode 1691 bool isMemberSpecialization() { 1692 ClassTemplatePartialSpecializationDecl *First 1693 = cast<ClassTemplatePartialSpecializationDecl>(getFirstDeclaration()); 1694 return First->InstantiatedFromMember.getInt(); 1695 } 1696 1697 /// \brief Note that this member template is a specialization. 1698 void setMemberSpecialization() { 1699 ClassTemplatePartialSpecializationDecl *First 1700 = cast<ClassTemplatePartialSpecializationDecl>(getFirstDeclaration()); 1701 assert(First->InstantiatedFromMember.getPointer() && 1702 "Only member templates can be member template specializations"); 1703 return First->InstantiatedFromMember.setInt(true); 1704 } 1705 1706 /// Retrieves the injected specialization type for this partial 1707 /// specialization. This is not the same as the type-decl-type for 1708 /// this partial specialization, which is an InjectedClassNameType. 1709 QualType getInjectedSpecializationType() const { 1710 assert(getTypeForDecl() && "partial specialization has no type set!"); 1711 return cast<InjectedClassNameType>(getTypeForDecl()) 1712 ->getInjectedSpecializationType(); 1713 } 1714 1715 // FIXME: Add Profile support! 1716 1717 static bool classof(const Decl *D) { return classofKind(D->getKind()); } 1718 static bool classofKind(Kind K) { 1719 return K == ClassTemplatePartialSpecialization; 1720 } 1721 1722 static bool classof(const ClassTemplatePartialSpecializationDecl *) { 1723 return true; 1724 } 1725 1726 friend class ASTDeclReader; 1727 friend class ASTDeclWriter; 1728 }; 1729 1730 /// Declaration of a class template. 1731 class ClassTemplateDecl : public RedeclarableTemplateDecl, 1732 public RedeclarableTemplate<ClassTemplateDecl> { 1733 static void DeallocateCommon(void *Ptr); 1734 1735 protected: 1736 typedef RedeclarableTemplate<ClassTemplateDecl> redeclarable_base; 1737 1738 /// \brief Data that is common to all of the declarations of a given 1739 /// class template. 1740 struct Common : CommonBase { 1741 Common() : LazySpecializations() { } 1742 1743 /// \brief The class template specializations for this class 1744 /// template, including explicit specializations and instantiations. 1745 llvm::FoldingSet<ClassTemplateSpecializationDecl> Specializations; 1746 1747 /// \brief The class template partial specializations for this class 1748 /// template. 1749 llvm::FoldingSet<ClassTemplatePartialSpecializationDecl> 1750 PartialSpecializations; 1751 1752 /// \brief The injected-class-name type for this class template. 1753 QualType InjectedClassNameType; 1754 1755 /// \brief If non-null, points to an array of specializations (including 1756 /// partial specializations) known ownly by their external declaration IDs. 1757 /// 1758 /// The first value in the array is the number of of specializations/ 1759 /// partial specializations that follow. 1760 uint32_t *LazySpecializations; 1761 }; 1762 1763 /// \brief Load any lazily-loaded specializations from the external source. 1764 void LoadLazySpecializations(); 1765 1766 /// \brief Retrieve the set of specializations of this class template. 1767 llvm::FoldingSet<ClassTemplateSpecializationDecl> &getSpecializations(); 1768 1769 /// \brief Retrieve the set of partial specializations of this class 1770 /// template. 1771 llvm::FoldingSet<ClassTemplatePartialSpecializationDecl> & 1772 getPartialSpecializations(); 1773 1774 ClassTemplateDecl(DeclContext *DC, SourceLocation L, DeclarationName Name, 1775 TemplateParameterList *Params, NamedDecl *Decl) 1776 : RedeclarableTemplateDecl(ClassTemplate, DC, L, Name, Params, Decl) { } 1777 1778 ClassTemplateDecl(EmptyShell Empty) 1779 : RedeclarableTemplateDecl(ClassTemplate, 0, SourceLocation(), 1780 DeclarationName(), 0, 0) { } 1781 1782 CommonBase *newCommon(ASTContext &C); 1783 1784 Common *getCommonPtr() { 1785 return static_cast<Common *>(RedeclarableTemplateDecl::getCommonPtr()); 1786 } 1787 1788 public: 1789 /// Get the underlying class declarations of the template. 1790 CXXRecordDecl *getTemplatedDecl() const { 1791 return static_cast<CXXRecordDecl *>(TemplatedDecl); 1792 } 1793 1794 /// Returns whether this template declaration defines the primary 1795 /// class pattern. 1796 bool isThisDeclarationADefinition() const { 1797 return getTemplatedDecl()->isThisDeclarationADefinition(); 1798 } 1799 1800 /// Create a class template node. 1801 static ClassTemplateDecl *Create(ASTContext &C, DeclContext *DC, 1802 SourceLocation L, 1803 DeclarationName Name, 1804 TemplateParameterList *Params, 1805 NamedDecl *Decl, 1806 ClassTemplateDecl *PrevDecl); 1807 1808 /// Create an empty class template node. 1809 static ClassTemplateDecl *Create(ASTContext &C, EmptyShell); 1810 1811 /// \brief Return the specialization with the provided arguments if it exists, 1812 /// otherwise return the insertion point. 1813 ClassTemplateSpecializationDecl * 1814 findSpecialization(const TemplateArgument *Args, unsigned NumArgs, 1815 void *&InsertPos); 1816 1817 /// \brief Insert the specified specialization knowing that it is not already 1818 /// in. InsertPos must be obtained from findSpecialization. 1819 void AddSpecialization(ClassTemplateSpecializationDecl *D, void *InsertPos); 1820 1821 ClassTemplateDecl *getCanonicalDecl() { 1822 return redeclarable_base::getCanonicalDecl(); 1823 } 1824 const ClassTemplateDecl *getCanonicalDecl() const { 1825 return redeclarable_base::getCanonicalDecl(); 1826 } 1827 1828 /// \brief Retrieve the previous declaration of this class template, or 1829 /// NULL if no such declaration exists. 1830 ClassTemplateDecl *getPreviousDeclaration() { 1831 return redeclarable_base::getPreviousDeclaration(); 1832 } 1833 1834 /// \brief Retrieve the previous declaration of this class template, or 1835 /// NULL if no such declaration exists. 1836 const ClassTemplateDecl *getPreviousDeclaration() const { 1837 return redeclarable_base::getPreviousDeclaration(); 1838 } 1839 1840 ClassTemplateDecl *getInstantiatedFromMemberTemplate() { 1841 return redeclarable_base::getInstantiatedFromMemberTemplate(); 1842 } 1843 1844 /// \brief Return the partial specialization with the provided arguments if it 1845 /// exists, otherwise return the insertion point. 1846 ClassTemplatePartialSpecializationDecl * 1847 findPartialSpecialization(const TemplateArgument *Args, unsigned NumArgs, 1848 void *&InsertPos); 1849 1850 /// \brief Insert the specified partial specialization knowing that it is not 1851 /// already in. InsertPos must be obtained from findPartialSpecialization. 1852 void AddPartialSpecialization(ClassTemplatePartialSpecializationDecl *D, 1853 void *InsertPos); 1854 1855 /// \brief Return the next partial specialization sequence number. 1856 unsigned getNextPartialSpecSequenceNumber() { 1857 return getPartialSpecializations().size(); 1858 } 1859 1860 /// \brief Retrieve the partial specializations as an ordered list. 1861 void getPartialSpecializations( 1862 SmallVectorImpl<ClassTemplatePartialSpecializationDecl *> &PS); 1863 1864 /// \brief Find a class template partial specialization with the given 1865 /// type T. 1866 /// 1867 /// \param T a dependent type that names a specialization of this class 1868 /// template. 1869 /// 1870 /// \returns the class template partial specialization that exactly matches 1871 /// the type \p T, or NULL if no such partial specialization exists. 1872 ClassTemplatePartialSpecializationDecl *findPartialSpecialization(QualType T); 1873 1874 /// \brief Find a class template partial specialization which was instantiated 1875 /// from the given member partial specialization. 1876 /// 1877 /// \param D a member class template partial specialization. 1878 /// 1879 /// \returns the class template partial specialization which was instantiated 1880 /// from the given member partial specialization, or NULL if no such partial 1881 /// specialization exists. 1882 ClassTemplatePartialSpecializationDecl * 1883 findPartialSpecInstantiatedFromMember( 1884 ClassTemplatePartialSpecializationDecl *D); 1885 1886 /// \brief Retrieve the template specialization type of the 1887 /// injected-class-name for this class template. 1888 /// 1889 /// The injected-class-name for a class template \c X is \c 1890 /// X<template-args>, where \c template-args is formed from the 1891 /// template arguments that correspond to the template parameters of 1892 /// \c X. For example: 1893 /// 1894 /// \code 1895 /// template<typename T, int N> 1896 /// struct array { 1897 /// typedef array this_type; // "array" is equivalent to "array<T, N>" 1898 /// }; 1899 /// \endcode 1900 QualType getInjectedClassNameSpecialization(); 1901 1902 typedef SpecIterator<ClassTemplateSpecializationDecl> spec_iterator; 1903 1904 spec_iterator spec_begin() { 1905 return makeSpecIterator(getSpecializations(), false); 1906 } 1907 1908 spec_iterator spec_end() { 1909 return makeSpecIterator(getSpecializations(), true); 1910 } 1911 1912 typedef SpecIterator<ClassTemplatePartialSpecializationDecl> 1913 partial_spec_iterator; 1914 1915 partial_spec_iterator partial_spec_begin() { 1916 return makeSpecIterator(getPartialSpecializations(), false); 1917 } 1918 1919 partial_spec_iterator partial_spec_end() { 1920 return makeSpecIterator(getPartialSpecializations(), true); 1921 } 1922 1923 // Implement isa/cast/dyncast support 1924 static bool classof(const Decl *D) { return classofKind(D->getKind()); } 1925 static bool classof(const ClassTemplateDecl *D) { return true; } 1926 static bool classofKind(Kind K) { return K == ClassTemplate; } 1927 1928 friend class ASTDeclReader; 1929 friend class ASTDeclWriter; 1930 }; 1931 1932 /// Declaration of a friend template. For example: 1933 /// 1934 /// template <typename T> class A { 1935 /// friend class MyVector<T>; // not a friend template 1936 /// template <typename U> friend class B; // not a friend template 1937 /// template <typename U> friend class Foo<T>::Nested; // friend template 1938 /// }; 1939 /// NOTE: This class is not currently in use. All of the above 1940 /// will yield a FriendDecl, not a FriendTemplateDecl. 1941 class FriendTemplateDecl : public Decl { 1942 public: 1943 typedef llvm::PointerUnion<NamedDecl*,TypeSourceInfo*> FriendUnion; 1944 1945 private: 1946 // The number of template parameters; always non-zero. 1947 unsigned NumParams; 1948 1949 // The parameter list. 1950 TemplateParameterList **Params; 1951 1952 // The declaration that's a friend of this class. 1953 FriendUnion Friend; 1954 1955 // Location of the 'friend' specifier. 1956 SourceLocation FriendLoc; 1957 1958 1959 FriendTemplateDecl(DeclContext *DC, SourceLocation Loc, 1960 unsigned NParams, 1961 TemplateParameterList **Params, 1962 FriendUnion Friend, 1963 SourceLocation FriendLoc) 1964 : Decl(Decl::FriendTemplate, DC, Loc), 1965 NumParams(NParams), 1966 Params(Params), 1967 Friend(Friend), 1968 FriendLoc(FriendLoc) 1969 {} 1970 1971 FriendTemplateDecl(EmptyShell Empty) 1972 : Decl(Decl::FriendTemplate, Empty), 1973 NumParams(0), 1974 Params(0) 1975 {} 1976 1977 public: 1978 static FriendTemplateDecl *Create(ASTContext &Context, 1979 DeclContext *DC, SourceLocation Loc, 1980 unsigned NParams, 1981 TemplateParameterList **Params, 1982 FriendUnion Friend, 1983 SourceLocation FriendLoc); 1984 1985 static FriendTemplateDecl *Create(ASTContext &Context, EmptyShell Empty); 1986 1987 /// If this friend declaration names a templated type (or 1988 /// a dependent member type of a templated type), return that 1989 /// type; otherwise return null. 1990 TypeSourceInfo *getFriendType() const { 1991 return Friend.dyn_cast<TypeSourceInfo*>(); 1992 } 1993 1994 /// If this friend declaration names a templated function (or 1995 /// a member function of a templated type), return that type; 1996 /// otherwise return null. 1997 NamedDecl *getFriendDecl() const { 1998 return Friend.dyn_cast<NamedDecl*>(); 1999 } 2000 2001 /// Retrieves the location of the 'friend' keyword. 2002 SourceLocation getFriendLoc() const { 2003 return FriendLoc; 2004 } 2005 2006 TemplateParameterList *getTemplateParameterList(unsigned i) const { 2007 assert(i <= NumParams); 2008 return Params[i]; 2009 } 2010 2011 unsigned getNumTemplateParameters() const { 2012 return NumParams; 2013 } 2014 2015 // Implement isa/cast/dyncast/etc. 2016 static bool classof(const Decl *D) { return classofKind(D->getKind()); } 2017 static bool classofKind(Kind K) { return K == Decl::FriendTemplate; } 2018 static bool classof(const FriendTemplateDecl *D) { return true; } 2019 2020 friend class ASTDeclReader; 2021 }; 2022 2023 /// Declaration of an alias template. For example: 2024 /// 2025 /// template <typename T> using V = std::map<T*, int, MyCompare<T>>; 2026 class TypeAliasTemplateDecl : public RedeclarableTemplateDecl, 2027 public RedeclarableTemplate<TypeAliasTemplateDecl> { 2028 static void DeallocateCommon(void *Ptr); 2029 2030 protected: 2031 typedef RedeclarableTemplate<TypeAliasTemplateDecl> redeclarable_base; 2032 2033 typedef CommonBase Common; 2034 2035 TypeAliasTemplateDecl(DeclContext *DC, SourceLocation L, DeclarationName Name, 2036 TemplateParameterList *Params, NamedDecl *Decl) 2037 : RedeclarableTemplateDecl(TypeAliasTemplate, DC, L, Name, Params, Decl) { } 2038 2039 CommonBase *newCommon(ASTContext &C); 2040 2041 Common *getCommonPtr() { 2042 return static_cast<Common *>(RedeclarableTemplateDecl::getCommonPtr()); 2043 } 2044 2045 public: 2046 /// Get the underlying function declaration of the template. 2047 TypeAliasDecl *getTemplatedDecl() const { 2048 return static_cast<TypeAliasDecl*>(TemplatedDecl); 2049 } 2050 2051 2052 TypeAliasTemplateDecl *getCanonicalDecl() { 2053 return redeclarable_base::getCanonicalDecl(); 2054 } 2055 const TypeAliasTemplateDecl *getCanonicalDecl() const { 2056 return redeclarable_base::getCanonicalDecl(); 2057 } 2058 2059 /// \brief Retrieve the previous declaration of this function template, or 2060 /// NULL if no such declaration exists. 2061 TypeAliasTemplateDecl *getPreviousDeclaration() { 2062 return redeclarable_base::getPreviousDeclaration(); 2063 } 2064 2065 /// \brief Retrieve the previous declaration of this function template, or 2066 /// NULL if no such declaration exists. 2067 const TypeAliasTemplateDecl *getPreviousDeclaration() const { 2068 return redeclarable_base::getPreviousDeclaration(); 2069 } 2070 2071 TypeAliasTemplateDecl *getInstantiatedFromMemberTemplate() { 2072 return redeclarable_base::getInstantiatedFromMemberTemplate(); 2073 } 2074 2075 2076 /// \brief Create a function template node. 2077 static TypeAliasTemplateDecl *Create(ASTContext &C, DeclContext *DC, 2078 SourceLocation L, 2079 DeclarationName Name, 2080 TemplateParameterList *Params, 2081 NamedDecl *Decl); 2082 2083 /// \brief Create an empty alias template node. 2084 static TypeAliasTemplateDecl *Create(ASTContext &C, EmptyShell); 2085 2086 // Implement isa/cast/dyncast support 2087 static bool classof(const Decl *D) { return classofKind(D->getKind()); } 2088 static bool classof(const TypeAliasTemplateDecl *D) { return true; } 2089 static bool classofKind(Kind K) { return K == TypeAliasTemplate; } 2090 2091 friend class ASTDeclReader; 2092 friend class ASTDeclWriter; 2093 }; 2094 2095 /// Declaration of a function specialization at template class scope. 2096 /// This is a non standard extension needed to support MSVC. 2097 /// For example: 2098 /// template <class T> 2099 /// class A { 2100 /// template <class U> void foo(U a) { } 2101 /// template<> void foo(int a) { } 2102 /// } 2103 /// 2104 /// "template<> foo(int a)" will be saved in Specialization as a normal 2105 /// CXXMethodDecl. Then during an instantiation of class A, it will be 2106 /// transformed into an actual function specialization. 2107 class ClassScopeFunctionSpecializationDecl : public Decl { 2108 private: 2109 ClassScopeFunctionSpecializationDecl(DeclContext *DC, SourceLocation Loc, 2110 CXXMethodDecl *FD) 2111 : Decl(Decl::ClassScopeFunctionSpecialization, DC, Loc), 2112 Specialization(FD) {} 2113 2114 ClassScopeFunctionSpecializationDecl(EmptyShell Empty) 2115 : Decl(Decl::ClassScopeFunctionSpecialization, Empty) {} 2116 2117 CXXMethodDecl *Specialization; 2118 2119 public: 2120 CXXMethodDecl *getSpecialization() const { return Specialization; } 2121 2122 static ClassScopeFunctionSpecializationDecl *Create(ASTContext &C, 2123 DeclContext *DC, 2124 SourceLocation Loc, 2125 CXXMethodDecl *FD) { 2126 return new (C) ClassScopeFunctionSpecializationDecl(DC , Loc, FD); 2127 } 2128 2129 static ClassScopeFunctionSpecializationDecl *Create(ASTContext &Context, 2130 EmptyShell Empty) { 2131 return new (Context)ClassScopeFunctionSpecializationDecl(0, 2132 SourceLocation(), 0); 2133 } 2134 // Implement isa/cast/dyncast/etc. 2135 static bool classof(const Decl *D) { return classofKind(D->getKind()); } 2136 static bool classofKind(Kind K) { 2137 return K == Decl::ClassScopeFunctionSpecialization; 2138 } 2139 static bool classof(const ClassScopeFunctionSpecializationDecl *D) { 2140 return true; 2141 } 2142 2143 friend class ASTDeclReader; 2144 friend class ASTDeclWriter; 2145 }; 2146 2147 /// Implementation of inline functions that require the template declarations 2148 inline AnyFunctionDecl::AnyFunctionDecl(FunctionTemplateDecl *FTD) 2149 : Function(FTD) { } 2150 2151 } /* end of namespace clang */ 2152 2153 #endif 2154