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