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