DeclTemplate.cpp revision b57a4fe73b8227c0dba651818b8495dfca61e530
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, 84127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor TemplateParameterList *Params, 85aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor NamedDecl *Decl) { 86aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor return new (C) FunctionTemplateDecl(DC, L, Name, Params, Decl); 87aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor} 88aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 89127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregorvoid FunctionTemplateDecl::Destroy(ASTContext &C) { 90127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor if (Common *CommonPtr = CommonOrPrev.dyn_cast<Common*>()) { 91127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor for (llvm::FoldingSet<FunctionTemplateSpecializationInfo>::iterator 92127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor Spec = CommonPtr->Specializations.begin(), 93127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor SpecEnd = CommonPtr->Specializations.end(); 94127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor Spec != SpecEnd; ++Spec) 95127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor C.Deallocate(&*Spec); 96127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor } 97127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor 98127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor Decl::Destroy(C); 99127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor} 100127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor 101b57a4fe73b8227c0dba651818b8495dfca61e530Argyrios KyrtzidisFunctionTemplateDecl *FunctionTemplateDecl::getCanonicalDecl() { 102b57a4fe73b8227c0dba651818b8495dfca61e530Argyrios Kyrtzidis FunctionTemplateDecl *FunTmpl = this; 103b57a4fe73b8227c0dba651818b8495dfca61e530Argyrios Kyrtzidis while (FunTmpl->getPreviousDeclaration()) 104b57a4fe73b8227c0dba651818b8495dfca61e530Argyrios Kyrtzidis FunTmpl = FunTmpl->getPreviousDeclaration(); 105b57a4fe73b8227c0dba651818b8495dfca61e530Argyrios Kyrtzidis return FunTmpl; 106b57a4fe73b8227c0dba651818b8495dfca61e530Argyrios Kyrtzidis} 107b57a4fe73b8227c0dba651818b8495dfca61e530Argyrios Kyrtzidis 108127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas GregorFunctionTemplateDecl::Common *FunctionTemplateDecl::getCommonPtr() { 109127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor // Find the first declaration of this function template. 110127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor FunctionTemplateDecl *First = this; 111127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor while (First->getPreviousDeclaration()) 112127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor First = First->getPreviousDeclaration(); 113127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor 114127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor if (First->CommonOrPrev.isNull()) { 115127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor // FIXME: Allocate with the ASTContext 116127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor First->CommonOrPrev = new Common; 117127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor } 118127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor return First->CommonOrPrev.get<Common*>(); 119127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor} 120127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor 121aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 122aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// ClassTemplateDecl Implementation 123aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 124aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 125b57a4fe73b8227c0dba651818b8495dfca61e530Argyrios KyrtzidisClassTemplateDecl *ClassTemplateDecl::getCanonicalDecl() { 126b57a4fe73b8227c0dba651818b8495dfca61e530Argyrios Kyrtzidis ClassTemplateDecl *Template = this; 127b57a4fe73b8227c0dba651818b8495dfca61e530Argyrios Kyrtzidis while (Template->getPreviousDeclaration()) 128b57a4fe73b8227c0dba651818b8495dfca61e530Argyrios Kyrtzidis Template = Template->getPreviousDeclaration(); 129b57a4fe73b8227c0dba651818b8495dfca61e530Argyrios Kyrtzidis return Template; 130b57a4fe73b8227c0dba651818b8495dfca61e530Argyrios Kyrtzidis} 131b57a4fe73b8227c0dba651818b8495dfca61e530Argyrios Kyrtzidis 132aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorClassTemplateDecl *ClassTemplateDecl::Create(ASTContext &C, 133aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor DeclContext *DC, 134aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor SourceLocation L, 135aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor DeclarationName Name, 136aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor TemplateParameterList *Params, 1375953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor NamedDecl *Decl, 1385953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor ClassTemplateDecl *PrevDecl) { 1395953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor Common *CommonPtr; 1405953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor if (PrevDecl) 1415953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor CommonPtr = PrevDecl->CommonPtr; 1425953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor else 1435953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor CommonPtr = new (C) Common; 1445953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor 1455953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor return new (C) ClassTemplateDecl(DC, L, Name, Params, Decl, PrevDecl, 1465953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor CommonPtr); 1475953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor} 1485953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor 1495953d8b37f92f0cf548941f617c9b0a7703df33bDouglas GregorClassTemplateDecl::~ClassTemplateDecl() { 1505953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor assert(CommonPtr == 0 && "ClassTemplateDecl must be explicitly destroyed"); 1515953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor} 1525953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor 1535953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregorvoid ClassTemplateDecl::Destroy(ASTContext& C) { 1545953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor if (!PreviousDeclaration) { 1555953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor CommonPtr->~Common(); 1565953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor C.Deallocate((void*)CommonPtr); 1575953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor } 1585953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor CommonPtr = 0; 1595953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor 1605953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor this->~ClassTemplateDecl(); 1615953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor C.Deallocate((void*)this); 162aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor} 163aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 1647da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas GregorQualType ClassTemplateDecl::getInjectedClassNameType(ASTContext &Context) { 1657da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor if (!CommonPtr->InjectedClassNameType.isNull()) 1667da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor return CommonPtr->InjectedClassNameType; 1677da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor 1687da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor // FIXME: n2800 14.6.1p1 should say how the template arguments 1697da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor // corresponding to template parameter packs should be pack 1707da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor // expansions. We already say that in 14.6.2.1p2, so it would be 1717da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor // better to fix that redundancy. 1727da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor 1737da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor TemplateParameterList *Params = getTemplateParameters(); 1747da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor 1757da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor llvm::SmallVector<TemplateArgument, 16> TemplateArgs; 1767da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor llvm::SmallVector<TemplateArgument, 16> CanonTemplateArgs; 1777da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor TemplateArgs.reserve(Params->size()); 1787da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor CanonTemplateArgs.reserve(Params->size()); 1797da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor 1807da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor for (TemplateParameterList::iterator 1817da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor Param = Params->begin(), ParamEnd = Params->end(); 1827da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor Param != ParamEnd; ++Param) { 1837da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor if (isa<TemplateTypeParmDecl>(*Param)) { 1847da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor QualType ParamType = Context.getTypeDeclType(cast<TypeDecl>(*Param)); 1857da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor TemplateArgs.push_back(TemplateArgument((*Param)->getLocation(), 1867da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor ParamType)); 1877da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor CanonTemplateArgs.push_back( 1887da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor TemplateArgument((*Param)->getLocation(), 1897da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor Context.getCanonicalType(ParamType))); 1907da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor } else if (NonTypeTemplateParmDecl *NTTP = 1917da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor dyn_cast<NonTypeTemplateParmDecl>(*Param)) { 1927da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor // FIXME: Build canonical expression, too! 1937da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor Expr *E = new (Context) DeclRefExpr(NTTP, NTTP->getType(), 1947da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor NTTP->getLocation(), 1957da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor NTTP->getType()->isDependentType(), 1967da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor /*Value-dependent=*/true); 1977da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor TemplateArgs.push_back(TemplateArgument(E)); 1987da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor CanonTemplateArgs.push_back(TemplateArgument(E)); 1997da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor } else { 2007da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor TemplateTemplateParmDecl *TTP = cast<TemplateTemplateParmDecl>(*Param); 2017da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor TemplateArgs.push_back(TemplateArgument(TTP->getLocation(), TTP)); 2027da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor CanonTemplateArgs.push_back(TemplateArgument(TTP->getLocation(), 2037da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor Context.getCanonicalDecl(TTP))); 2047da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor } 2057da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor } 2067da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor 2077da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor // FIXME: I should really move the "build-the-canonical-type" logic 2087da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor // into ASTContext::getTemplateSpecializationType. 2097da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor TemplateName Name = TemplateName(this); 2107da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor QualType CanonType = Context.getTemplateSpecializationType( 2117da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor Context.getCanonicalTemplateName(Name), 2127da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor &CanonTemplateArgs[0], 2137da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor CanonTemplateArgs.size()); 2147da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor 2157da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor CommonPtr->InjectedClassNameType 2167da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor = Context.getTemplateSpecializationType(Name, 2177da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor &TemplateArgs[0], 2187da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor TemplateArgs.size(), 2197da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor CanonType); 2207da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor return CommonPtr->InjectedClassNameType; 2217da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor} 2227da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor 223aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 224aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// TemplateTypeParm Allocation/Deallocation Method Implementations 225aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 226aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 227aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorTemplateTypeParmDecl * 228aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorTemplateTypeParmDecl::Create(ASTContext &C, DeclContext *DC, 229aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor SourceLocation L, unsigned D, unsigned P, 2306d845ae1baf77691bca080e0762a1d45ee017f70Anders Carlsson IdentifierInfo *Id, bool Typename, 2316d845ae1baf77691bca080e0762a1d45ee017f70Anders Carlsson bool ParameterPack) { 23276e4ce42a30cee4dc40ce7c6014874fbc4f9baa7Anders Carlsson QualType Type = C.getTemplateTypeParmType(D, P, ParameterPack, Id); 2336d845ae1baf77691bca080e0762a1d45ee017f70Anders Carlsson return new (C) TemplateTypeParmDecl(DC, L, Id, Typename, Type, ParameterPack); 234aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor} 235aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 236aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 237aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// NonTypeTemplateParmDecl Method Implementations 238aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 239aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 240aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorNonTypeTemplateParmDecl * 241aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorNonTypeTemplateParmDecl::Create(ASTContext &C, DeclContext *DC, 242aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor SourceLocation L, unsigned D, unsigned P, 243aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor IdentifierInfo *Id, QualType T, 244aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor SourceLocation TypeSpecStartLoc) { 245aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor return new (C) NonTypeTemplateParmDecl(DC, L, D, P, Id, T, 246aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor TypeSpecStartLoc); 247aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor} 248aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 249d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas GregorSourceLocation NonTypeTemplateParmDecl::getDefaultArgumentLoc() const { 250d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas Gregor return DefaultArgument? DefaultArgument->getSourceRange().getBegin() 251d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas Gregor : SourceLocation(); 252d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas Gregor} 253d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas Gregor 254aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 255aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// TemplateTemplateParmDecl Method Implementations 256aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 257aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 258aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorTemplateTemplateParmDecl * 259aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorTemplateTemplateParmDecl::Create(ASTContext &C, DeclContext *DC, 260aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor SourceLocation L, unsigned D, unsigned P, 261aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor IdentifierInfo *Id, 262aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor TemplateParameterList *Params) { 263aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor return new (C) TemplateTemplateParmDecl(DC, L, D, P, Id, Params); 264aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor} 265aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 266d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas GregorSourceLocation TemplateTemplateParmDecl::getDefaultArgumentLoc() const { 267d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas Gregor return DefaultArgument? DefaultArgument->getSourceRange().getBegin() 268d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas Gregor : SourceLocation(); 269d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas Gregor} 2703e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor 2713e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor//===----------------------------------------------------------------------===// 27240808ce6ac04b102c3b56244a635d6b98eed6d97Douglas Gregor// TemplateArgument Implementation 27340808ce6ac04b102c3b56244a635d6b98eed6d97Douglas Gregor//===----------------------------------------------------------------------===// 27440808ce6ac04b102c3b56244a635d6b98eed6d97Douglas Gregor 27540808ce6ac04b102c3b56244a635d6b98eed6d97Douglas GregorTemplateArgument::TemplateArgument(Expr *E) : Kind(Expression) { 27640808ce6ac04b102c3b56244a635d6b98eed6d97Douglas Gregor TypeOrValue = reinterpret_cast<uintptr_t>(E); 27740808ce6ac04b102c3b56244a635d6b98eed6d97Douglas Gregor StartLoc = E->getSourceRange().getBegin(); 27840808ce6ac04b102c3b56244a635d6b98eed6d97Douglas Gregor} 27940808ce6ac04b102c3b56244a635d6b98eed6d97Douglas Gregor 280d01b1da213aeb71fd40ff7fb78a194613cc1ece7Anders Carlsson/// \brief Construct a template argument pack. 281fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlssonvoid TemplateArgument::setArgumentPack(TemplateArgument *args, unsigned NumArgs, 282fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson bool CopyArgs) { 283fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson assert(isNull() && "Must call setArgumentPack on a null argument"); 284fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson 285fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson Kind = Pack; 286fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson Args.NumArgs = NumArgs; 287fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson Args.CopyArgs = CopyArgs; 288fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson if (!Args.CopyArgs) { 289fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson Args.Args = args; 290fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson return; 291fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson } 292fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson 293fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson Args.Args = new TemplateArgument[NumArgs]; 294fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson for (unsigned I = 0; I != Args.NumArgs; ++I) 295fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson Args.Args[I] = args[I]; 296d01b1da213aeb71fd40ff7fb78a194613cc1ece7Anders Carlsson} 297d01b1da213aeb71fd40ff7fb78a194613cc1ece7Anders Carlsson 29840808ce6ac04b102c3b56244a635d6b98eed6d97Douglas Gregor//===----------------------------------------------------------------------===// 2999ba41645892da0000fe8a7832b80208f44dafedaAnders Carlsson// TemplateArgumentListBuilder Implementation 3009ba41645892da0000fe8a7832b80208f44dafedaAnders Carlsson//===----------------------------------------------------------------------===// 301fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson 302fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlssonvoid TemplateArgumentListBuilder::Append(const TemplateArgument& Arg) { 3039ba41645892da0000fe8a7832b80208f44dafedaAnders Carlsson switch (Arg.getKind()) { 304fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson default: break; 305fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson case TemplateArgument::Type: 306fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson assert(Arg.getAsType()->isCanonical() && "Type must be canonical!"); 307fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson break; 3089ba41645892da0000fe8a7832b80208f44dafedaAnders Carlsson } 3099ba41645892da0000fe8a7832b80208f44dafedaAnders Carlsson 310fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson assert(NumFlatArgs < MaxFlatArgs && "Argument list builder is full!"); 311fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson assert(!StructuredArgs && 312fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson "Can't append arguments when an argument pack has been added!"); 313fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson 314fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson if (!FlatArgs) 315fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson FlatArgs = new TemplateArgument[MaxFlatArgs]; 3163b36b66a00b7d5bab71b486a54694f0ae397bddbAnders Carlsson 317fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson FlatArgs[NumFlatArgs++] = Arg; 3189ba41645892da0000fe8a7832b80208f44dafedaAnders Carlsson} 3199ba41645892da0000fe8a7832b80208f44dafedaAnders Carlsson 320fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlssonvoid TemplateArgumentListBuilder::BeginPack() { 321fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson assert(!AddingToPack && "Already adding to pack!"); 322fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson assert(!StructuredArgs && "Argument list already contains a pack!"); 323fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson 324fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson AddingToPack = true; 325fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson PackBeginIndex = NumFlatArgs; 32667e332009c6e349dc34700f539747afcff990336Anders Carlsson} 32767e332009c6e349dc34700f539747afcff990336Anders Carlsson 328fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlssonvoid TemplateArgumentListBuilder::EndPack() { 329fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson assert(AddingToPack && "Not adding to pack!"); 330fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson assert(!StructuredArgs && "Argument list already contains a pack!"); 331fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson 332fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson AddingToPack = false; 3333b36b66a00b7d5bab71b486a54694f0ae397bddbAnders Carlsson 334fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson StructuredArgs = new TemplateArgument[MaxStructuredArgs]; 335fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson 336fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson // First copy the flat entries over to the list (if any) 337fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson for (unsigned I = 0; I != PackBeginIndex; ++I) { 338fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson NumStructuredArgs++; 339fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson StructuredArgs[I] = FlatArgs[I]; 340fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson } 3413b36b66a00b7d5bab71b486a54694f0ae397bddbAnders Carlsson 342fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson // Next, set the pack. 343fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson TemplateArgument *PackArgs = 0; 344fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson unsigned NumPackArgs = NumFlatArgs - PackBeginIndex; 345fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson if (NumPackArgs) 346fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson PackArgs = &FlatArgs[PackBeginIndex]; 34767e332009c6e349dc34700f539747afcff990336Anders Carlsson 348fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson StructuredArgs[NumStructuredArgs++].setArgumentPack(PackArgs, NumPackArgs, 349fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson /*CopyArgs=*/false); 350fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson} 351fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson 352fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlssonvoid TemplateArgumentListBuilder::ReleaseArgs() { 353fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson FlatArgs = 0; 354fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson NumFlatArgs = 0; 355fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson MaxFlatArgs = 0; 356fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson StructuredArgs = 0; 357fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson NumStructuredArgs = 0; 358fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson MaxStructuredArgs = 0; 359fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson} 36067e332009c6e349dc34700f539747afcff990336Anders Carlsson 3619ba41645892da0000fe8a7832b80208f44dafedaAnders Carlsson//===----------------------------------------------------------------------===// 3627e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor// TemplateArgumentList Implementation 3637e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor//===----------------------------------------------------------------------===// 3647e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas GregorTemplateArgumentList::TemplateArgumentList(ASTContext &Context, 365e9c904b082ac3299831704a69066b86ab0f78becAnders Carlsson TemplateArgumentListBuilder &Builder, 366fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson bool TakeArgs) 367fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson : FlatArguments(Builder.getFlatArguments(), TakeArgs), 368fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson NumFlatArguments(Builder.flatSize()), 369fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson StructuredArguments(Builder.getStructuredArguments(), TakeArgs), 370fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson NumStructuredArguments(Builder.structuredSize()) { 371e9c904b082ac3299831704a69066b86ab0f78becAnders Carlsson 372fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson if (!TakeArgs) 373fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson return; 374fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson 375fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson if (Builder.getStructuredArguments() == Builder.getFlatArguments()) 376fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson StructuredArguments.setInt(0); 377fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson Builder.ReleaseArgs(); 3787e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor} 3797e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor 3807e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas GregorTemplateArgumentList::~TemplateArgumentList() { 3817e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor // FIXME: Deallocate template arguments 3827e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor} 3837e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor 3847e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor//===----------------------------------------------------------------------===// 3853e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor// ClassTemplateSpecializationDecl Implementation 3863e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor//===----------------------------------------------------------------------===// 3873e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas GregorClassTemplateSpecializationDecl:: 388c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas GregorClassTemplateSpecializationDecl(ASTContext &Context, Kind DK, 3897e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor DeclContext *DC, SourceLocation L, 3903e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor ClassTemplateDecl *SpecializedTemplate, 39191fdf6f576b91f023c3bebb0d3786aab555cb3c5Anders Carlsson TemplateArgumentListBuilder &Builder) 392c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor : CXXRecordDecl(DK, 3933e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor SpecializedTemplate->getTemplatedDecl()->getTagKind(), 3943e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor DC, L, 3953e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor // FIXME: Should we use DeclarationName for the name of 3963e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor // class template specializations? 3973e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor SpecializedTemplate->getIdentifier()), 3983e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor SpecializedTemplate(SpecializedTemplate), 399fb25052736439d72a557cddd41dfb927bcb3d3e5Anders Carlsson TemplateArgs(Context, Builder, /*TakeArgs=*/true), 4007e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor SpecializationKind(TSK_Undeclared) { 4013e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor} 4023e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor 4033e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas GregorClassTemplateSpecializationDecl * 4043e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas GregorClassTemplateSpecializationDecl::Create(ASTContext &Context, 4053e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor DeclContext *DC, SourceLocation L, 4063e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor ClassTemplateDecl *SpecializedTemplate, 40791fdf6f576b91f023c3bebb0d3786aab555cb3c5Anders Carlsson TemplateArgumentListBuilder &Builder, 408cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor ClassTemplateSpecializationDecl *PrevDecl) { 409cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor ClassTemplateSpecializationDecl *Result 410c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor = new (Context)ClassTemplateSpecializationDecl(Context, 411c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor ClassTemplateSpecialization, 412c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor DC, L, 4137e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor SpecializedTemplate, 41491fdf6f576b91f023c3bebb0d3786aab555cb3c5Anders Carlsson Builder); 415cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor Context.getTypeDeclType(Result, PrevDecl); 416cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor return Result; 4173e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor} 418c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor 419c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor//===----------------------------------------------------------------------===// 420c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor// ClassTemplatePartialSpecializationDecl Implementation 421c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor//===----------------------------------------------------------------------===// 422c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas GregorClassTemplatePartialSpecializationDecl * 423c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas GregorClassTemplatePartialSpecializationDecl:: 424c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas GregorCreate(ASTContext &Context, DeclContext *DC, SourceLocation L, 425c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor TemplateParameterList *Params, 426c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor ClassTemplateDecl *SpecializedTemplate, 42791fdf6f576b91f023c3bebb0d3786aab555cb3c5Anders Carlsson TemplateArgumentListBuilder &Builder, 428c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor ClassTemplatePartialSpecializationDecl *PrevDecl) { 429c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor ClassTemplatePartialSpecializationDecl *Result 430c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor = new (Context)ClassTemplatePartialSpecializationDecl(Context, 431c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor DC, L, Params, 432c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor SpecializedTemplate, 43391fdf6f576b91f023c3bebb0d3786aab555cb3c5Anders Carlsson Builder); 434c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor Result->setSpecializationKind(TSK_ExplicitSpecialization); 435c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor Context.getTypeDeclType(Result, PrevDecl); 436c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor return Result; 437c8ab2563ac8f7dcc4fdc518b5cc7015ecbb2f003Douglas Gregor} 438