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