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