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