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" 25203e6a322ae29d577acafcb1572a57ec16e1e730Douglas Gregor#include <algorithm> 26781701c3d34740c53ad912ad007383ae2951c637Chandler Carruth#include <cctype> 27275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall 28275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCallusing namespace clang; 29275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall 30781701c3d34740c53ad912ad007383ae2951c637Chandler Carruth/// \brief Print a template integral argument value. 31781701c3d34740c53ad912ad007383ae2951c637Chandler Carruth/// 32781701c3d34740c53ad912ad007383ae2951c637Chandler Carruth/// \param TemplArg the TemplateArgument instance to print. 33781701c3d34740c53ad912ad007383ae2951c637Chandler Carruth/// 34781701c3d34740c53ad912ad007383ae2951c637Chandler Carruth/// \param Out the raw_ostream instance to use for printing. 35781701c3d34740c53ad912ad007383ae2951c637Chandler Carruthstatic void printIntegral(const TemplateArgument &TemplArg, 365f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner raw_ostream &Out) { 37781701c3d34740c53ad912ad007383ae2951c637Chandler Carruth const ::clang::Type *T = TemplArg.getIntegralType().getTypePtr(); 38781701c3d34740c53ad912ad007383ae2951c637Chandler Carruth const llvm::APSInt *Val = TemplArg.getAsIntegral(); 39781701c3d34740c53ad912ad007383ae2951c637Chandler Carruth 40781701c3d34740c53ad912ad007383ae2951c637Chandler Carruth if (T->isBooleanType()) { 41781701c3d34740c53ad912ad007383ae2951c637Chandler Carruth Out << (Val->getBoolValue() ? "true" : "false"); 42781701c3d34740c53ad912ad007383ae2951c637Chandler Carruth } else if (T->isCharType()) { 43774e2b4f8d23d75cbb3dfef077d4631d37f623c0Chandler Carruth const unsigned char Ch = Val->getZExtValue(); 44774e2b4f8d23d75cbb3dfef077d4631d37f623c0Chandler Carruth const std::string Str(1, Ch); 45774e2b4f8d23d75cbb3dfef077d4631d37f623c0Chandler Carruth Out << ((Ch == '\'') ? "'\\" : "'"); 46774e2b4f8d23d75cbb3dfef077d4631d37f623c0Chandler Carruth Out.write_escaped(Str, /*UseHexEscapes=*/ true); 47774e2b4f8d23d75cbb3dfef077d4631d37f623c0Chandler Carruth Out << "'"; 48781701c3d34740c53ad912ad007383ae2951c637Chandler Carruth } else { 49781701c3d34740c53ad912ad007383ae2951c637Chandler Carruth Out << Val->toString(10); 50781701c3d34740c53ad912ad007383ae2951c637Chandler Carruth } 51781701c3d34740c53ad912ad007383ae2951c637Chandler Carruth} 52781701c3d34740c53ad912ad007383ae2951c637Chandler Carruth 53275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall//===----------------------------------------------------------------------===// 54275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall// TemplateArgument Implementation 55275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall//===----------------------------------------------------------------------===// 56275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall 57203e6a322ae29d577acafcb1572a57ec16e1e730Douglas GregorTemplateArgument TemplateArgument::CreatePackCopy(ASTContext &Context, 58203e6a322ae29d577acafcb1572a57ec16e1e730Douglas Gregor const TemplateArgument *Args, 59203e6a322ae29d577acafcb1572a57ec16e1e730Douglas Gregor unsigned NumArgs) { 60203e6a322ae29d577acafcb1572a57ec16e1e730Douglas Gregor if (NumArgs == 0) 61203e6a322ae29d577acafcb1572a57ec16e1e730Douglas Gregor return TemplateArgument(0, 0); 62203e6a322ae29d577acafcb1572a57ec16e1e730Douglas Gregor 63203e6a322ae29d577acafcb1572a57ec16e1e730Douglas Gregor TemplateArgument *Storage = new (Context) TemplateArgument [NumArgs]; 64203e6a322ae29d577acafcb1572a57ec16e1e730Douglas Gregor std::copy(Args, Args + NumArgs, Storage); 65203e6a322ae29d577acafcb1572a57ec16e1e730Douglas Gregor return TemplateArgument(Storage, NumArgs); 66203e6a322ae29d577acafcb1572a57ec16e1e730Douglas Gregor} 67203e6a322ae29d577acafcb1572a57ec16e1e730Douglas Gregor 68bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregorbool TemplateArgument::isDependent() const { 69bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor switch (getKind()) { 70bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor case Null: 71b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie llvm_unreachable("Should not have a NULL template argument"); 72bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor 73bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor case Type: 74bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor return getAsType()->isDependentType(); 75bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor 76bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor case Template: 77bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor return getAsTemplate().isDependent(); 78a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor 79a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor case TemplateExpansion: 80a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor return true; 81a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor 82bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor case Declaration: 83bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor if (DeclContext *DC = dyn_cast<DeclContext>(getAsDecl())) 84bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor return DC->isDependentContext(); 85bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor return getAsDecl()->getDeclContext()->isDependentContext(); 86bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor 87bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor case Integral: 88bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor // Never dependent 89bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor return false; 90bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor 91bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor case Expression: 92bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor return (getAsExpr()->isTypeDependent() || getAsExpr()->isValueDependent()); 93bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor 94bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor case Pack: 95bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor for (pack_iterator P = pack_begin(), PEnd = pack_end(); P != PEnd; ++P) { 96bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor if (P->isDependent()) 97bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor return true; 98bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor } 99bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor 100bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor return false; 101bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor } 102bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor 103bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor return false; 104bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor} 105bebbe0d9b7568ce43a464286bee49429489ef483Douglas Gregor 106561f81243f665cf2001caadc45df505f826b72d6Douglas Gregorbool TemplateArgument::isInstantiationDependent() const { 107561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor switch (getKind()) { 108561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor case Null: 109b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie llvm_unreachable("Should not have a NULL template argument"); 110561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor 111561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor case Type: 112561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor return getAsType()->isInstantiationDependentType(); 113561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor 114561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor case Template: 115561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor return getAsTemplate().isInstantiationDependent(); 116561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor 117561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor case TemplateExpansion: 118561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor return true; 119561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor 120561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor case Declaration: 121561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor if (DeclContext *DC = dyn_cast<DeclContext>(getAsDecl())) 122561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor return DC->isDependentContext(); 123561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor return getAsDecl()->getDeclContext()->isDependentContext(); 124561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor 125561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor case Integral: 126561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor // Never dependent 127561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor return false; 128561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor 129561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor case Expression: 130561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor return getAsExpr()->isInstantiationDependent(); 131561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor 132561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor case Pack: 133561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor for (pack_iterator P = pack_begin(), PEnd = pack_end(); P != PEnd; ++P) { 134561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor if (P->isInstantiationDependent()) 135561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor return true; 136561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor } 137561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor 138561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor return false; 139561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor } 140561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor 141561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor return false; 142561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor} 143561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor 1448491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregorbool TemplateArgument::isPackExpansion() const { 1458491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor switch (getKind()) { 1468491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor case Null: 1478491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor case Declaration: 1488491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor case Integral: 1498491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor case Pack: 150a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor case Template: 1518491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor return false; 1528491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor 153a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor case TemplateExpansion: 154a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor return true; 155a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor 1568491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor case Type: 157be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor return isa<PackExpansionType>(getAsType()); 158a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor 1598491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor case Expression: 160be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor return isa<PackExpansionExpr>(getAsExpr()); 1618491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor } 1628491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor 1638491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor return false; 1648491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor} 1658491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor 166d0937224f383c7cc72c947119380f9713a070c73Douglas Gregorbool TemplateArgument::containsUnexpandedParameterPack() const { 167d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor switch (getKind()) { 168d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor case Null: 169d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor case Declaration: 170d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor case Integral: 171a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor case TemplateExpansion: 172d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor break; 173d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor 174d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor case Type: 175d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor if (getAsType()->containsUnexpandedParameterPack()) 176d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor return true; 177d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor break; 178d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor 179d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor case Template: 180a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor if (getAsTemplate().containsUnexpandedParameterPack()) 181d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor return true; 182d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor break; 183d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor 184d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor case Expression: 185d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor if (getAsExpr()->containsUnexpandedParameterPack()) 186d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor return true; 187d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor break; 188d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor 189d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor case Pack: 190d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor for (pack_iterator P = pack_begin(), PEnd = pack_end(); P != PEnd; ++P) 191d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor if (P->containsUnexpandedParameterPack()) 192d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor return true; 193d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor 194d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor break; 195d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor } 196d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor 197d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor return false; 198d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor} 199d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor 2002be29f423acad3bbe39099a78db2805acb5bdf17Douglas Gregorllvm::Optional<unsigned> TemplateArgument::getNumTemplateExpansions() const { 2012be29f423acad3bbe39099a78db2805acb5bdf17Douglas Gregor assert(Kind == TemplateExpansion); 2022be29f423acad3bbe39099a78db2805acb5bdf17Douglas Gregor if (TemplateArg.NumExpansions) 2032be29f423acad3bbe39099a78db2805acb5bdf17Douglas Gregor return TemplateArg.NumExpansions - 1; 2042be29f423acad3bbe39099a78db2805acb5bdf17Douglas Gregor 2052be29f423acad3bbe39099a78db2805acb5bdf17Douglas Gregor return llvm::Optional<unsigned>(); 2062be29f423acad3bbe39099a78db2805acb5bdf17Douglas Gregor} 2072be29f423acad3bbe39099a78db2805acb5bdf17Douglas Gregor 208275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCallvoid TemplateArgument::Profile(llvm::FoldingSetNodeID &ID, 2094ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad const ASTContext &Context) const { 210275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall ID.AddInteger(Kind); 211275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall switch (Kind) { 212275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall case Null: 213275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall break; 214275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall 215275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall case Type: 216275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall getAsType().Profile(ID); 217275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall break; 218275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall 219275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall case Declaration: 220275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall ID.AddPointer(getAsDecl()? getAsDecl()->getCanonicalDecl() : 0); 221275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall break; 222275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall 223788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor case Template: 224a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor case TemplateExpansion: { 225a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor TemplateName Template = getAsTemplateOrTemplatePattern(); 22674295b3408178bd0e97c2090dac911817778b582Douglas Gregor if (TemplateTemplateParmDecl *TTP 22774295b3408178bd0e97c2090dac911817778b582Douglas Gregor = dyn_cast_or_null<TemplateTemplateParmDecl>( 228a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor Template.getAsTemplateDecl())) { 22974295b3408178bd0e97c2090dac911817778b582Douglas Gregor ID.AddBoolean(true); 23074295b3408178bd0e97c2090dac911817778b582Douglas Gregor ID.AddInteger(TTP->getDepth()); 23174295b3408178bd0e97c2090dac911817778b582Douglas Gregor ID.AddInteger(TTP->getPosition()); 232ba68eca7582a62e3e2ff4b0eba1b2b73a6b80895Douglas Gregor ID.AddBoolean(TTP->isParameterPack()); 23374295b3408178bd0e97c2090dac911817778b582Douglas Gregor } else { 23474295b3408178bd0e97c2090dac911817778b582Douglas Gregor ID.AddBoolean(false); 235a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor ID.AddPointer(Context.getCanonicalTemplateName(Template) 236a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor .getAsVoidPointer()); 23774295b3408178bd0e97c2090dac911817778b582Douglas Gregor } 238788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor break; 239a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor } 240788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor 241275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall case Integral: 242275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall getAsIntegral()->Profile(ID); 243275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall getIntegralType().Profile(ID); 244275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall break; 245275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall 246275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall case Expression: 247275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall getAsExpr()->Profile(ID, Context, true); 248275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall break; 249275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall 250275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall case Pack: 251275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall ID.AddInteger(Args.NumArgs); 252275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall for (unsigned I = 0; I != Args.NumArgs; ++I) 253275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall Args.Args[I].Profile(ID, Context); 254275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall } 255275c10a8a4a43219f67d8d2c912ec6294d9d9af2John McCall} 256833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 25733500955d731c73717af52088b7fc0e7a85681e7John McCallbool TemplateArgument::structurallyEquals(const TemplateArgument &Other) const { 25833500955d731c73717af52088b7fc0e7a85681e7John McCall if (getKind() != Other.getKind()) return false; 25933500955d731c73717af52088b7fc0e7a85681e7John McCall 26033500955d731c73717af52088b7fc0e7a85681e7John McCall switch (getKind()) { 26133500955d731c73717af52088b7fc0e7a85681e7John McCall case Null: 26233500955d731c73717af52088b7fc0e7a85681e7John McCall case Type: 26333500955d731c73717af52088b7fc0e7a85681e7John McCall case Declaration: 264a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor case Expression: 265a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor case Template: 266a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor case TemplateExpansion: 26733500955d731c73717af52088b7fc0e7a85681e7John McCall return TypeOrValue == Other.TypeOrValue; 26833500955d731c73717af52088b7fc0e7a85681e7John McCall 26933500955d731c73717af52088b7fc0e7a85681e7John McCall case Integral: 27033500955d731c73717af52088b7fc0e7a85681e7John McCall return getIntegralType() == Other.getIntegralType() && 27133500955d731c73717af52088b7fc0e7a85681e7John McCall *getAsIntegral() == *Other.getAsIntegral(); 27233500955d731c73717af52088b7fc0e7a85681e7John McCall 27333500955d731c73717af52088b7fc0e7a85681e7John McCall case Pack: 27433500955d731c73717af52088b7fc0e7a85681e7John McCall if (Args.NumArgs != Other.Args.NumArgs) return false; 27533500955d731c73717af52088b7fc0e7a85681e7John McCall for (unsigned I = 0, E = Args.NumArgs; I != E; ++I) 27633500955d731c73717af52088b7fc0e7a85681e7John McCall if (!Args.Args[I].structurallyEquals(Other.Args.Args[I])) 27733500955d731c73717af52088b7fc0e7a85681e7John McCall return false; 27833500955d731c73717af52088b7fc0e7a85681e7John McCall return true; 27933500955d731c73717af52088b7fc0e7a85681e7John McCall } 28033500955d731c73717af52088b7fc0e7a85681e7John McCall 28133500955d731c73717af52088b7fc0e7a85681e7John McCall // Suppress warnings. 28233500955d731c73717af52088b7fc0e7a85681e7John McCall return false; 28333500955d731c73717af52088b7fc0e7a85681e7John McCall} 28433500955d731c73717af52088b7fc0e7a85681e7John McCall 285e02e26293cf8e3bad1059b39cea75c6582896da6Douglas GregorTemplateArgument TemplateArgument::getPackExpansionPattern() const { 286e02e26293cf8e3bad1059b39cea75c6582896da6Douglas Gregor assert(isPackExpansion()); 287e02e26293cf8e3bad1059b39cea75c6582896da6Douglas Gregor 288e02e26293cf8e3bad1059b39cea75c6582896da6Douglas Gregor switch (getKind()) { 289ba68eca7582a62e3e2ff4b0eba1b2b73a6b80895Douglas Gregor case Type: 290ba68eca7582a62e3e2ff4b0eba1b2b73a6b80895Douglas Gregor return getAsType()->getAs<PackExpansionType>()->getPattern(); 291ba68eca7582a62e3e2ff4b0eba1b2b73a6b80895Douglas Gregor 292ba68eca7582a62e3e2ff4b0eba1b2b73a6b80895Douglas Gregor case Expression: 293ba68eca7582a62e3e2ff4b0eba1b2b73a6b80895Douglas Gregor return cast<PackExpansionExpr>(getAsExpr())->getPattern(); 294ba68eca7582a62e3e2ff4b0eba1b2b73a6b80895Douglas Gregor 295a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor case TemplateExpansion: 2962be29f423acad3bbe39099a78db2805acb5bdf17Douglas Gregor return TemplateArgument(getAsTemplateOrTemplatePattern()); 297ba68eca7582a62e3e2ff4b0eba1b2b73a6b80895Douglas Gregor 298ba68eca7582a62e3e2ff4b0eba1b2b73a6b80895Douglas Gregor case Declaration: 299ba68eca7582a62e3e2ff4b0eba1b2b73a6b80895Douglas Gregor case Integral: 300ba68eca7582a62e3e2ff4b0eba1b2b73a6b80895Douglas Gregor case Pack: 301ba68eca7582a62e3e2ff4b0eba1b2b73a6b80895Douglas Gregor case Null: 302a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor case Template: 303ba68eca7582a62e3e2ff4b0eba1b2b73a6b80895Douglas Gregor return TemplateArgument(); 304e02e26293cf8e3bad1059b39cea75c6582896da6Douglas Gregor } 305e02e26293cf8e3bad1059b39cea75c6582896da6Douglas Gregor 306e02e26293cf8e3bad1059b39cea75c6582896da6Douglas Gregor return TemplateArgument(); 307e02e26293cf8e3bad1059b39cea75c6582896da6Douglas Gregor} 308e02e26293cf8e3bad1059b39cea75c6582896da6Douglas Gregor 30987dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregorvoid TemplateArgument::print(const PrintingPolicy &Policy, 3105f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner raw_ostream &Out) const { 31187dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor switch (getKind()) { 31287dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor case Null: 31387dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor Out << "<no value>"; 31487dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor break; 31587dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor 31687dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor case Type: { 317e559ca1672ecef59345a928af0a6809b09282d2cDouglas Gregor PrintingPolicy SubPolicy(Policy); 318e559ca1672ecef59345a928af0a6809b09282d2cDouglas Gregor SubPolicy.SuppressStrongLifetime = true; 31987dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor std::string TypeStr; 320e559ca1672ecef59345a928af0a6809b09282d2cDouglas Gregor getAsType().getAsStringInternal(TypeStr, SubPolicy); 32187dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor Out << TypeStr; 32287dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor break; 32387dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor } 32487dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor 32587dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor case Declaration: { 32687dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor bool Unnamed = true; 32787dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor if (NamedDecl *ND = dyn_cast_or_null<NamedDecl>(getAsDecl())) { 32887dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor if (ND->getDeclName()) { 32987dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor Unnamed = false; 33087dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor Out << ND->getNameAsString(); 33187dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor } 33287dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor } 33387dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor 33487dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor if (Unnamed) { 33587dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor Out << "<anonymous>"; 33687dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor } 33787dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor break; 33887dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor } 33987dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor 340a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor case Template: 34187dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor getAsTemplate().print(Out, Policy); 34287dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor break; 343a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor 344a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor case TemplateExpansion: 345a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor getAsTemplateOrTemplatePattern().print(Out, Policy); 346a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor Out << "..."; 347a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor break; 348a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor 34987dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor case Integral: { 350781701c3d34740c53ad912ad007383ae2951c637Chandler Carruth printIntegral(*this, Out); 35187dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor break; 35287dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor } 35387dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor 354ba68eca7582a62e3e2ff4b0eba1b2b73a6b80895Douglas Gregor case Expression: 35587dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor getAsExpr()->printPretty(Out, 0, Policy); 35687dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor break; 35787dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor 35887dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor case Pack: 35987dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor Out << "<"; 36087dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor bool First = true; 36187dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor for (TemplateArgument::pack_iterator P = pack_begin(), PEnd = pack_end(); 36287dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor P != PEnd; ++P) { 36387dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor if (First) 36487dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor First = false; 36587dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor else 36687dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor Out << ", "; 36787dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor 36887dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor P->print(Policy, Out); 36987dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor } 37087dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor Out << ">"; 37187dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor break; 37287dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor } 37387dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor} 37487dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor 375833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall//===----------------------------------------------------------------------===// 376833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall// TemplateArgumentLoc Implementation 377833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall//===----------------------------------------------------------------------===// 378833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 379b0ddf3aeb2f119cac42468b029584e8839b354ccDouglas GregorTemplateArgumentLocInfo::TemplateArgumentLocInfo() { 38075c4064932d481ac710a80aa88b3370ad8a6af1dChandler Carruth memset((void*)this, 0, sizeof(TemplateArgumentLocInfo)); 381b0ddf3aeb2f119cac42468b029584e8839b354ccDouglas Gregor} 382b0ddf3aeb2f119cac42468b029584e8839b354ccDouglas Gregor 383828bff2079b6a91ecd7ed5b842c59527d7682789John McCallSourceRange TemplateArgumentLoc::getSourceRange() const { 384833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall switch (Argument.getKind()) { 385833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall case TemplateArgument::Expression: 386828bff2079b6a91ecd7ed5b842c59527d7682789John McCall return getSourceExpression()->getSourceRange(); 387f38ef0c63a39306e835a91fd989cf30182a592e2Zhanyong Wan 388833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall case TemplateArgument::Declaration: 389828bff2079b6a91ecd7ed5b842c59527d7682789John McCall return getSourceDeclExpression()->getSourceRange(); 390f38ef0c63a39306e835a91fd989cf30182a592e2Zhanyong Wan 391828bff2079b6a91ecd7ed5b842c59527d7682789John McCall case TemplateArgument::Type: 392f38ef0c63a39306e835a91fd989cf30182a592e2Zhanyong Wan if (TypeSourceInfo *TSI = getTypeSourceInfo()) 393f38ef0c63a39306e835a91fd989cf30182a592e2Zhanyong Wan return TSI->getTypeLoc().getSourceRange(); 394f38ef0c63a39306e835a91fd989cf30182a592e2Zhanyong Wan else 395f38ef0c63a39306e835a91fd989cf30182a592e2Zhanyong Wan return SourceRange(); 396f38ef0c63a39306e835a91fd989cf30182a592e2Zhanyong Wan 397a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor case TemplateArgument::Template: 398b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor if (getTemplateQualifierLoc()) 399b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor return SourceRange(getTemplateQualifierLoc().getBeginLoc(), 400a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor getTemplateNameLoc()); 401a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor return SourceRange(getTemplateNameLoc()); 402a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor 403a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor case TemplateArgument::TemplateExpansion: 404b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor if (getTemplateQualifierLoc()) 405b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor return SourceRange(getTemplateQualifierLoc().getBeginLoc(), 406a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor getTemplateEllipsisLoc()); 407a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor return SourceRange(getTemplateNameLoc(), getTemplateEllipsisLoc()); 408a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor 409833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall case TemplateArgument::Integral: 410833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall case TemplateArgument::Pack: 411833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall case TemplateArgument::Null: 412828bff2079b6a91ecd7ed5b842c59527d7682789John McCall return SourceRange(); 413833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall } 414833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 415833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall // Silence bonus gcc warning. 416828bff2079b6a91ecd7ed5b842c59527d7682789John McCall return SourceRange(); 417833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall} 418a933319ebf754396623165f9dc0a29c2a48879f5Douglas Gregor 4198491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas GregorTemplateArgumentLoc 4208491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas GregorTemplateArgumentLoc::getPackExpansionPattern(SourceLocation &Ellipsis, 421cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor llvm::Optional<unsigned> &NumExpansions, 4228491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor ASTContext &Context) const { 4238491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor assert(Argument.isPackExpansion()); 4248491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor 4258491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor switch (Argument.getKind()) { 4268491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor case TemplateArgument::Type: { 42703491de7b48e05f07731770c3fb51f02bc058079Douglas Gregor // FIXME: We shouldn't ever have to worry about missing 42803491de7b48e05f07731770c3fb51f02bc058079Douglas Gregor // type-source info! 42903491de7b48e05f07731770c3fb51f02bc058079Douglas Gregor TypeSourceInfo *ExpansionTSInfo = getTypeSourceInfo(); 43003491de7b48e05f07731770c3fb51f02bc058079Douglas Gregor if (!ExpansionTSInfo) 43103491de7b48e05f07731770c3fb51f02bc058079Douglas Gregor ExpansionTSInfo = Context.getTrivialTypeSourceInfo( 43203491de7b48e05f07731770c3fb51f02bc058079Douglas Gregor getArgument().getAsType(), 43303491de7b48e05f07731770c3fb51f02bc058079Douglas Gregor Ellipsis); 4348491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor PackExpansionTypeLoc Expansion 43503491de7b48e05f07731770c3fb51f02bc058079Douglas Gregor = cast<PackExpansionTypeLoc>(ExpansionTSInfo->getTypeLoc()); 4368491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor Ellipsis = Expansion.getEllipsisLoc(); 4378491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor 4388491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor TypeLoc Pattern = Expansion.getPatternLoc(); 439cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor NumExpansions = Expansion.getTypePtr()->getNumExpansions(); 4408491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor 4418491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor // FIXME: This is horrible. We know where the source location data is for 4428491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor // the pattern, and we have the pattern's type, but we are forced to copy 4438491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor // them into an ASTContext because TypeSourceInfo bundles them together 4448491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor // and TemplateArgumentLoc traffics in TypeSourceInfo pointers. 4458491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor TypeSourceInfo *PatternTSInfo 4468491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor = Context.CreateTypeSourceInfo(Pattern.getType(), 4478491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor Pattern.getFullDataSize()); 4488491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor memcpy(PatternTSInfo->getTypeLoc().getOpaqueData(), 4498491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor Pattern.getOpaqueData(), Pattern.getFullDataSize()); 4508491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor return TemplateArgumentLoc(TemplateArgument(Pattern.getType()), 4518491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor PatternTSInfo); 4528491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor } 4538491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor 454be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor case TemplateArgument::Expression: { 455b0ddf3aeb2f119cac42468b029584e8839b354ccDouglas Gregor PackExpansionExpr *Expansion 456b0ddf3aeb2f119cac42468b029584e8839b354ccDouglas Gregor = cast<PackExpansionExpr>(Argument.getAsExpr()); 457b0ddf3aeb2f119cac42468b029584e8839b354ccDouglas Gregor Expr *Pattern = Expansion->getPattern(); 458b0ddf3aeb2f119cac42468b029584e8839b354ccDouglas Gregor Ellipsis = Expansion->getEllipsisLoc(); 45967fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor NumExpansions = Expansion->getNumExpansions(); 460be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor return TemplateArgumentLoc(Pattern, Pattern); 461be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor } 462a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor 463a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor case TemplateArgument::TemplateExpansion: 464b0ddf3aeb2f119cac42468b029584e8839b354ccDouglas Gregor Ellipsis = getTemplateEllipsisLoc(); 4652be29f423acad3bbe39099a78db2805acb5bdf17Douglas Gregor NumExpansions = Argument.getNumTemplateExpansions(); 466ba68eca7582a62e3e2ff4b0eba1b2b73a6b80895Douglas Gregor return TemplateArgumentLoc(Argument.getPackExpansionPattern(), 467b6744efecba58792cce20d2d7b9ee39927c5422eDouglas Gregor getTemplateQualifierLoc(), 468ba68eca7582a62e3e2ff4b0eba1b2b73a6b80895Douglas Gregor getTemplateNameLoc()); 4698491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor 4708491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor case TemplateArgument::Declaration: 471a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor case TemplateArgument::Template: 4728491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor case TemplateArgument::Integral: 4738491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor case TemplateArgument::Pack: 4748491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor case TemplateArgument::Null: 4758491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor return TemplateArgumentLoc(); 4768491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor } 4778491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor 4788491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor return TemplateArgumentLoc(); 4798491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor} 4808491ffe86c50241b47c6d7ef8cd9ee00f5e675daDouglas Gregor 481a933319ebf754396623165f9dc0a29c2a48879f5Douglas Gregorconst DiagnosticBuilder &clang::operator<<(const DiagnosticBuilder &DB, 482a933319ebf754396623165f9dc0a29c2a48879f5Douglas Gregor const TemplateArgument &Arg) { 483a933319ebf754396623165f9dc0a29c2a48879f5Douglas Gregor switch (Arg.getKind()) { 484a933319ebf754396623165f9dc0a29c2a48879f5Douglas Gregor case TemplateArgument::Null: 48567c4a0ca65dd72784a1778264938c8ba45506ceaJohn McCall // This is bad, but not as bad as crashing because of argument 48667c4a0ca65dd72784a1778264938c8ba45506ceaJohn McCall // count mismatches. 48767c4a0ca65dd72784a1778264938c8ba45506ceaJohn McCall return DB << "(null template argument)"; 488a933319ebf754396623165f9dc0a29c2a48879f5Douglas Gregor 489a933319ebf754396623165f9dc0a29c2a48879f5Douglas Gregor case TemplateArgument::Type: 490a933319ebf754396623165f9dc0a29c2a48879f5Douglas Gregor return DB << Arg.getAsType(); 491a933319ebf754396623165f9dc0a29c2a48879f5Douglas Gregor 492a933319ebf754396623165f9dc0a29c2a48879f5Douglas Gregor case TemplateArgument::Declaration: 493a933319ebf754396623165f9dc0a29c2a48879f5Douglas Gregor return DB << Arg.getAsDecl(); 494a933319ebf754396623165f9dc0a29c2a48879f5Douglas Gregor 495a933319ebf754396623165f9dc0a29c2a48879f5Douglas Gregor case TemplateArgument::Integral: 496a933319ebf754396623165f9dc0a29c2a48879f5Douglas Gregor return DB << Arg.getAsIntegral()->toString(10); 497a933319ebf754396623165f9dc0a29c2a48879f5Douglas Gregor 498a933319ebf754396623165f9dc0a29c2a48879f5Douglas Gregor case TemplateArgument::Template: 499a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor return DB << Arg.getAsTemplate(); 500a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor 501a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor case TemplateArgument::TemplateExpansion: 502a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor return DB << Arg.getAsTemplateOrTemplatePattern() << "..."; 503a7fc901a2e39bfe55bfcff5934b2d9fdf9656491Douglas Gregor 504a933319ebf754396623165f9dc0a29c2a48879f5Douglas Gregor case TemplateArgument::Expression: { 505a933319ebf754396623165f9dc0a29c2a48879f5Douglas Gregor // This shouldn't actually ever happen, so it's okay that we're 506a933319ebf754396623165f9dc0a29c2a48879f5Douglas Gregor // regurgitating an expression here. 507a933319ebf754396623165f9dc0a29c2a48879f5Douglas Gregor // FIXME: We're guessing at LangOptions! 508a933319ebf754396623165f9dc0a29c2a48879f5Douglas Gregor llvm::SmallString<32> Str; 509a933319ebf754396623165f9dc0a29c2a48879f5Douglas Gregor llvm::raw_svector_ostream OS(Str); 510a933319ebf754396623165f9dc0a29c2a48879f5Douglas Gregor LangOptions LangOpts; 511a933319ebf754396623165f9dc0a29c2a48879f5Douglas Gregor LangOpts.CPlusPlus = true; 512a933319ebf754396623165f9dc0a29c2a48879f5Douglas Gregor PrintingPolicy Policy(LangOpts); 513a933319ebf754396623165f9dc0a29c2a48879f5Douglas Gregor Arg.getAsExpr()->printPretty(OS, 0, Policy); 514a933319ebf754396623165f9dc0a29c2a48879f5Douglas Gregor return DB << OS.str(); 515a933319ebf754396623165f9dc0a29c2a48879f5Douglas Gregor } 516a933319ebf754396623165f9dc0a29c2a48879f5Douglas Gregor 51787dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor case TemplateArgument::Pack: { 51887dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor // FIXME: We're guessing at LangOptions! 51987dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor llvm::SmallString<32> Str; 52087dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor llvm::raw_svector_ostream OS(Str); 52187dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor LangOptions LangOpts; 52287dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor LangOpts.CPlusPlus = true; 52387dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor PrintingPolicy Policy(LangOpts); 52487dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor Arg.print(Policy, OS); 52587dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor return DB << OS.str(); 52687dd697dcc8ecb64df73ae64d61b8c80ff0c157cDouglas Gregor } 527a933319ebf754396623165f9dc0a29c2a48879f5Douglas Gregor } 528a933319ebf754396623165f9dc0a29c2a48879f5Douglas Gregor 529a933319ebf754396623165f9dc0a29c2a48879f5Douglas Gregor return DB; 530a933319ebf754396623165f9dc0a29c2a48879f5Douglas Gregor} 53171a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis 53271a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidisconst ASTTemplateArgumentListInfo * 53371a7605977113c795edd44fcbd2302ad49506653Argyrios KyrtzidisASTTemplateArgumentListInfo::Create(ASTContext &C, 53471a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis const TemplateArgumentListInfo &List) { 53571a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis std::size_t size = sizeof(CXXDependentScopeMemberExpr) + 53671a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis ASTTemplateArgumentListInfo::sizeFor(List); 53771a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis void *Mem = C.Allocate(size, llvm::alignOf<ASTTemplateArgumentListInfo>()); 53871a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis ASTTemplateArgumentListInfo *TAI = new (Mem) ASTTemplateArgumentListInfo(); 53971a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis TAI->initializeFrom(List); 54071a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis return TAI; 54171a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis} 54271a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis 54371a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidisvoid ASTTemplateArgumentListInfo::initializeFrom( 54471a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis const TemplateArgumentListInfo &Info) { 54571a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis LAngleLoc = Info.getLAngleLoc(); 54671a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis RAngleLoc = Info.getRAngleLoc(); 54771a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis NumTemplateArgs = Info.size(); 54871a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis 54971a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis TemplateArgumentLoc *ArgBuffer = getTemplateArgs(); 55071a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis for (unsigned i = 0; i != NumTemplateArgs; ++i) 55171a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis new (&ArgBuffer[i]) TemplateArgumentLoc(Info[i]); 55271a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis} 55371a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis 55471a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidisvoid ASTTemplateArgumentListInfo::initializeFrom( 55571a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis const TemplateArgumentListInfo &Info, 55671a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis bool &Dependent, 55771a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis bool &InstantiationDependent, 55871a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis bool &ContainsUnexpandedParameterPack) { 55971a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis LAngleLoc = Info.getLAngleLoc(); 56071a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis RAngleLoc = Info.getRAngleLoc(); 56171a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis NumTemplateArgs = Info.size(); 56271a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis 56371a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis TemplateArgumentLoc *ArgBuffer = getTemplateArgs(); 56471a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis for (unsigned i = 0; i != NumTemplateArgs; ++i) { 56571a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis Dependent = Dependent || Info[i].getArgument().isDependent(); 56671a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis InstantiationDependent = InstantiationDependent || 56771a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis Info[i].getArgument().isInstantiationDependent(); 56871a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis ContainsUnexpandedParameterPack 56971a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis = ContainsUnexpandedParameterPack || 57071a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis Info[i].getArgument().containsUnexpandedParameterPack(); 57171a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis 57271a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis new (&ArgBuffer[i]) TemplateArgumentLoc(Info[i]); 57371a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis } 57471a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis} 57571a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis 57671a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidisvoid ASTTemplateArgumentListInfo::copyInto( 57771a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis TemplateArgumentListInfo &Info) const { 57871a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis Info.setLAngleLoc(LAngleLoc); 57971a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis Info.setRAngleLoc(RAngleLoc); 58071a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis for (unsigned I = 0; I != NumTemplateArgs; ++I) 58171a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis Info.addArgument(getTemplateArgs()[I]); 58271a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis} 58371a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis 58471a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidisstd::size_t ASTTemplateArgumentListInfo::sizeFor(unsigned NumTemplateArgs) { 58571a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis return sizeof(ASTTemplateArgumentListInfo) + 58671a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis sizeof(TemplateArgumentLoc) * NumTemplateArgs; 58771a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis} 58871a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis 58971a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidisstd::size_t ASTTemplateArgumentListInfo::sizeFor( 59071a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis const TemplateArgumentListInfo &Info) { 59171a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis return sizeFor(Info.size()); 59271a7605977113c795edd44fcbd2302ad49506653Argyrios Kyrtzidis} 593