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.
36781701c3d34740c53ad912ad007383ae2951c637Chandler Carruthstatic void printIntegral(const TemplateArgument &TemplArg,
375f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                          raw_ostream &Out) {
38781701c3d34740c53ad912ad007383ae2951c637Chandler Carruth  const ::clang::Type *T = TemplArg.getIntegralType().getTypePtr();
39855243789cb44799c03f4c7216d3d6308805f549Benjamin Kramer  const llvm::APSInt &Val = TemplArg.getAsIntegral();
40781701c3d34740c53ad912ad007383ae2951c637Chandler Carruth
41781701c3d34740c53ad912ad007383ae2951c637Chandler Carruth  if (T->isBooleanType()) {
42855243789cb44799c03f4c7216d3d6308805f549Benjamin Kramer    Out << (Val.getBoolValue() ? "true" : "false");
43781701c3d34740c53ad912ad007383ae2951c637Chandler Carruth  } else if (T->isCharType()) {
44855243789cb44799c03f4c7216d3d6308805f549Benjamin Kramer    const char Ch = Val.getZExtValue();
45774e2b4f8d23d75cbb3dfef077d4631d37f623c0Chandler Carruth    Out << ((Ch == '\'') ? "'\\" : "'");
468fe83e1df954d72c0f4ffc15d20a5222ec151c21Benjamin Kramer    Out.write_escaped(StringRef(&Ch, 1), /*UseHexEscapes=*/ true);
47774e2b4f8d23d75cbb3dfef077d4631d37f623c0Chandler Carruth    Out << "'";
48781701c3d34740c53ad912ad007383ae2951c637Chandler Carruth  } else {
49855243789cb44799c03f4c7216d3d6308805f549Benjamin Kramer    Out << Val;
50781701c3d34740c53ad912ad007383ae2951c637Chandler Carruth  }
51781701c3d34740c53ad912ad007383ae2951c637Chandler Carruth}
52781701c3d34740c53ad912ad007383ae2951c637Chandler Carruth
53275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall//===----------------------------------------------------------------------===//
54275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall// TemplateArgument Implementation
55275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall//===----------------------------------------------------------------------===//
56275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall
57855243789cb44799c03f4c7216d3d6308805f549Benjamin KramerTemplateArgument::TemplateArgument(ASTContext &Ctx, const llvm::APSInt &Value,
58c0afea9495ba535ac5de07c32b68a5559622737eEli Friedman                                   QualType Type) {
59c0afea9495ba535ac5de07c32b68a5559622737eEli Friedman  Integer.Kind = Integral;
60855243789cb44799c03f4c7216d3d6308805f549Benjamin Kramer  // Copy the APSInt value into our decomposed form.
61855243789cb44799c03f4c7216d3d6308805f549Benjamin Kramer  Integer.BitWidth = Value.getBitWidth();
62855243789cb44799c03f4c7216d3d6308805f549Benjamin Kramer  Integer.IsUnsigned = Value.isUnsigned();
63855243789cb44799c03f4c7216d3d6308805f549Benjamin Kramer  // If the value is large, we have to get additional memory from the ASTContext
64b8e54cd26cc71075456a74be054a95fa1f2e28adBenjamin Kramer  unsigned NumWords = Value.getNumWords();
65b8e54cd26cc71075456a74be054a95fa1f2e28adBenjamin Kramer  if (NumWords > 1) {
66b8e54cd26cc71075456a74be054a95fa1f2e28adBenjamin Kramer    void *Mem = Ctx.Allocate(NumWords * sizeof(uint64_t));
67b8e54cd26cc71075456a74be054a95fa1f2e28adBenjamin Kramer    std::memcpy(Mem, Value.getRawData(), NumWords * sizeof(uint64_t));
68855243789cb44799c03f4c7216d3d6308805f549Benjamin Kramer    Integer.pVal = static_cast<uint64_t *>(Mem);
69855243789cb44799c03f4c7216d3d6308805f549Benjamin Kramer  } else {
70855243789cb44799c03f4c7216d3d6308805f549Benjamin Kramer    Integer.VAL = Value.getZExtValue();
71855243789cb44799c03f4c7216d3d6308805f549Benjamin Kramer  }
72855243789cb44799c03f4c7216d3d6308805f549Benjamin Kramer
73855243789cb44799c03f4c7216d3d6308805f549Benjamin Kramer  Integer.Type = Type.getAsOpaquePtr();
74855243789cb44799c03f4c7216d3d6308805f549Benjamin Kramer}
75855243789cb44799c03f4c7216d3d6308805f549Benjamin Kramer
76203e6a322ae29d577acafcb1572a57ec16e1e730Douglas GregorTemplateArgument TemplateArgument::CreatePackCopy(ASTContext &Context,
77203e6a322ae29d577acafcb1572a57ec16e1e730Douglas Gregor                                                  const TemplateArgument *Args,
78203e6a322ae29d577acafcb1572a57ec16e1e730Douglas Gregor                                                  unsigned NumArgs) {
79203e6a322ae29d577acafcb1572a57ec16e1e730Douglas Gregor  if (NumArgs == 0)
80d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman    return getEmptyPack();
81203e6a322ae29d577acafcb1572a57ec16e1e730Douglas Gregor
82203e6a322ae29d577acafcb1572a57ec16e1e730Douglas Gregor  TemplateArgument *Storage = new (Context) TemplateArgument [NumArgs];
83203e6a322ae29d577acafcb1572a57ec16e1e730Douglas Gregor  std::copy(Args, Args + NumArgs, Storage);
84203e6a322ae29d577acafcb1572a57ec16e1e730Douglas Gregor  return TemplateArgument(Storage, NumArgs);
85203e6a322ae29d577acafcb1572a57ec16e1e730Douglas Gregor}
86203e6a322ae29d577acafcb1572a57ec16e1e730Douglas Gregor
87bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregorbool TemplateArgument::isDependent() const {
88bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  switch (getKind()) {
89bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  case Null:
90b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie    llvm_unreachable("Should not have a NULL template argument");
91bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor
92bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  case Type:
93bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    return getAsType()->isDependentType();
94bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor
95bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  case Template:
96bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    return getAsTemplate().isDependent();
97a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor
98a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor  case TemplateExpansion:
99a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor    return true;
100a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor
101bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  case Declaration:
102d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman    if (DeclContext *DC = dyn_cast<DeclContext>(getAsDecl()))
103d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman      return DC->isDependentContext();
104d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman    return getAsDecl()->getDeclContext()->isDependentContext();
105d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman
106d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman  case NullPtr:
107d2008e2c80d6c9282044ec873a937a17a0f33579Douglas Gregor    return false;
108bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor
109bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  case Integral:
110bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    // Never dependent
111bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    return false;
112bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor
113bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  case Expression:
114bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    return (getAsExpr()->isTypeDependent() || getAsExpr()->isValueDependent());
115bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor
116bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  case Pack:
117bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    for (pack_iterator P = pack_begin(), PEnd = pack_end(); P != PEnd; ++P) {
118bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor      if (P->isDependent())
119bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor        return true;
120bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    }
121bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor
122bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor    return false;
123bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor  }
124bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor
1253026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  llvm_unreachable("Invalid TemplateArgument Kind!");
126bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor}
127bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor
128561f81243f665cf2001caadc45df505f826b72d6Douglas Gregorbool TemplateArgument::isInstantiationDependent() const {
129561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor  switch (getKind()) {
130561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor  case Null:
131b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie    llvm_unreachable("Should not have a NULL template argument");
132561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor
133561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor  case Type:
134561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor    return getAsType()->isInstantiationDependentType();
135561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor
136561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor  case Template:
137561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor    return getAsTemplate().isInstantiationDependent();
138561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor
139561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor  case TemplateExpansion:
140561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor    return true;
141561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor
142561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor  case Declaration:
143d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman    if (DeclContext *DC = dyn_cast<DeclContext>(getAsDecl()))
144d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman      return DC->isDependentContext();
145d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman    return getAsDecl()->getDeclContext()->isDependentContext();
146d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman
147d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman  case NullPtr:
148d2008e2c80d6c9282044ec873a937a17a0f33579Douglas Gregor    return false;
149d2008e2c80d6c9282044ec873a937a17a0f33579Douglas Gregor
150561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor  case Integral:
151561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor    // Never dependent
152561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor    return false;
153561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor
154561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor  case Expression:
155561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor    return getAsExpr()->isInstantiationDependent();
156561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor
157561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor  case Pack:
158561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor    for (pack_iterator P = pack_begin(), PEnd = pack_end(); P != PEnd; ++P) {
159561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor      if (P->isInstantiationDependent())
160561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor        return true;
161561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor    }
162561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor
163561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor    return false;
164561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor  }
1653026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie
1663026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  llvm_unreachable("Invalid TemplateArgument Kind!");
167561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor}
168561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor
1698491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregorbool TemplateArgument::isPackExpansion() const {
1708491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor  switch (getKind()) {
1718491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor  case Null:
1728491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor  case Declaration:
1738491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor  case Integral:
1748491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor  case Pack:
175a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor  case Template:
176d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman  case NullPtr:
1778491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor    return false;
1788491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor
179a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor  case TemplateExpansion:
180a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor    return true;
181a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor
1828491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor  case Type:
183be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor    return isa<PackExpansionType>(getAsType());
184a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor
1858491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor  case Expression:
186be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor    return isa<PackExpansionExpr>(getAsExpr());
1878491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor  }
1883026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie
1893026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  llvm_unreachable("Invalid TemplateArgument Kind!");
1908491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor}
1918491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor
192d0937224f383c7cc72c947119380f9713a070c73Douglas Gregorbool TemplateArgument::containsUnexpandedParameterPack() const {
193d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor  switch (getKind()) {
194d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor  case Null:
195d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor  case Declaration:
196d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor  case Integral:
197a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor  case TemplateExpansion:
198d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman  case NullPtr:
199d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor    break;
200d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor
201d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor  case Type:
202d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor    if (getAsType()->containsUnexpandedParameterPack())
203d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor      return true;
204d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor    break;
205d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor
206d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor  case Template:
207a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor    if (getAsTemplate().containsUnexpandedParameterPack())
208d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor      return true;
209d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor    break;
210d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor
211d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor  case Expression:
212d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor    if (getAsExpr()->containsUnexpandedParameterPack())
213d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor      return true;
214d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor    break;
215d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor
216d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor  case Pack:
217d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor    for (pack_iterator P = pack_begin(), PEnd = pack_end(); P != PEnd; ++P)
218d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor      if (P->containsUnexpandedParameterPack())
219d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor        return true;
220d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor
221d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor    break;
222d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor  }
223d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor
224d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor  return false;
225d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor}
226d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor
227dc84cd5efdd3430efb22546b4ac656aa0540b210David BlaikieOptional<unsigned> TemplateArgument::getNumTemplateExpansions() const {
228c0afea9495ba535ac5de07c32b68a5559622737eEli Friedman  assert(getKind() == TemplateExpansion);
2292be29f423acad3bbe39099a78db2805acb5bdf17Douglas Gregor  if (TemplateArg.NumExpansions)
2302be29f423acad3bbe39099a78db2805acb5bdf17Douglas Gregor    return TemplateArg.NumExpansions - 1;
2312be29f423acad3bbe39099a78db2805acb5bdf17Douglas Gregor
23266874fb18afbffb8b2ca05576851a64534be3352David Blaikie  return None;
2332be29f423acad3bbe39099a78db2805acb5bdf17Douglas Gregor}
2342be29f423acad3bbe39099a78db2805acb5bdf17Douglas Gregor
235275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCallvoid TemplateArgument::Profile(llvm::FoldingSetNodeID &ID,
2364ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                               const ASTContext &Context) const {
237c0afea9495ba535ac5de07c32b68a5559622737eEli Friedman  ID.AddInteger(getKind());
238c0afea9495ba535ac5de07c32b68a5559622737eEli Friedman  switch (getKind()) {
239275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall  case Null:
240275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall    break;
241275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall
242275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall  case Type:
243275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall    getAsType().Profile(ID);
244275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall    break;
245275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall
246c0afea9495ba535ac5de07c32b68a5559622737eEli Friedman  case NullPtr:
247c0afea9495ba535ac5de07c32b68a5559622737eEli Friedman    getNullPtrType().Profile(ID);
248c0afea9495ba535ac5de07c32b68a5559622737eEli Friedman    break;
249c0afea9495ba535ac5de07c32b68a5559622737eEli Friedman
250275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall  case Declaration:
2516bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    ID.AddPointer(getAsDecl()? getAsDecl()->getCanonicalDecl() : nullptr);
252275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall    break;
253275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall
254788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor  case Template:
255a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor  case TemplateExpansion: {
256a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor    TemplateName Template = getAsTemplateOrTemplatePattern();
25774295b3408178bd0e97c2090dac911817778b582Douglas Gregor    if (TemplateTemplateParmDecl *TTP
25874295b3408178bd0e97c2090dac911817778b582Douglas Gregor          = dyn_cast_or_null<TemplateTemplateParmDecl>(
259a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor                                                Template.getAsTemplateDecl())) {
26074295b3408178bd0e97c2090dac911817778b582Douglas Gregor      ID.AddBoolean(true);
26174295b3408178bd0e97c2090dac911817778b582Douglas Gregor      ID.AddInteger(TTP->getDepth());
26274295b3408178bd0e97c2090dac911817778b582Douglas Gregor      ID.AddInteger(TTP->getPosition());
263ba68eca7582a62e3e2ff4b0eba1b2b73a6b80895Douglas Gregor      ID.AddBoolean(TTP->isParameterPack());
26474295b3408178bd0e97c2090dac911817778b582Douglas Gregor    } else {
26574295b3408178bd0e97c2090dac911817778b582Douglas Gregor      ID.AddBoolean(false);
266a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor      ID.AddPointer(Context.getCanonicalTemplateName(Template)
267a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor                                                          .getAsVoidPointer());
26874295b3408178bd0e97c2090dac911817778b582Douglas Gregor    }
269788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor    break;
270a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor  }
271788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor
272275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall  case Integral:
273855243789cb44799c03f4c7216d3d6308805f549Benjamin Kramer    getAsIntegral().Profile(ID);
274275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall    getIntegralType().Profile(ID);
275275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall    break;
276275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall
277275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall  case Expression:
278275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall    getAsExpr()->Profile(ID, Context, true);
279275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall    break;
280275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall
281275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall  case Pack:
282275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall    ID.AddInteger(Args.NumArgs);
283275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall    for (unsigned I = 0; I != Args.NumArgs; ++I)
284275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall      Args.Args[I].Profile(ID, Context);
285275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall  }
286275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall}
287833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
28833500955d731c73717af52088b7fc0e7a85681e7John McCallbool TemplateArgument::structurallyEquals(const TemplateArgument &Other) const {
28933500955d731c73717af52088b7fc0e7a85681e7John McCall  if (getKind() != Other.getKind()) return false;
29033500955d731c73717af52088b7fc0e7a85681e7John McCall
29133500955d731c73717af52088b7fc0e7a85681e7John McCall  switch (getKind()) {
29233500955d731c73717af52088b7fc0e7a85681e7John McCall  case Null:
29333500955d731c73717af52088b7fc0e7a85681e7John McCall  case Type:
294a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor  case Expression:
295a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor  case Template:
296a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor  case TemplateExpansion:
297d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman  case NullPtr:
298c0afea9495ba535ac5de07c32b68a5559622737eEli Friedman    return TypeOrValue.V == Other.TypeOrValue.V;
29933500955d731c73717af52088b7fc0e7a85681e7John McCall
300d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman  case Declaration:
301d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman    return getAsDecl() == Other.getAsDecl() &&
302d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman           isDeclForReferenceParam() && Other.isDeclForReferenceParam();
303d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman
30433500955d731c73717af52088b7fc0e7a85681e7John McCall  case Integral:
30533500955d731c73717af52088b7fc0e7a85681e7John McCall    return getIntegralType() == Other.getIntegralType() &&
306855243789cb44799c03f4c7216d3d6308805f549Benjamin Kramer           getAsIntegral() == Other.getAsIntegral();
30733500955d731c73717af52088b7fc0e7a85681e7John McCall
30833500955d731c73717af52088b7fc0e7a85681e7John McCall  case Pack:
30933500955d731c73717af52088b7fc0e7a85681e7John McCall    if (Args.NumArgs != Other.Args.NumArgs) return false;
31033500955d731c73717af52088b7fc0e7a85681e7John McCall    for (unsigned I = 0, E = Args.NumArgs; I != E; ++I)
31133500955d731c73717af52088b7fc0e7a85681e7John McCall      if (!Args.Args[I].structurallyEquals(Other.Args.Args[I]))
31233500955d731c73717af52088b7fc0e7a85681e7John McCall        return false;
31333500955d731c73717af52088b7fc0e7a85681e7John McCall    return true;
31433500955d731c73717af52088b7fc0e7a85681e7John McCall  }
31533500955d731c73717af52088b7fc0e7a85681e7John McCall
3163026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  llvm_unreachable("Invalid TemplateArgument Kind!");
31733500955d731c73717af52088b7fc0e7a85681e7John McCall}
31833500955d731c73717af52088b7fc0e7a85681e7John McCall
319e02e26293cf8e3bad1059b39cea75c6582896da6Douglas GregorTemplateArgument TemplateArgument::getPackExpansionPattern() const {
320e02e26293cf8e3bad1059b39cea75c6582896da6Douglas Gregor  assert(isPackExpansion());
321e02e26293cf8e3bad1059b39cea75c6582896da6Douglas Gregor
322e02e26293cf8e3bad1059b39cea75c6582896da6Douglas Gregor  switch (getKind()) {
323ba68eca7582a62e3e2ff4b0eba1b2b73a6b80895Douglas Gregor  case Type:
324ba68eca7582a62e3e2ff4b0eba1b2b73a6b80895Douglas Gregor    return getAsType()->getAs<PackExpansionType>()->getPattern();
325ba68eca7582a62e3e2ff4b0eba1b2b73a6b80895Douglas Gregor
326ba68eca7582a62e3e2ff4b0eba1b2b73a6b80895Douglas Gregor  case Expression:
327ba68eca7582a62e3e2ff4b0eba1b2b73a6b80895Douglas Gregor    return cast<PackExpansionExpr>(getAsExpr())->getPattern();
328ba68eca7582a62e3e2ff4b0eba1b2b73a6b80895Douglas Gregor
329a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor  case TemplateExpansion:
3302be29f423acad3bbe39099a78db2805acb5bdf17Douglas Gregor    return TemplateArgument(getAsTemplateOrTemplatePattern());
331d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman
332ba68eca7582a62e3e2ff4b0eba1b2b73a6b80895Douglas Gregor  case Declaration:
333ba68eca7582a62e3e2ff4b0eba1b2b73a6b80895Douglas Gregor  case Integral:
334ba68eca7582a62e3e2ff4b0eba1b2b73a6b80895Douglas Gregor  case Pack:
335ba68eca7582a62e3e2ff4b0eba1b2b73a6b80895Douglas Gregor  case Null:
336a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor  case Template:
337d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman  case NullPtr:
338ba68eca7582a62e3e2ff4b0eba1b2b73a6b80895Douglas Gregor    return TemplateArgument();
339e02e26293cf8e3bad1059b39cea75c6582896da6Douglas Gregor  }
3403026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie
3413026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  llvm_unreachable("Invalid TemplateArgument Kind!");
342e02e26293cf8e3bad1059b39cea75c6582896da6Douglas Gregor}
343e02e26293cf8e3bad1059b39cea75c6582896da6Douglas Gregor
34487dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregorvoid TemplateArgument::print(const PrintingPolicy &Policy,
3455f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                             raw_ostream &Out) const {
34687dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor  switch (getKind()) {
34787dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor  case Null:
348651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    Out << "(no value)";
34987dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor    break;
35087dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor
35187dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor  case Type: {
352e559ca1672ecef59345a928af0a6809b09282d2cDouglas Gregor    PrintingPolicy SubPolicy(Policy);
353e559ca1672ecef59345a928af0a6809b09282d2cDouglas Gregor    SubPolicy.SuppressStrongLifetime = true;
3545eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer    getAsType().print(Out, SubPolicy);
35587dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor    break;
35687dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor  }
35787dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor
35887dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor  case Declaration: {
359d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman    NamedDecl *ND = cast<NamedDecl>(getAsDecl());
360f1e08ac58e72257f0e50e9bda1f1f232ed823ce2David Blaikie    Out << '&';
361d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman    if (ND->getDeclName()) {
362d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman      // FIXME: distinguish between pointer and reference args?
363f1e08ac58e72257f0e50e9bda1f1f232ed823ce2David Blaikie      ND->printQualifiedName(Out);
364d2008e2c80d6c9282044ec873a937a17a0f33579Douglas Gregor    } else {
365651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      Out << "(anonymous)";
36687dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor    }
36787dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor    break;
36887dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor  }
369d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman
370abd5fa28199bab926ae983afa511e5a195ac131aAbramo Bagnara  case NullPtr:
371d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman    Out << "nullptr";
372abd5fa28199bab926ae983afa511e5a195ac131aAbramo Bagnara    break;
373d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman
374a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor  case Template:
37587dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor    getAsTemplate().print(Out, Policy);
37687dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor    break;
377a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor
378a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor  case TemplateExpansion:
379a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor    getAsTemplateOrTemplatePattern().print(Out, Policy);
380a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor    Out << "...";
381a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor    break;
382a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor
38387dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor  case Integral: {
384781701c3d34740c53ad912ad007383ae2951c637Chandler Carruth    printIntegral(*this, Out);
38587dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor    break;
38687dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor  }
38787dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor
388ba68eca7582a62e3e2ff4b0eba1b2b73a6b80895Douglas Gregor  case Expression:
3896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    getAsExpr()->printPretty(Out, nullptr, Policy);
39087dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor    break;
39187dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor
39287dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor  case Pack:
39387dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor    Out << "<";
39487dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor    bool First = true;
39587dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor    for (TemplateArgument::pack_iterator P = pack_begin(), PEnd = pack_end();
39687dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor         P != PEnd; ++P) {
39787dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor      if (First)
39887dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor        First = false;
39987dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor      else
40087dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor        Out << ", ";
40187dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor
40287dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor      P->print(Policy, Out);
40387dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor    }
40487dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor    Out << ">";
40587dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor    break;
40687dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor  }
40787dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor}
40887dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor
409833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall//===----------------------------------------------------------------------===//
410833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall// TemplateArgumentLoc Implementation
411833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall//===----------------------------------------------------------------------===//
412833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
413b0ddf3aeb2f119cac42468b029584e8839b354ccDouglas GregorTemplateArgumentLocInfo::TemplateArgumentLocInfo() {
41475c4064932d481ac710a80aa88b3370ad8a6af1dChandler Carruth  memset((void*)this, 0, sizeof(TemplateArgumentLocInfo));
415b0ddf3aeb2f119cac42468b029584e8839b354ccDouglas Gregor}
416b0ddf3aeb2f119cac42468b029584e8839b354ccDouglas Gregor
417828bff2079b6a91ecd7ed5b842c59527d7682789John McCallSourceRange TemplateArgumentLoc::getSourceRange() const {
418833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  switch (Argument.getKind()) {
419833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Expression:
420828bff2079b6a91ecd7ed5b842c59527d7682789John McCall    return getSourceExpression()->getSourceRange();
421f38ef0c63a39306e835a91fd989cf30182a592e2Zhanyong Wan
422833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Declaration:
423828bff2079b6a91ecd7ed5b842c59527d7682789John McCall    return getSourceDeclExpression()->getSourceRange();
424f38ef0c63a39306e835a91fd989cf30182a592e2Zhanyong Wan
425d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman  case TemplateArgument::NullPtr:
426d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman    return getSourceNullPtrExpression()->getSourceRange();
427d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman
428828bff2079b6a91ecd7ed5b842c59527d7682789John McCall  case TemplateArgument::Type:
429f38ef0c63a39306e835a91fd989cf30182a592e2Zhanyong Wan    if (TypeSourceInfo *TSI = getTypeSourceInfo())
430f38ef0c63a39306e835a91fd989cf30182a592e2Zhanyong Wan      return TSI->getTypeLoc().getSourceRange();
431f38ef0c63a39306e835a91fd989cf30182a592e2Zhanyong Wan    else
432f38ef0c63a39306e835a91fd989cf30182a592e2Zhanyong Wan      return SourceRange();
433f38ef0c63a39306e835a91fd989cf30182a592e2Zhanyong Wan
434a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor  case TemplateArgument::Template:
435b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor    if (getTemplateQualifierLoc())
436b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor      return SourceRange(getTemplateQualifierLoc().getBeginLoc(),
437a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor                         getTemplateNameLoc());
438a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor    return SourceRange(getTemplateNameLoc());
439a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor
440a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor  case TemplateArgument::TemplateExpansion:
441b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor    if (getTemplateQualifierLoc())
442b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor      return SourceRange(getTemplateQualifierLoc().getBeginLoc(),
443a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor                         getTemplateEllipsisLoc());
444a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor    return SourceRange(getTemplateNameLoc(), getTemplateEllipsisLoc());
445a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor
446833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Integral:
447d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman    return getSourceIntegralExpression()->getSourceRange();
448d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman
449833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Pack:
450833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  case TemplateArgument::Null:
451828bff2079b6a91ecd7ed5b842c59527d7682789John McCall    return SourceRange();
452833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  }
453833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
4543026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  llvm_unreachable("Invalid TemplateArgument Kind!");
455833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall}
456a933319ebf754396623165f9dc0a29c2a48879f5Douglas Gregor
457a933319ebf754396623165f9dc0a29c2a48879f5Douglas Gregorconst DiagnosticBuilder &clang::operator<<(const DiagnosticBuilder &DB,
458a933319ebf754396623165f9dc0a29c2a48879f5Douglas Gregor                                           const TemplateArgument &Arg) {
459a933319ebf754396623165f9dc0a29c2a48879f5Douglas Gregor  switch (Arg.getKind()) {
460a933319ebf754396623165f9dc0a29c2a48879f5Douglas Gregor  case TemplateArgument::Null:
46167c4a0ca65dd72784a1778264938c8ba45506ceaJohn McCall    // This is bad, but not as bad as crashing because of argument
46267c4a0ca65dd72784a1778264938c8ba45506ceaJohn McCall    // count mismatches.
46367c4a0ca65dd72784a1778264938c8ba45506ceaJohn McCall    return DB << "(null template argument)";
464a933319ebf754396623165f9dc0a29c2a48879f5Douglas Gregor
465a933319ebf754396623165f9dc0a29c2a48879f5Douglas Gregor  case TemplateArgument::Type:
466a933319ebf754396623165f9dc0a29c2a48879f5Douglas Gregor    return DB << Arg.getAsType();
467a933319ebf754396623165f9dc0a29c2a48879f5Douglas Gregor
468a933319ebf754396623165f9dc0a29c2a48879f5Douglas Gregor  case TemplateArgument::Declaration:
469d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman    return DB << Arg.getAsDecl();
470d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman
471d7a6b1640e565487d163023a6a2e83f55476ae96Eli Friedman  case TemplateArgument::NullPtr:
472d2008e2c80d6c9282044ec873a937a17a0f33579Douglas Gregor    return DB << "nullptr";
473a933319ebf754396623165f9dc0a29c2a48879f5Douglas Gregor
474a933319ebf754396623165f9dc0a29c2a48879f5Douglas Gregor  case TemplateArgument::Integral:
475855243789cb44799c03f4c7216d3d6308805f549Benjamin Kramer    return DB << Arg.getAsIntegral().toString(10);
476a933319ebf754396623165f9dc0a29c2a48879f5Douglas Gregor
477a933319ebf754396623165f9dc0a29c2a48879f5Douglas Gregor  case TemplateArgument::Template:
478a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor    return DB << Arg.getAsTemplate();
479a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor
480a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor  case TemplateArgument::TemplateExpansion:
481a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor    return DB << Arg.getAsTemplateOrTemplatePattern() << "...";
482a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor
483a933319ebf754396623165f9dc0a29c2a48879f5Douglas Gregor  case TemplateArgument::Expression: {
484a933319ebf754396623165f9dc0a29c2a48879f5Douglas Gregor    // This shouldn't actually ever happen, so it's okay that we're
485a933319ebf754396623165f9dc0a29c2a48879f5Douglas Gregor    // regurgitating an expression here.
486a933319ebf754396623165f9dc0a29c2a48879f5Douglas Gregor    // FIXME: We're guessing at LangOptions!
487f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith    SmallString<32> Str;
488a933319ebf754396623165f9dc0a29c2a48879f5Douglas Gregor    llvm::raw_svector_ostream OS(Str);
489a933319ebf754396623165f9dc0a29c2a48879f5Douglas Gregor    LangOptions LangOpts;
490a933319ebf754396623165f9dc0a29c2a48879f5Douglas Gregor    LangOpts.CPlusPlus = true;
491a933319ebf754396623165f9dc0a29c2a48879f5Douglas Gregor    PrintingPolicy Policy(LangOpts);
4926bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    Arg.getAsExpr()->printPretty(OS, nullptr, Policy);
493a933319ebf754396623165f9dc0a29c2a48879f5Douglas Gregor    return DB << OS.str();
494a933319ebf754396623165f9dc0a29c2a48879f5Douglas Gregor  }
495a933319ebf754396623165f9dc0a29c2a48879f5Douglas Gregor
49687dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor  case TemplateArgument::Pack: {
49787dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor    // FIXME: We're guessing at LangOptions!
498f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith    SmallString<32> Str;
49987dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor    llvm::raw_svector_ostream OS(Str);
50087dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor    LangOptions LangOpts;
50187dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor    LangOpts.CPlusPlus = true;
50287dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor    PrintingPolicy Policy(LangOpts);
50387dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor    Arg.print(Policy, OS);
50487dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor    return DB << OS.str();
50587dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor  }
506a933319ebf754396623165f9dc0a29c2a48879f5Douglas Gregor  }
5073026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie
5083026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  llvm_unreachable("Invalid TemplateArgument Kind!");
509a933319ebf754396623165f9dc0a29c2a48879f5Douglas Gregor}
51071a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis
51171a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidisconst ASTTemplateArgumentListInfo *
51271a7605977113c795edd44fcbd2302ad49506653Argyrios KyrtzidisASTTemplateArgumentListInfo::Create(ASTContext &C,
51371a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis                                    const TemplateArgumentListInfo &List) {
514651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  assert(llvm::alignOf<ASTTemplateArgumentListInfo>() >=
515651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines         llvm::alignOf<TemplateArgumentLoc>());
51697f6026f460c3aaa250fc9dcd7c2b8b6c1f3ba69Richard Smith  std::size_t size = ASTTemplateArgumentListInfo::sizeFor(List.size());
51771a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis  void *Mem = C.Allocate(size, llvm::alignOf<ASTTemplateArgumentListInfo>());
51871a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis  ASTTemplateArgumentListInfo *TAI = new (Mem) ASTTemplateArgumentListInfo();
51971a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis  TAI->initializeFrom(List);
52071a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis  return TAI;
52171a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis}
52271a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis
52371a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidisvoid ASTTemplateArgumentListInfo::initializeFrom(
52471a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis                                      const TemplateArgumentListInfo &Info) {
52571a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis  LAngleLoc = Info.getLAngleLoc();
52671a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis  RAngleLoc = Info.getRAngleLoc();
52771a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis  NumTemplateArgs = Info.size();
52871a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis
52971a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis  TemplateArgumentLoc *ArgBuffer = getTemplateArgs();
53071a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis  for (unsigned i = 0; i != NumTemplateArgs; ++i)
53171a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis    new (&ArgBuffer[i]) TemplateArgumentLoc(Info[i]);
53271a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis}
53371a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis
53471a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidisvoid ASTTemplateArgumentListInfo::initializeFrom(
53571a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis                                          const TemplateArgumentListInfo &Info,
53671a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis                                                  bool &Dependent,
53771a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis                                                  bool &InstantiationDependent,
53871a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis                                       bool &ContainsUnexpandedParameterPack) {
53971a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis  LAngleLoc = Info.getLAngleLoc();
54071a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis  RAngleLoc = Info.getRAngleLoc();
54171a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis  NumTemplateArgs = Info.size();
54271a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis
54371a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis  TemplateArgumentLoc *ArgBuffer = getTemplateArgs();
54471a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis  for (unsigned i = 0; i != NumTemplateArgs; ++i) {
54571a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis    Dependent = Dependent || Info[i].getArgument().isDependent();
54671a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis    InstantiationDependent = InstantiationDependent ||
54771a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis                             Info[i].getArgument().isInstantiationDependent();
54871a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis    ContainsUnexpandedParameterPack
54971a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis      = ContainsUnexpandedParameterPack ||
55071a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis        Info[i].getArgument().containsUnexpandedParameterPack();
55171a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis
55271a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis    new (&ArgBuffer[i]) TemplateArgumentLoc(Info[i]);
55371a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis  }
55471a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis}
55571a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis
55671a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidisvoid ASTTemplateArgumentListInfo::copyInto(
55771a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis                                      TemplateArgumentListInfo &Info) const {
55871a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis  Info.setLAngleLoc(LAngleLoc);
55971a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis  Info.setRAngleLoc(RAngleLoc);
56071a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis  for (unsigned I = 0; I != NumTemplateArgs; ++I)
56171a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis    Info.addArgument(getTemplateArgs()[I]);
56271a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis}
56371a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis
56471a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidisstd::size_t ASTTemplateArgumentListInfo::sizeFor(unsigned NumTemplateArgs) {
56571a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis  return sizeof(ASTTemplateArgumentListInfo) +
56671a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis         sizeof(TemplateArgumentLoc) * NumTemplateArgs;
56771a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis}
56871a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis
569e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnaravoid
570e4b92761b43ced611c417ae478568610f1ad7b1eAbramo BagnaraASTTemplateKWAndArgsInfo::initializeFrom(SourceLocation TemplateKWLoc,
571e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara                                         const TemplateArgumentListInfo &Info) {
572e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara  Base::initializeFrom(Info);
573e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara  setTemplateKeywordLoc(TemplateKWLoc);
574e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara}
575e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara
576e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnaravoid
577e4b92761b43ced611c417ae478568610f1ad7b1eAbramo BagnaraASTTemplateKWAndArgsInfo
578e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara::initializeFrom(SourceLocation TemplateKWLoc,
579e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara                 const TemplateArgumentListInfo &Info,
580e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara                 bool &Dependent,
581e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara                 bool &InstantiationDependent,
582e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara                 bool &ContainsUnexpandedParameterPack) {
583e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara  Base::initializeFrom(Info, Dependent, InstantiationDependent,
584e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara                       ContainsUnexpandedParameterPack);
585e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara  setTemplateKeywordLoc(TemplateKWLoc);
586e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara}
587e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara
588e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnaravoid
589e4b92761b43ced611c417ae478568610f1ad7b1eAbramo BagnaraASTTemplateKWAndArgsInfo::initializeFrom(SourceLocation TemplateKWLoc) {
590e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara  // No explicit template arguments, but template keyword loc is valid.
591e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara  assert(TemplateKWLoc.isValid());
592e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara  LAngleLoc = SourceLocation();
593e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara  RAngleLoc = SourceLocation();
594e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara  NumTemplateArgs = 0;
595e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara  setTemplateKeywordLoc(TemplateKWLoc);
596e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara}
597e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara
598e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnarastd::size_t
599e4b92761b43ced611c417ae478568610f1ad7b1eAbramo BagnaraASTTemplateKWAndArgsInfo::sizeFor(unsigned NumTemplateArgs) {
600e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara  // Add space for the template keyword location.
60197f6026f460c3aaa250fc9dcd7c2b8b6c1f3ba69Richard Smith  // FIXME: There's room for this in the padding before the template args in
60297f6026f460c3aaa250fc9dcd7c2b8b6c1f3ba69Richard Smith  //        64-bit builds.
603e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara  return Base::sizeFor(NumTemplateArgs) + sizeof(SourceLocation);
60471a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis}
605