DeclTemplate.cpp revision 0ceffb51b28b09db67404058c642dcb1f877f6e8
1aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===--- DeclCXX.cpp - C++ Declaration AST Node Implementation ------------===// 2aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// 3aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// The LLVM Compiler Infrastructure 4aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// 5aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// This file is distributed under the University of Illinois Open Source 6aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// License. See LICENSE.TXT for details. 7aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// 8aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 9aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// 10aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// This file implements the C++ related Decl classes for templates. 11aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// 12aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 13aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 14aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor#include "clang/AST/DeclCXX.h" 15aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor#include "clang/AST/DeclTemplate.h" 1655f6b14230c94272efbbcdd89a92224c8db9f225Douglas Gregor#include "clang/AST/Expr.h" 17aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor#include "clang/AST/ASTContext.h" 18aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor#include "clang/Basic/IdentifierTable.h" 19aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor#include "llvm/ADT/STLExtras.h" 20aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregorusing namespace clang; 21aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 22aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 23aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// TemplateParameterList Implementation 24aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 25aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 26ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas GregorTemplateParameterList::TemplateParameterList(SourceLocation TemplateLoc, 27ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas Gregor SourceLocation LAngleLoc, 28ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas Gregor Decl **Params, unsigned NumParams, 29ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas Gregor SourceLocation RAngleLoc) 30ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas Gregor : TemplateLoc(TemplateLoc), LAngleLoc(LAngleLoc), RAngleLoc(RAngleLoc), 31ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas Gregor NumParams(NumParams) { 32aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor for (unsigned Idx = 0; Idx < NumParams; ++Idx) 33aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor begin()[Idx] = Params[Idx]; 34aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor} 35aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 36aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorTemplateParameterList * 37ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas GregorTemplateParameterList::Create(ASTContext &C, SourceLocation TemplateLoc, 38ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas Gregor SourceLocation LAngleLoc, Decl **Params, 39ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas Gregor unsigned NumParams, SourceLocation RAngleLoc) { 40aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor unsigned Size = sizeof(TemplateParameterList) + sizeof(Decl *) * NumParams; 41aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor unsigned Align = llvm::AlignOf<TemplateParameterList>::Alignment; 42aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor void *Mem = C.Allocate(Size, Align); 43ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas Gregor return new (Mem) TemplateParameterList(TemplateLoc, LAngleLoc, Params, 44ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas Gregor NumParams, RAngleLoc); 45aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor} 46aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 4762cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregorunsigned TemplateParameterList::getMinRequiredArguments() const { 4862cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor unsigned NumRequiredArgs = size(); 4962cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor iterator Param = const_cast<TemplateParameterList *>(this)->end(), 5062cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor ParamBegin = const_cast<TemplateParameterList *>(this)->begin(); 5162cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor while (Param != ParamBegin) { 5262cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor --Param; 530ceffb51b28b09db67404058c642dcb1f877f6e8Anders Carlsson 540ceffb51b28b09db67404058c642dcb1f877f6e8Anders Carlsson if (!(*Param)->isTemplateParameterPack() && 550ceffb51b28b09db67404058c642dcb1f877f6e8Anders Carlsson !(isa<TemplateTypeParmDecl>(*Param) && 5662cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor cast<TemplateTypeParmDecl>(*Param)->hasDefaultArgument()) && 5762cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor !(isa<NonTypeTemplateParmDecl>(*Param) && 5862cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor cast<NonTypeTemplateParmDecl>(*Param)->hasDefaultArgument()) && 5962cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor !(isa<TemplateTemplateParmDecl>(*Param) && 6062cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor cast<TemplateTemplateParmDecl>(*Param)->hasDefaultArgument())) 6162cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor break; 6262cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor 6362cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor --NumRequiredArgs; 6462cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor } 6562cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor 6662cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor return NumRequiredArgs; 6762cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor} 6862cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor 69aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 70aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// TemplateDecl Implementation 71aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 72aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 73aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorTemplateDecl::~TemplateDecl() { 74aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor} 75aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 76aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 77aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// FunctionTemplateDecl Implementation 78aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 79aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 80aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorFunctionTemplateDecl *FunctionTemplateDecl::Create(ASTContext &C, 81aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor DeclContext *DC, 82aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor SourceLocation L, 83aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor DeclarationName Name, 84aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor TemplateParameterList *Params, 85aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor NamedDecl *Decl) { 86aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor return new (C) FunctionTemplateDecl(DC, L, Name, Params, Decl); 87aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor} 88aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 89aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 90aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// ClassTemplateDecl Implementation 91aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 92aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 93aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorClassTemplateDecl *ClassTemplateDecl::Create(ASTContext &C, 94aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor DeclContext *DC, 95aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor SourceLocation L, 96aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor DeclarationName Name, 97aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor TemplateParameterList *Params, 985953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor NamedDecl *Decl, 995953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor ClassTemplateDecl *PrevDecl) { 1005953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor Common *CommonPtr; 1015953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor if (PrevDecl) 1025953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor CommonPtr = PrevDecl->CommonPtr; 1035953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor else 1045953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor CommonPtr = new (C) Common; 1055953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor 1065953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor return new (C) ClassTemplateDecl(DC, L, Name, Params, Decl, PrevDecl, 1075953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor CommonPtr); 1085953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor} 1095953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor 1105953d8b37f92f0cf548941f617c9b0a7703df33bDouglas GregorClassTemplateDecl::~ClassTemplateDecl() { 1115953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor assert(CommonPtr == 0 && "ClassTemplateDecl must be explicitly destroyed"); 1125953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor} 1135953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor 1145953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregorvoid ClassTemplateDecl::Destroy(ASTContext& C) { 1155953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor if (!PreviousDeclaration) { 1165953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor CommonPtr->~Common(); 1175953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor C.Deallocate((void*)CommonPtr); 1185953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor } 1195953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor CommonPtr = 0; 1205953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor 1215953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor this->~ClassTemplateDecl(); 1225953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor C.Deallocate((void*)this); 123aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor} 124aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 1257da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas GregorQualType ClassTemplateDecl::getInjectedClassNameType(ASTContext &Context) { 1267da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor if (!CommonPtr->InjectedClassNameType.isNull()) 1277da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor return CommonPtr->InjectedClassNameType; 1287da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor 1297da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor // FIXME: n2800 14.6.1p1 should say how the template arguments 1307da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor // corresponding to template parameter packs should be pack 1317da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor // expansions. We already say that in 14.6.2.1p2, so it would be 1327da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor // better to fix that redundancy. 1337da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor 1347da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor TemplateParameterList *Params = getTemplateParameters(); 1357da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor 1367da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor llvm::SmallVector<TemplateArgument, 16> TemplateArgs; 1377da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor llvm::SmallVector<TemplateArgument, 16> CanonTemplateArgs; 1387da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor TemplateArgs.reserve(Params->size()); 1397da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor CanonTemplateArgs.reserve(Params->size()); 1407da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor 1417da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor for (TemplateParameterList::iterator 1427da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor Param = Params->begin(), ParamEnd = Params->end(); 1437da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor Param != ParamEnd; ++Param) { 1447da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor if (isa<TemplateTypeParmDecl>(*Param)) { 1457da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor QualType ParamType = Context.getTypeDeclType(cast<TypeDecl>(*Param)); 1467da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor TemplateArgs.push_back(TemplateArgument((*Param)->getLocation(), 1477da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor ParamType)); 1487da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor CanonTemplateArgs.push_back( 1497da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor TemplateArgument((*Param)->getLocation(), 1507da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor Context.getCanonicalType(ParamType))); 1517da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor } else if (NonTypeTemplateParmDecl *NTTP = 1527da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor dyn_cast<NonTypeTemplateParmDecl>(*Param)) { 1537da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor // FIXME: Build canonical expression, too! 1547da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor Expr *E = new (Context) DeclRefExpr(NTTP, NTTP->getType(), 1557da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor NTTP->getLocation(), 1567da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor NTTP->getType()->isDependentType(), 1577da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor /*Value-dependent=*/true); 1587da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor TemplateArgs.push_back(TemplateArgument(E)); 1597da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor CanonTemplateArgs.push_back(TemplateArgument(E)); 1607da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor } else { 1617da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor TemplateTemplateParmDecl *TTP = cast<TemplateTemplateParmDecl>(*Param); 1627da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor TemplateArgs.push_back(TemplateArgument(TTP->getLocation(), TTP)); 1637da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor CanonTemplateArgs.push_back(TemplateArgument(TTP->getLocation(), 1647da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor Context.getCanonicalDecl(TTP))); 1657da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor } 1667da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor } 1677da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor 1687da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor // FIXME: I should really move the "build-the-canonical-type" logic 1697da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor // into ASTContext::getTemplateSpecializationType. 1707da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor TemplateName Name = TemplateName(this); 1717da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor QualType CanonType = Context.getTemplateSpecializationType( 1727da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor Context.getCanonicalTemplateName(Name), 1737da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor &CanonTemplateArgs[0], 1747da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor CanonTemplateArgs.size()); 1757da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor 1767da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor CommonPtr->InjectedClassNameType 1777da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor = Context.getTemplateSpecializationType(Name, 1787da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor &TemplateArgs[0], 1797da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor TemplateArgs.size(), 1807da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor CanonType); 1817da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor return CommonPtr->InjectedClassNameType; 1827da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor} 1837da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor 184aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 185aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// TemplateTypeParm Allocation/Deallocation Method Implementations 186aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 187aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 188aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorTemplateTypeParmDecl * 189aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorTemplateTypeParmDecl::Create(ASTContext &C, DeclContext *DC, 190aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor SourceLocation L, unsigned D, unsigned P, 1916d845ae1baf77691bca080e0762a1d45ee017f70Anders Carlsson IdentifierInfo *Id, bool Typename, 1926d845ae1baf77691bca080e0762a1d45ee017f70Anders Carlsson bool ParameterPack) { 193fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor QualType Type = C.getTemplateTypeParmType(D, P, Id); 1946d845ae1baf77691bca080e0762a1d45ee017f70Anders Carlsson return new (C) TemplateTypeParmDecl(DC, L, Id, Typename, Type, ParameterPack); 195aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor} 196aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 197aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 198aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// NonTypeTemplateParmDecl Method Implementations 199aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 200aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 201aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorNonTypeTemplateParmDecl * 202aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorNonTypeTemplateParmDecl::Create(ASTContext &C, DeclContext *DC, 203aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor SourceLocation L, unsigned D, unsigned P, 204aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor IdentifierInfo *Id, QualType T, 205aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor SourceLocation TypeSpecStartLoc) { 206aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor return new (C) NonTypeTemplateParmDecl(DC, L, D, P, Id, T, 207aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor TypeSpecStartLoc); 208aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor} 209aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 210d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas GregorSourceLocation NonTypeTemplateParmDecl::getDefaultArgumentLoc() const { 211d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas Gregor return DefaultArgument? DefaultArgument->getSourceRange().getBegin() 212d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas Gregor : SourceLocation(); 213d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas Gregor} 214d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas Gregor 215aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 216aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// TemplateTemplateParmDecl Method Implementations 217aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 218aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 219aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorTemplateTemplateParmDecl * 220aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorTemplateTemplateParmDecl::Create(ASTContext &C, DeclContext *DC, 221aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor SourceLocation L, unsigned D, unsigned P, 222aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor IdentifierInfo *Id, 223aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor TemplateParameterList *Params) { 224aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor return new (C) TemplateTemplateParmDecl(DC, L, D, P, Id, Params); 225aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor} 226aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 227d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas GregorSourceLocation TemplateTemplateParmDecl::getDefaultArgumentLoc() const { 228d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas Gregor return DefaultArgument? DefaultArgument->getSourceRange().getBegin() 229d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas Gregor : SourceLocation(); 230d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas Gregor} 2313e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor 2323e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor//===----------------------------------------------------------------------===// 23340808ce6ac04b102c3b56244a635d6b98eed6d97Douglas Gregor// TemplateArgument Implementation 23440808ce6ac04b102c3b56244a635d6b98eed6d97Douglas Gregor//===----------------------------------------------------------------------===// 23540808ce6ac04b102c3b56244a635d6b98eed6d97Douglas Gregor 23640808ce6ac04b102c3b56244a635d6b98eed6d97Douglas GregorTemplateArgument::TemplateArgument(Expr *E) : Kind(Expression) { 23740808ce6ac04b102c3b56244a635d6b98eed6d97Douglas Gregor TypeOrValue = reinterpret_cast<uintptr_t>(E); 23840808ce6ac04b102c3b56244a635d6b98eed6d97Douglas Gregor StartLoc = E->getSourceRange().getBegin(); 23940808ce6ac04b102c3b56244a635d6b98eed6d97Douglas Gregor} 24040808ce6ac04b102c3b56244a635d6b98eed6d97Douglas Gregor 24140808ce6ac04b102c3b56244a635d6b98eed6d97Douglas Gregor//===----------------------------------------------------------------------===// 2429ba41645892da0000fe8a7832b80208f44dafedaAnders Carlsson// TemplateArgumentListBuilder Implementation 2439ba41645892da0000fe8a7832b80208f44dafedaAnders Carlsson//===----------------------------------------------------------------------===// 2449ba41645892da0000fe8a7832b80208f44dafedaAnders Carlssonvoid TemplateArgumentListBuilder::push_back(const TemplateArgument& Arg) { 2459ba41645892da0000fe8a7832b80208f44dafedaAnders Carlsson switch (Arg.getKind()) { 246412485d6659214285607aacd34ab2a25cfb6a67aMike Stump default: break; 2479ba41645892da0000fe8a7832b80208f44dafedaAnders Carlsson case TemplateArgument::Type: 2489ba41645892da0000fe8a7832b80208f44dafedaAnders Carlsson assert(Arg.getAsType()->isCanonical() && "Type must be canonical!"); 2499ba41645892da0000fe8a7832b80208f44dafedaAnders Carlsson break; 2509ba41645892da0000fe8a7832b80208f44dafedaAnders Carlsson } 2519ba41645892da0000fe8a7832b80208f44dafedaAnders Carlsson 25267e332009c6e349dc34700f539747afcff990336Anders Carlsson if (!isAddingFromParameterPack()) { 25367e332009c6e349dc34700f539747afcff990336Anders Carlsson // Add begin and end indicies. 25467e332009c6e349dc34700f539747afcff990336Anders Carlsson Indices.push_back(Args.size()); 25567e332009c6e349dc34700f539747afcff990336Anders Carlsson Indices.push_back(Args.size()); 25667e332009c6e349dc34700f539747afcff990336Anders Carlsson } 25767e332009c6e349dc34700f539747afcff990336Anders Carlsson 2589ba41645892da0000fe8a7832b80208f44dafedaAnders Carlsson Args.push_back(Arg); 2599ba41645892da0000fe8a7832b80208f44dafedaAnders Carlsson} 2609ba41645892da0000fe8a7832b80208f44dafedaAnders Carlsson 26167e332009c6e349dc34700f539747afcff990336Anders Carlssonvoid TemplateArgumentListBuilder::BeginParameterPack() { 26267e332009c6e349dc34700f539747afcff990336Anders Carlsson assert(!isAddingFromParameterPack() && "Already adding to parameter pack!"); 26367e332009c6e349dc34700f539747afcff990336Anders Carlsson 26467e332009c6e349dc34700f539747afcff990336Anders Carlsson Indices.push_back(Args.size()); 26567e332009c6e349dc34700f539747afcff990336Anders Carlsson} 26667e332009c6e349dc34700f539747afcff990336Anders Carlsson 26767e332009c6e349dc34700f539747afcff990336Anders Carlssonvoid TemplateArgumentListBuilder::EndParameterPack() { 26867e332009c6e349dc34700f539747afcff990336Anders Carlsson assert(isAddingFromParameterPack() && "Not adding to parameter pack!"); 26967e332009c6e349dc34700f539747afcff990336Anders Carlsson 27067e332009c6e349dc34700f539747afcff990336Anders Carlsson Indices.push_back(Args.size()); 27167e332009c6e349dc34700f539747afcff990336Anders Carlsson} 27267e332009c6e349dc34700f539747afcff990336Anders Carlsson 2739ba41645892da0000fe8a7832b80208f44dafedaAnders Carlsson//===----------------------------------------------------------------------===// 2747e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor// TemplateArgumentList Implementation 2757e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor//===----------------------------------------------------------------------===// 2767e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas GregorTemplateArgumentList::TemplateArgumentList(ASTContext &Context, 277e9c904b082ac3299831704a69066b86ab0f78becAnders Carlsson TemplateArgumentListBuilder &Builder, 278e9c904b082ac3299831704a69066b86ab0f78becAnders Carlsson bool CopyArgs, bool FlattenArgs) 279e9c904b082ac3299831704a69066b86ab0f78becAnders Carlsson : NumArguments(Builder.flatSize()) { 2807e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor if (!CopyArgs) { 281e9c904b082ac3299831704a69066b86ab0f78becAnders Carlsson Arguments.setPointer(Builder.getFlatArgumentList()); 2827e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor Arguments.setInt(1); 2837e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor return; 2847e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor } 2857e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor 286e9c904b082ac3299831704a69066b86ab0f78becAnders Carlsson 287e9c904b082ac3299831704a69066b86ab0f78becAnders Carlsson unsigned Size = sizeof(TemplateArgument) * Builder.flatSize(); 2887e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor unsigned Align = llvm::AlignOf<TemplateArgument>::Alignment; 2897e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor void *Mem = Context.Allocate(Size, Align); 2907e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor Arguments.setPointer((TemplateArgument *)Mem); 2917e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor Arguments.setInt(0); 2927e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor 2937e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor TemplateArgument *Args = (TemplateArgument *)Mem; 294e9c904b082ac3299831704a69066b86ab0f78becAnders Carlsson for (unsigned I = 0; I != NumArguments; ++I) 295e9c904b082ac3299831704a69066b86ab0f78becAnders Carlsson new (Args + I) TemplateArgument(Builder.getFlatArgumentList()[I]); 2967e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor} 2977e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor 2987e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas GregorTemplateArgumentList::~TemplateArgumentList() { 2997e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor // FIXME: Deallocate template arguments 3007e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor} 3017e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor 3027e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor//===----------------------------------------------------------------------===// 3033e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor// ClassTemplateSpecializationDecl Implementation 3043e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor//===----------------------------------------------------------------------===// 3053e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas GregorClassTemplateSpecializationDecl:: 306c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas GregorClassTemplateSpecializationDecl(ASTContext &Context, Kind DK, 3077e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor DeclContext *DC, SourceLocation L, 3083e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor ClassTemplateDecl *SpecializedTemplate, 30991fdf6f576b91f023c3bebb0d3786aab555cb3c5Anders Carlsson TemplateArgumentListBuilder &Builder) 310c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor : CXXRecordDecl(DK, 3113e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor SpecializedTemplate->getTemplatedDecl()->getTagKind(), 3123e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor DC, L, 3133e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor // FIXME: Should we use DeclarationName for the name of 3143e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor // class template specializations? 3153e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor SpecializedTemplate->getIdentifier()), 3163e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor SpecializedTemplate(SpecializedTemplate), 317e9c904b082ac3299831704a69066b86ab0f78becAnders Carlsson TemplateArgs(Context, Builder, /*CopyArgs=*/true, /*FlattenArgs=*/true), 3187e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor SpecializationKind(TSK_Undeclared) { 3193e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor} 3203e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor 3213e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas GregorClassTemplateSpecializationDecl * 3223e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas GregorClassTemplateSpecializationDecl::Create(ASTContext &Context, 3233e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor DeclContext *DC, SourceLocation L, 3243e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor ClassTemplateDecl *SpecializedTemplate, 32591fdf6f576b91f023c3bebb0d3786aab555cb3c5Anders Carlsson TemplateArgumentListBuilder &Builder, 326cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor ClassTemplateSpecializationDecl *PrevDecl) { 327cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor ClassTemplateSpecializationDecl *Result 328c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor = new (Context)ClassTemplateSpecializationDecl(Context, 329c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor ClassTemplateSpecialization, 330c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor DC, L, 3317e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor SpecializedTemplate, 33291fdf6f576b91f023c3bebb0d3786aab555cb3c5Anders Carlsson Builder); 333cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor Context.getTypeDeclType(Result, PrevDecl); 334cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor return Result; 3353e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor} 336c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor 337c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor//===----------------------------------------------------------------------===// 338c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor// ClassTemplatePartialSpecializationDecl Implementation 339c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor//===----------------------------------------------------------------------===// 340c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas GregorClassTemplatePartialSpecializationDecl * 341c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas GregorClassTemplatePartialSpecializationDecl:: 342c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas GregorCreate(ASTContext &Context, DeclContext *DC, SourceLocation L, 343c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor TemplateParameterList *Params, 344c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor ClassTemplateDecl *SpecializedTemplate, 34591fdf6f576b91f023c3bebb0d3786aab555cb3c5Anders Carlsson TemplateArgumentListBuilder &Builder, 346c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor ClassTemplatePartialSpecializationDecl *PrevDecl) { 347c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor ClassTemplatePartialSpecializationDecl *Result 348c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor = new (Context)ClassTemplatePartialSpecializationDecl(Context, 349c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor DC, L, Params, 350c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor SpecializedTemplate, 35191fdf6f576b91f023c3bebb0d3786aab555cb3c5Anders Carlsson Builder); 352c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor Result->setSpecializationKind(TSK_ExplicitSpecialization); 353c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor Context.getTypeDeclType(Result, PrevDecl); 354c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor return Result; 355c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor} 356