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