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