1275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall//===--- TemplateBase.cpp - Common template AST class implementation ------===//
2275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall//
3275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall//                     The LLVM Compiler Infrastructure
4275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall//
5275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall// This file is distributed under the University of Illinois Open Source
6275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall// License. See LICENSE.TXT for details.
7275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall//
8275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall//===----------------------------------------------------------------------===//
9275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall//
10275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall// This file implements common classes used throughout C++ template
11275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall// representations.
12275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall//
13275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall//===----------------------------------------------------------------------===//
14275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall
15275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall#include "clang/AST/TemplateBase.h"
1687dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor#include "clang/AST/ASTContext.h"
17275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall#include "clang/AST/DeclBase.h"
1874295b3408178bd0e97c2090dac911817778b582Douglas Gregor#include "clang/AST/DeclTemplate.h"
19275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall#include "clang/AST/Expr.h"
20be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor#include "clang/AST/ExprCXX.h"
21781701c3d34740c53ad912ad007383ae2951c637Chandler Carruth#include "clang/AST/Type.h"
22833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall#include "clang/AST/TypeLoc.h"
23a933319ebf754396623165f9dc0a29c2a48879f5Douglas Gregor#include "clang/Basic/Diagnostic.h"
2487dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor#include "llvm/ADT/FoldingSet.h"
258fe83e1df954d72c0f4ffc15d20a5222ec151c21Benjamin Kramer#include "llvm/ADT/SmallString.h"
26a93d0f280693b8418bc88cf7a8c93325f7fcf4c6Benjamin Kramer#include "llvm/Support/raw_ostream.h"
27203e6a322ae29d577acafcb1572a57ec16e1e730Douglas Gregor#include <algorithm>
28275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall
29275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCallusing namespace clang;
30275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall
31781701c3d34740c53ad912ad007383ae2951c637Chandler Carruth/// \brief Print a template integral argument value.
32781701c3d34740c53ad912ad007383ae2951c637Chandler Carruth///
33781701c3d34740c53ad912ad007383ae2951c637Chandler Carruth/// \param TemplArg the TemplateArgument instance to print.
34781701c3d34740c53ad912ad007383ae2951c637Chandler Carruth///
35781701c3d34740c53ad912ad007383ae2951c637Chandler Carruth/// \param Out the raw_ostream instance to use for printing.
360e2c34f92f00628d48968dfea096d36381f494cbStephen Hines///
370e2c34f92f00628d48968dfea096d36381f494cbStephen Hines/// \param Policy the printing policy for EnumConstantDecl printing.
38781701c3d34740c53ad912ad007383ae2951c637Chandler Carruthstatic void printIntegral(const TemplateArgument &TemplArg,
390e2c34f92f00628d48968dfea096d36381f494cbStephen Hines                          raw_ostream &Out, const PrintingPolicy& Policy) {
40781701c3d34740c53ad912ad007383ae2951c637Chandler Carruth  const ::clang::Type *T = TemplArg.getIntegralType().getTypePtr();
41855243789cb44799c03f4c7216d3d6308805f549Benjamin Kramer  const llvm::APSInt &Val = TemplArg.getAsIntegral();
42781701c3d34740c53ad912ad007383ae2951c637Chandler Carruth
430e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  if (const EnumType *ET = T->getAs<EnumType>()) {
440e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    for (const EnumConstantDecl* ECD : ET->getDecl()->enumerators()) {
450e2c34f92f00628d48968dfea096d36381f494cbStephen Hines      // In Sema::CheckTemplateArugment, enum template arguments value are
460e2c34f92f00628d48968dfea096d36381f494cbStephen Hines      // extended to the size of the integer underlying the enum type.  This
470e2c34f92f00628d48968dfea096d36381f494cbStephen Hines      // may create a size difference between the enum value and template
480e2c34f92f00628d48968dfea096d36381f494cbStephen Hines      // argument value, requiring isSameValue here instead of operator==.
490e2c34f92f00628d48968dfea096d36381f494cbStephen Hines      if (llvm::APSInt::isSameValue(ECD->getInitVal(), Val)) {
500e2c34f92f00628d48968dfea096d36381f494cbStephen Hines        ECD->printQualifiedName(Out, Policy);
510e2c34f92f00628d48968dfea096d36381f494cbStephen Hines        return;
520e2c34f92f00628d48968dfea096d36381f494cbStephen Hines      }
530e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    }
540e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  }
550e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
56781701c3d34740c53ad912ad007383ae2951c637Chandler Carruth  if (T->isBooleanType()) {
57855243789cb44799c03f4c7216d3d6308805f549Benjamin Kramer    Out << (Val.getBoolValue() ? "true" : "false");
58781701c3d34740c53ad912ad007383ae2951c637Chandler Carruth  } else if (T->isCharType()) {
59855243789cb44799c03f4c7216d3d6308805f549Benjamin Kramer    const char Ch = Val.getZExtValue();
60774e2b4f8d23d75cbb3dfef077d4631d37f623c0Chandler Carruth    Out << ((Ch == '\'') ? "'\\" : "'");
618fe83e1df954d72c0f4ffc15d20a5222ec151c21Benjamin Kramer    Out.write_escaped(StringRef(&Ch, 1), /*UseHexEscapes=*/ true);
62774e2b4f8d23d75cbb3dfef077d4631d37f623c0Chandler Carruth    Out << "'";
63781701c3d34740c53ad912ad007383ae2951c637Chandler Carruth  } else {
64855243789cb44799c03f4c7216d3d6308805f549Benjamin Kramer    Out << Val;
65781701c3d34740c53ad912ad007383ae2951c637Chandler Carruth  }
66781701c3d34740c53ad912ad007383ae2951c637Chandler Carruth}
67781701c3d34740c53ad912ad007383ae2951c637Chandler Carruth
68275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall//===----------------------------------------------------------------------===//
69275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall// TemplateArgument Implementation
70275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall//===----------------------------------------------------------------------===//
71275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall
72855243789cb44799c03f4c7216d3d6308805f549Benjamin KramerTemplateArgument::TemplateArgument(ASTContext &Ctx, const llvm::APSInt &Value,
73c0afea9495ba535ac5de07c32b68a5559622737eEli Friedman                                   QualType Type) {
74c0afea9495ba535ac5de07c32b68a5559622737eEli Friedman  Integer.Kind = Integral;
75855243789cb44799c03f4c7216d3d6308805f549Benjamin Kramer  // Copy the APSInt value into our decomposed form.
76855243789cb44799c03f4c7216d3d6308805f549Benjamin Kramer  Integer.BitWidth = Value.getBitWidth();
77855243789cb44799c03f4c7216d3d6308805f549Benjamin Kramer  Integer.IsUnsigned = Value.isUnsigned();
78855243789cb44799c03f4c7216d3d6308805f549Benjamin Kramer  // If the value is large, we have to get additional memory from the ASTContext
79b8e54cd26cc71075456a74be054a95fa1f2e28adBenjamin Kramer  unsigned NumWords = Value.getNumWords();
80b8e54cd26cc71075456a74be054a95fa1f2e28adBenjamin Kramer  if (NumWords > 1) {
81b8e54cd26cc71075456a74be054a95fa1f2e28adBenjamin Kramer    void *Mem = Ctx.Allocate(NumWords * sizeof(uint64_t));
82b8e54cd26cc71075456a74be054a95fa1f2e28adBenjamin Kramer    std::memcpy(Mem, Value.getRawData(), NumWords * sizeof(uint64_t));
83855243789cb44799c03f4c7216d3d6308805f549Benjamin Kramer    Integer.pVal = static_cast<uint64_t *>(Mem);
84855243789cb44799c03f4c7216d3d6308805f549Benjamin Kramer  } else {
85855243789cb44799c03f4c7216d3d6308805f549Benjamin Kramer    Integer.VAL = Value.getZExtValue();
86855243789cb44799c03f4c7216d3d6308805f549Benjamin Kramer  }
87855243789cb44799c03f4c7216d3d6308805f549Benjamin Kramer
88855243789cb44799c03f4c7216d3d6308805f549Benjamin Kramer  Integer.Type = Type.getAsOpaquePtr();
89855243789cb44799c03f4c7216d3d6308805f549Benjamin Kramer}
90855243789cb44799c03f4c7216d3d6308805f549Benjamin Kramer
91203e6a322ae29d577acafcb1572a57ec16e1e730Douglas GregorTemplateArgument TemplateArgument::CreatePackCopy(ASTContext &Context,
92203e6a322ae29d577acafcb1572a57ec16e1e730Douglas Gregor                                                  const TemplateArgument *Args,
93203e6a322ae29d577acafcb1572a57ec16e1e730Douglas Gregor                                                  unsigned NumArgs) {
94203e6a322ae29d577acafcb1572a57ec16e1e730Douglas Gregor  if (NumArgs == 0)
95d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman    return getEmptyPack();
96203e6a322ae29d577acafcb1572a57ec16e1e730Douglas Gregor
97203e6a322ae29d577acafcb1572a57ec16e1e730Douglas Gregor  TemplateArgument *Storage = new (Context) TemplateArgument [NumArgs];
98203e6a322ae29d577acafcb1572a57ec16e1e730Douglas Gregor  std::copy(Args, Args + NumArgs, Storage);
99203e6a322ae29d577acafcb1572a57ec16e1e730Douglas Gregor  return TemplateArgument(Storage, NumArgs);
100203e6a322ae29d577acafcb1572a57ec16e1e730Douglas Gregor}
101203e6a322ae29d577acafcb1572a57ec16e1e730Douglas Gregor
102bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregorbool TemplateArgument::isDependent() const {
103bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  switch (getKind()) {
104bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  case Null:
105b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie    llvm_unreachable("Should not have a NULL template argument");
106bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor
107bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  case Type:
108176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    return getAsType()->isDependentType() ||
109176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines           isa<PackExpansionType>(getAsType());
110bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor
111bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  case Template:
112bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    return getAsTemplate().isDependent();
113a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor
114a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor  case TemplateExpansion:
115a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor    return true;
116a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor
117bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  case Declaration:
118d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman    if (DeclContext *DC = dyn_cast<DeclContext>(getAsDecl()))
119d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman      return DC->isDependentContext();
120d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman    return getAsDecl()->getDeclContext()->isDependentContext();
121d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman
122d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman  case NullPtr:
123d2008e2c80d6c9282044ec873a937a17a0f33579Douglas Gregor    return false;
124bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor
125bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  case Integral:
126bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    // Never dependent
127bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    return false;
128bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor
129bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  case Expression:
130176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    return (getAsExpr()->isTypeDependent() || getAsExpr()->isValueDependent() ||
131176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines            isa<PackExpansionExpr>(getAsExpr()));
132bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor
133bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  case Pack:
134176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    for (const auto &P : pack_elements())
135176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      if (P.isDependent())
136bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor        return true;
137bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    return false;
138bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  }
139bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor
1403026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  llvm_unreachable("Invalid TemplateArgument Kind!");
141bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor}
142bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor
143561f81243f665cf2001caadc45df505f826b72d6Douglas Gregorbool TemplateArgument::isInstantiationDependent() const {
144561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor  switch (getKind()) {
145561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor  case Null:
146b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie    llvm_unreachable("Should not have a NULL template argument");
147561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor
148561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor  case Type:
149561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor    return getAsType()->isInstantiationDependentType();
150561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor
151561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor  case Template:
152561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor    return getAsTemplate().isInstantiationDependent();
153561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor
154561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor  case TemplateExpansion:
155561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor    return true;
156561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor
157561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor  case Declaration:
158d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman    if (DeclContext *DC = dyn_cast<DeclContext>(getAsDecl()))
159d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman      return DC->isDependentContext();
160d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman    return getAsDecl()->getDeclContext()->isDependentContext();
161d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman
162d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman  case NullPtr:
163d2008e2c80d6c9282044ec873a937a17a0f33579Douglas Gregor    return false;
164d2008e2c80d6c9282044ec873a937a17a0f33579Douglas Gregor
165561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor  case Integral:
166561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor    // Never dependent
167561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor    return false;
168561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor
169561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor  case Expression:
170561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor    return getAsExpr()->isInstantiationDependent();
171561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor
172561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor  case Pack:
173176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    for (const auto &P : pack_elements())
174176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      if (P.isInstantiationDependent())
175561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor        return true;
176561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor    return false;
177561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor  }
1783026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie
1793026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  llvm_unreachable("Invalid TemplateArgument Kind!");
180561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor}
181561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor
1828491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregorbool TemplateArgument::isPackExpansion() const {
1838491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor  switch (getKind()) {
1848491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor  case Null:
1858491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor  case Declaration:
1868491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor  case Integral:
1878491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor  case Pack:
188a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor  case Template:
189d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman  case NullPtr:
1908491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor    return false;
1918491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor
192a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor  case TemplateExpansion:
193a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor    return true;
194a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor
1958491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor  case Type:
196be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor    return isa<PackExpansionType>(getAsType());
197a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor
1988491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor  case Expression:
199be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor    return isa<PackExpansionExpr>(getAsExpr());
2008491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor  }
2013026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie
2023026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  llvm_unreachable("Invalid TemplateArgument Kind!");
2038491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor}
2048491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor
205d0937224f383c7cc72c947119380f9713a070c73Douglas Gregorbool TemplateArgument::containsUnexpandedParameterPack() const {
206d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor  switch (getKind()) {
207d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor  case Null:
208d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor  case Declaration:
209d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor  case Integral:
210a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor  case TemplateExpansion:
211d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman  case NullPtr:
212d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor    break;
213d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor
214d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor  case Type:
215d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor    if (getAsType()->containsUnexpandedParameterPack())
216d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor      return true;
217d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor    break;
218d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor
219d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor  case Template:
220a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor    if (getAsTemplate().containsUnexpandedParameterPack())
221d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor      return true;
222d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor    break;
223d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor
224d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor  case Expression:
225d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor    if (getAsExpr()->containsUnexpandedParameterPack())
226d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor      return true;
227d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor    break;
228d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor
229d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor  case Pack:
230176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    for (const auto &P : pack_elements())
231176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      if (P.containsUnexpandedParameterPack())
232d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor        return true;
233d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor
234d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor    break;
235d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor  }
236d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor
237d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor  return false;
238d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor}
239d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor
240dc84cd5efdd3430efb22546b4ac656aa0540b210David BlaikieOptional<unsigned> TemplateArgument::getNumTemplateExpansions() const {
241c0afea9495ba535ac5de07c32b68a5559622737eEli Friedman  assert(getKind() == TemplateExpansion);
2422be29f423acad3bbe39099a78db2805acb5bdf17Douglas Gregor  if (TemplateArg.NumExpansions)
2432be29f423acad3bbe39099a78db2805acb5bdf17Douglas Gregor    return TemplateArg.NumExpansions - 1;
2442be29f423acad3bbe39099a78db2805acb5bdf17Douglas Gregor
24566874fb18afbffb8b2ca05576851a64534be3352David Blaikie  return None;
2462be29f423acad3bbe39099a78db2805acb5bdf17Douglas Gregor}
2472be29f423acad3bbe39099a78db2805acb5bdf17Douglas Gregor
248275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCallvoid TemplateArgument::Profile(llvm::FoldingSetNodeID &ID,
2494ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                               const ASTContext &Context) const {
250c0afea9495ba535ac5de07c32b68a5559622737eEli Friedman  ID.AddInteger(getKind());
251c0afea9495ba535ac5de07c32b68a5559622737eEli Friedman  switch (getKind()) {
252275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall  case Null:
253275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall    break;
254275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall
255275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall  case Type:
256275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall    getAsType().Profile(ID);
257275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall    break;
258275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall
259c0afea9495ba535ac5de07c32b68a5559622737eEli Friedman  case NullPtr:
260c0afea9495ba535ac5de07c32b68a5559622737eEli Friedman    getNullPtrType().Profile(ID);
261c0afea9495ba535ac5de07c32b68a5559622737eEli Friedman    break;
262c0afea9495ba535ac5de07c32b68a5559622737eEli Friedman
263275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall  case Declaration:
2646bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    ID.AddPointer(getAsDecl()? getAsDecl()->getCanonicalDecl() : nullptr);
265275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall    break;
266275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall
267788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor  case Template:
268a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor  case TemplateExpansion: {
269a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor    TemplateName Template = getAsTemplateOrTemplatePattern();
27074295b3408178bd0e97c2090dac911817778b582Douglas Gregor    if (TemplateTemplateParmDecl *TTP
27174295b3408178bd0e97c2090dac911817778b582Douglas Gregor          = dyn_cast_or_null<TemplateTemplateParmDecl>(
272a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor                                                Template.getAsTemplateDecl())) {
27374295b3408178bd0e97c2090dac911817778b582Douglas Gregor      ID.AddBoolean(true);
27474295b3408178bd0e97c2090dac911817778b582Douglas Gregor      ID.AddInteger(TTP->getDepth());
27574295b3408178bd0e97c2090dac911817778b582Douglas Gregor      ID.AddInteger(TTP->getPosition());
276ba68eca7582a62e3e2ff4b0eba1b2b73a6b80895Douglas Gregor      ID.AddBoolean(TTP->isParameterPack());
27774295b3408178bd0e97c2090dac911817778b582Douglas Gregor    } else {
27874295b3408178bd0e97c2090dac911817778b582Douglas Gregor      ID.AddBoolean(false);
279a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor      ID.AddPointer(Context.getCanonicalTemplateName(Template)
280a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor                                                          .getAsVoidPointer());
28174295b3408178bd0e97c2090dac911817778b582Douglas Gregor    }
282788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor    break;
283a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor  }
284788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor
285275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall  case Integral:
286855243789cb44799c03f4c7216d3d6308805f549Benjamin Kramer    getAsIntegral().Profile(ID);
287275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall    getIntegralType().Profile(ID);
288275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall    break;
289275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall
290275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall  case Expression:
291275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall    getAsExpr()->Profile(ID, Context, true);
292275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall    break;
293275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall
294275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall  case Pack:
295275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall    ID.AddInteger(Args.NumArgs);
296275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall    for (unsigned I = 0; I != Args.NumArgs; ++I)
297275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall      Args.Args[I].Profile(ID, Context);
298275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall  }
299275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall}
300833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
30133500955d731c73717af52088b7fc0e7a85681e7John McCallbool TemplateArgument::structurallyEquals(const TemplateArgument &Other) const {
30233500955d731c73717af52088b7fc0e7a85681e7John McCall  if (getKind() != Other.getKind()) return false;
30333500955d731c73717af52088b7fc0e7a85681e7John McCall
30433500955d731c73717af52088b7fc0e7a85681e7John McCall  switch (getKind()) {
30533500955d731c73717af52088b7fc0e7a85681e7John McCall  case Null:
30633500955d731c73717af52088b7fc0e7a85681e7John McCall  case Type:
307a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor  case Expression:
308a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor  case Template:
309a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor  case TemplateExpansion:
310d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman  case NullPtr:
311c0afea9495ba535ac5de07c32b68a5559622737eEli Friedman    return TypeOrValue.V == Other.TypeOrValue.V;
31233500955d731c73717af52088b7fc0e7a85681e7John McCall
313d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman  case Declaration:
314176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    return getAsDecl() == Other.getAsDecl();
315d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman
31633500955d731c73717af52088b7fc0e7a85681e7John McCall  case Integral:
31733500955d731c73717af52088b7fc0e7a85681e7John McCall    return getIntegralType() == Other.getIntegralType() &&
318855243789cb44799c03f4c7216d3d6308805f549Benjamin Kramer           getAsIntegral() == Other.getAsIntegral();
31933500955d731c73717af52088b7fc0e7a85681e7John McCall
32033500955d731c73717af52088b7fc0e7a85681e7John McCall  case Pack:
32133500955d731c73717af52088b7fc0e7a85681e7John McCall    if (Args.NumArgs != Other.Args.NumArgs) return false;
32233500955d731c73717af52088b7fc0e7a85681e7John McCall    for (unsigned I = 0, E = Args.NumArgs; I != E; ++I)
32333500955d731c73717af52088b7fc0e7a85681e7John McCall      if (!Args.Args[I].structurallyEquals(Other.Args.Args[I]))
32433500955d731c73717af52088b7fc0e7a85681e7John McCall        return false;
32533500955d731c73717af52088b7fc0e7a85681e7John McCall    return true;
32633500955d731c73717af52088b7fc0e7a85681e7John McCall  }
32733500955d731c73717af52088b7fc0e7a85681e7John McCall
3283026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  llvm_unreachable("Invalid TemplateArgument Kind!");
32933500955d731c73717af52088b7fc0e7a85681e7John McCall}
33033500955d731c73717af52088b7fc0e7a85681e7John McCall
331e02e26293cf8e3bad1059b39cea75c6582896da6Douglas GregorTemplateArgument TemplateArgument::getPackExpansionPattern() const {
332e02e26293cf8e3bad1059b39cea75c6582896da6Douglas Gregor  assert(isPackExpansion());
333e02e26293cf8e3bad1059b39cea75c6582896da6Douglas Gregor
334e02e26293cf8e3bad1059b39cea75c6582896da6Douglas Gregor  switch (getKind()) {
335ba68eca7582a62e3e2ff4b0eba1b2b73a6b80895Douglas Gregor  case Type:
336ba68eca7582a62e3e2ff4b0eba1b2b73a6b80895Douglas Gregor    return getAsType()->getAs<PackExpansionType>()->getPattern();
337ba68eca7582a62e3e2ff4b0eba1b2b73a6b80895Douglas Gregor
338ba68eca7582a62e3e2ff4b0eba1b2b73a6b80895Douglas Gregor  case Expression:
339ba68eca7582a62e3e2ff4b0eba1b2b73a6b80895Douglas Gregor    return cast<PackExpansionExpr>(getAsExpr())->getPattern();
340ba68eca7582a62e3e2ff4b0eba1b2b73a6b80895Douglas Gregor
341a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor  case TemplateExpansion:
3422be29f423acad3bbe39099a78db2805acb5bdf17Douglas Gregor    return TemplateArgument(getAsTemplateOrTemplatePattern());
343d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman
344ba68eca7582a62e3e2ff4b0eba1b2b73a6b80895Douglas Gregor  case Declaration:
345ba68eca7582a62e3e2ff4b0eba1b2b73a6b80895Douglas Gregor  case Integral:
346ba68eca7582a62e3e2ff4b0eba1b2b73a6b80895Douglas Gregor  case Pack:
347ba68eca7582a62e3e2ff4b0eba1b2b73a6b80895Douglas Gregor  case Null:
348a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor  case Template:
349d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman  case NullPtr:
350ba68eca7582a62e3e2ff4b0eba1b2b73a6b80895Douglas Gregor    return TemplateArgument();
351e02e26293cf8e3bad1059b39cea75c6582896da6Douglas Gregor  }
3523026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie
3533026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  llvm_unreachable("Invalid TemplateArgument Kind!");
354e02e26293cf8e3bad1059b39cea75c6582896da6Douglas Gregor}
355e02e26293cf8e3bad1059b39cea75c6582896da6Douglas Gregor
35687dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregorvoid TemplateArgument::print(const PrintingPolicy &Policy,
3575f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                             raw_ostream &Out) const {
35887dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor  switch (getKind()) {
35987dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor  case Null:
360651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    Out << "(no value)";
36187dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor    break;
36287dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor
36387dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor  case Type: {
364e559ca1672ecef59345a928af0a6809b09282d2cDouglas Gregor    PrintingPolicy SubPolicy(Policy);
365e559ca1672ecef59345a928af0a6809b09282d2cDouglas Gregor    SubPolicy.SuppressStrongLifetime = true;
3665eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer    getAsType().print(Out, SubPolicy);
36787dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor    break;
36887dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor  }
36987dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor
37087dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor  case Declaration: {
371d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman    NamedDecl *ND = cast<NamedDecl>(getAsDecl());
372f1e08ac58e72257f0e50e9bda1f1f232ed823ce2David Blaikie    Out << '&';
373d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman    if (ND->getDeclName()) {
374d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman      // FIXME: distinguish between pointer and reference args?
375f1e08ac58e72257f0e50e9bda1f1f232ed823ce2David Blaikie      ND->printQualifiedName(Out);
376d2008e2c80d6c9282044ec873a937a17a0f33579Douglas Gregor    } else {
377651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      Out << "(anonymous)";
37887dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor    }
37987dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor    break;
38087dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor  }
381d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman
382abd5fa28199bab926ae983afa511e5a195ac131aAbramo Bagnara  case NullPtr:
383d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman    Out << "nullptr";
384abd5fa28199bab926ae983afa511e5a195ac131aAbramo Bagnara    break;
385d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman
386a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor  case Template:
38787dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor    getAsTemplate().print(Out, Policy);
38887dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor    break;
389a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor
390a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor  case TemplateExpansion:
391a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor    getAsTemplateOrTemplatePattern().print(Out, Policy);
392a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor    Out << "...";
393a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor    break;
394a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor
39587dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor  case Integral: {
3960e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    printIntegral(*this, Out, Policy);
39787dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor    break;
39887dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor  }
39987dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor
400ba68eca7582a62e3e2ff4b0eba1b2b73a6b80895Douglas Gregor  case Expression:
4016bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    getAsExpr()->printPretty(Out, nullptr, Policy);
40287dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor    break;
40387dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor
40487dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor  case Pack:
40587dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor    Out << "<";
40687dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor    bool First = true;
407176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    for (const auto &P : pack_elements()) {
40887dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor      if (First)
40987dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor        First = false;
41087dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor      else
41187dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor        Out << ", ";
41287dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor
413176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      P.print(Policy, Out);
41487dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor    }
41587dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor    Out << ">";
41687dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor    break;
41787dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor  }
41887dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor}
41987dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor
420833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall//===----------------------------------------------------------------------===//
421833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall// TemplateArgumentLoc Implementation
422833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall//===----------------------------------------------------------------------===//
423833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
424b0ddf3aeb2f119cac42468b029584e8839b354ccDouglas GregorTemplateArgumentLocInfo::TemplateArgumentLocInfo() {
42575c4064932d481ac710a80aa88b3370ad8a6af1dChandler Carruth  memset((void*)this, 0, sizeof(TemplateArgumentLocInfo));
426b0ddf3aeb2f119cac42468b029584e8839b354ccDouglas Gregor}
427b0ddf3aeb2f119cac42468b029584e8839b354ccDouglas Gregor
428828bff2079b6a91ecd7ed5b842c59527d7682789John McCallSourceRange TemplateArgumentLoc::getSourceRange() const {
429833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  switch (Argument.getKind()) {
430833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Expression:
431828bff2079b6a91ecd7ed5b842c59527d7682789John McCall    return getSourceExpression()->getSourceRange();
432f38ef0c63a39306e835a91fd989cf30182a592e2Zhanyong Wan
433833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Declaration:
434828bff2079b6a91ecd7ed5b842c59527d7682789John McCall    return getSourceDeclExpression()->getSourceRange();
435f38ef0c63a39306e835a91fd989cf30182a592e2Zhanyong Wan
436d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman  case TemplateArgument::NullPtr:
437d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman    return getSourceNullPtrExpression()->getSourceRange();
438d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman
439828bff2079b6a91ecd7ed5b842c59527d7682789John McCall  case TemplateArgument::Type:
440f38ef0c63a39306e835a91fd989cf30182a592e2Zhanyong Wan    if (TypeSourceInfo *TSI = getTypeSourceInfo())
441f38ef0c63a39306e835a91fd989cf30182a592e2Zhanyong Wan      return TSI->getTypeLoc().getSourceRange();
442f38ef0c63a39306e835a91fd989cf30182a592e2Zhanyong Wan    else
443f38ef0c63a39306e835a91fd989cf30182a592e2Zhanyong Wan      return SourceRange();
444f38ef0c63a39306e835a91fd989cf30182a592e2Zhanyong Wan
445a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor  case TemplateArgument::Template:
446b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor    if (getTemplateQualifierLoc())
447b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor      return SourceRange(getTemplateQualifierLoc().getBeginLoc(),
448a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor                         getTemplateNameLoc());
449a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor    return SourceRange(getTemplateNameLoc());
450a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor
451a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor  case TemplateArgument::TemplateExpansion:
452b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor    if (getTemplateQualifierLoc())
453b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor      return SourceRange(getTemplateQualifierLoc().getBeginLoc(),
454a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor                         getTemplateEllipsisLoc());
455a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor    return SourceRange(getTemplateNameLoc(), getTemplateEllipsisLoc());
456a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor
457833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Integral:
458d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman    return getSourceIntegralExpression()->getSourceRange();
459d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman
460833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Pack:
461833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Null:
462828bff2079b6a91ecd7ed5b842c59527d7682789John McCall    return SourceRange();
463833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  }
464833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
4653026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  llvm_unreachable("Invalid TemplateArgument Kind!");
466833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall}
467a933319ebf754396623165f9dc0a29c2a48879f5Douglas Gregor
468a933319ebf754396623165f9dc0a29c2a48879f5Douglas Gregorconst DiagnosticBuilder &clang::operator<<(const DiagnosticBuilder &DB,
469a933319ebf754396623165f9dc0a29c2a48879f5Douglas Gregor                                           const TemplateArgument &Arg) {
470a933319ebf754396623165f9dc0a29c2a48879f5Douglas Gregor  switch (Arg.getKind()) {
471a933319ebf754396623165f9dc0a29c2a48879f5Douglas Gregor  case TemplateArgument::Null:
47267c4a0ca65dd72784a1778264938c8ba45506ceaJohn McCall    // This is bad, but not as bad as crashing because of argument
47367c4a0ca65dd72784a1778264938c8ba45506ceaJohn McCall    // count mismatches.
47467c4a0ca65dd72784a1778264938c8ba45506ceaJohn McCall    return DB << "(null template argument)";
475a933319ebf754396623165f9dc0a29c2a48879f5Douglas Gregor
476a933319ebf754396623165f9dc0a29c2a48879f5Douglas Gregor  case TemplateArgument::Type:
477a933319ebf754396623165f9dc0a29c2a48879f5Douglas Gregor    return DB << Arg.getAsType();
478a933319ebf754396623165f9dc0a29c2a48879f5Douglas Gregor
479a933319ebf754396623165f9dc0a29c2a48879f5Douglas Gregor  case TemplateArgument::Declaration:
480d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman    return DB << Arg.getAsDecl();
481d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman
482d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman  case TemplateArgument::NullPtr:
483d2008e2c80d6c9282044ec873a937a17a0f33579Douglas Gregor    return DB << "nullptr";
484a933319ebf754396623165f9dc0a29c2a48879f5Douglas Gregor
485a933319ebf754396623165f9dc0a29c2a48879f5Douglas Gregor  case TemplateArgument::Integral:
486855243789cb44799c03f4c7216d3d6308805f549Benjamin Kramer    return DB << Arg.getAsIntegral().toString(10);
487a933319ebf754396623165f9dc0a29c2a48879f5Douglas Gregor
488a933319ebf754396623165f9dc0a29c2a48879f5Douglas Gregor  case TemplateArgument::Template:
489a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor    return DB << Arg.getAsTemplate();
490a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor
491a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor  case TemplateArgument::TemplateExpansion:
492a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor    return DB << Arg.getAsTemplateOrTemplatePattern() << "...";
493a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor
494a933319ebf754396623165f9dc0a29c2a48879f5Douglas Gregor  case TemplateArgument::Expression: {
495a933319ebf754396623165f9dc0a29c2a48879f5Douglas Gregor    // This shouldn't actually ever happen, so it's okay that we're
496a933319ebf754396623165f9dc0a29c2a48879f5Douglas Gregor    // regurgitating an expression here.
497a933319ebf754396623165f9dc0a29c2a48879f5Douglas Gregor    // FIXME: We're guessing at LangOptions!
498f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith    SmallString<32> Str;
499a933319ebf754396623165f9dc0a29c2a48879f5Douglas Gregor    llvm::raw_svector_ostream OS(Str);
500a933319ebf754396623165f9dc0a29c2a48879f5Douglas Gregor    LangOptions LangOpts;
501a933319ebf754396623165f9dc0a29c2a48879f5Douglas Gregor    LangOpts.CPlusPlus = true;
502a933319ebf754396623165f9dc0a29c2a48879f5Douglas Gregor    PrintingPolicy Policy(LangOpts);
5036bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    Arg.getAsExpr()->printPretty(OS, nullptr, Policy);
504a933319ebf754396623165f9dc0a29c2a48879f5Douglas Gregor    return DB << OS.str();
505a933319ebf754396623165f9dc0a29c2a48879f5Douglas Gregor  }
506a933319ebf754396623165f9dc0a29c2a48879f5Douglas Gregor
50787dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor  case TemplateArgument::Pack: {
50887dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor    // FIXME: We're guessing at LangOptions!
509f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith    SmallString<32> Str;
51087dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor    llvm::raw_svector_ostream OS(Str);
51187dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor    LangOptions LangOpts;
51287dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor    LangOpts.CPlusPlus = true;
51387dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor    PrintingPolicy Policy(LangOpts);
51487dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor    Arg.print(Policy, OS);
51587dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor    return DB << OS.str();
51687dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor  }
517a933319ebf754396623165f9dc0a29c2a48879f5Douglas Gregor  }
5183026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie
5193026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  llvm_unreachable("Invalid TemplateArgument Kind!");
520a933319ebf754396623165f9dc0a29c2a48879f5Douglas Gregor}
52171a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis
52271a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidisconst ASTTemplateArgumentListInfo *
52371a7605977113c795edd44fcbd2302ad49506653Argyrios KyrtzidisASTTemplateArgumentListInfo::Create(ASTContext &C,
52471a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis                                    const TemplateArgumentListInfo &List) {
525651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  assert(llvm::alignOf<ASTTemplateArgumentListInfo>() >=
526651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines         llvm::alignOf<TemplateArgumentLoc>());
52797f6026f460c3aaa250fc9dcd7c2b8b6c1f3ba69Richard Smith  std::size_t size = ASTTemplateArgumentListInfo::sizeFor(List.size());
52871a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis  void *Mem = C.Allocate(size, llvm::alignOf<ASTTemplateArgumentListInfo>());
52971a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis  ASTTemplateArgumentListInfo *TAI = new (Mem) ASTTemplateArgumentListInfo();
53071a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis  TAI->initializeFrom(List);
53171a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis  return TAI;
53271a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis}
53371a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis
53471a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidisvoid ASTTemplateArgumentListInfo::initializeFrom(
53571a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis                                      const TemplateArgumentListInfo &Info) {
53671a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis  LAngleLoc = Info.getLAngleLoc();
53771a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis  RAngleLoc = Info.getRAngleLoc();
53871a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis  NumTemplateArgs = Info.size();
53971a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis
54071a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis  TemplateArgumentLoc *ArgBuffer = getTemplateArgs();
54171a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis  for (unsigned i = 0; i != NumTemplateArgs; ++i)
54271a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis    new (&ArgBuffer[i]) TemplateArgumentLoc(Info[i]);
54371a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis}
54471a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis
54571a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidisvoid ASTTemplateArgumentListInfo::initializeFrom(
54671a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis                                          const TemplateArgumentListInfo &Info,
54771a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis                                                  bool &Dependent,
54871a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis                                                  bool &InstantiationDependent,
54971a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis                                       bool &ContainsUnexpandedParameterPack) {
55071a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis  LAngleLoc = Info.getLAngleLoc();
55171a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis  RAngleLoc = Info.getRAngleLoc();
55271a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis  NumTemplateArgs = Info.size();
55371a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis
55471a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis  TemplateArgumentLoc *ArgBuffer = getTemplateArgs();
55571a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis  for (unsigned i = 0; i != NumTemplateArgs; ++i) {
55671a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis    Dependent = Dependent || Info[i].getArgument().isDependent();
55771a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis    InstantiationDependent = InstantiationDependent ||
55871a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis                             Info[i].getArgument().isInstantiationDependent();
55971a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis    ContainsUnexpandedParameterPack
56071a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis      = ContainsUnexpandedParameterPack ||
56171a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis        Info[i].getArgument().containsUnexpandedParameterPack();
56271a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis
56371a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis    new (&ArgBuffer[i]) TemplateArgumentLoc(Info[i]);
56471a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis  }
56571a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis}
56671a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis
56771a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidisvoid ASTTemplateArgumentListInfo::copyInto(
56871a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis                                      TemplateArgumentListInfo &Info) const {
56971a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis  Info.setLAngleLoc(LAngleLoc);
57071a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis  Info.setRAngleLoc(RAngleLoc);
57171a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis  for (unsigned I = 0; I != NumTemplateArgs; ++I)
57271a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis    Info.addArgument(getTemplateArgs()[I]);
57371a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis}
57471a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis
57571a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidisstd::size_t ASTTemplateArgumentListInfo::sizeFor(unsigned NumTemplateArgs) {
57671a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis  return sizeof(ASTTemplateArgumentListInfo) +
57771a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis         sizeof(TemplateArgumentLoc) * NumTemplateArgs;
57871a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis}
57971a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis
580e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnaravoid
581e4b92761b43ced611c417ae478568610f1ad7b1eAbramo BagnaraASTTemplateKWAndArgsInfo::initializeFrom(SourceLocation TemplateKWLoc,
582e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara                                         const TemplateArgumentListInfo &Info) {
583e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara  Base::initializeFrom(Info);
584e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara  setTemplateKeywordLoc(TemplateKWLoc);
585e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara}
586e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara
587e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnaravoid
588e4b92761b43ced611c417ae478568610f1ad7b1eAbramo BagnaraASTTemplateKWAndArgsInfo
589e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara::initializeFrom(SourceLocation TemplateKWLoc,
590e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara                 const TemplateArgumentListInfo &Info,
591e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara                 bool &Dependent,
592e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara                 bool &InstantiationDependent,
593e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara                 bool &ContainsUnexpandedParameterPack) {
594e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara  Base::initializeFrom(Info, Dependent, InstantiationDependent,
595e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara                       ContainsUnexpandedParameterPack);
596e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara  setTemplateKeywordLoc(TemplateKWLoc);
597e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara}
598e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara
599e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnaravoid
600e4b92761b43ced611c417ae478568610f1ad7b1eAbramo BagnaraASTTemplateKWAndArgsInfo::initializeFrom(SourceLocation TemplateKWLoc) {
601e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara  // No explicit template arguments, but template keyword loc is valid.
602e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara  assert(TemplateKWLoc.isValid());
603e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara  LAngleLoc = SourceLocation();
604e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara  RAngleLoc = SourceLocation();
605e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara  NumTemplateArgs = 0;
606e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara  setTemplateKeywordLoc(TemplateKWLoc);
607e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara}
608e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara
609e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnarastd::size_t
610e4b92761b43ced611c417ae478568610f1ad7b1eAbramo BagnaraASTTemplateKWAndArgsInfo::sizeFor(unsigned NumTemplateArgs) {
611e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara  // Add space for the template keyword location.
61297f6026f460c3aaa250fc9dcd7c2b8b6c1f3ba69Richard Smith  // FIXME: There's room for this in the padding before the template args in
61397f6026f460c3aaa250fc9dcd7c2b8b6c1f3ba69Richard Smith  //        64-bit builds.
614e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara  return Base::sizeFor(NumTemplateArgs) + sizeof(SourceLocation);
61571a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis}
616