DeclTemplate.cpp revision cc636688c4fd10b1732ce3e33b2b106024d545ca
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; 5362cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor if (!(isa<TemplateTypeParmDecl>(*Param) && 5462cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor cast<TemplateTypeParmDecl>(*Param)->hasDefaultArgument()) && 5562cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor !(isa<NonTypeTemplateParmDecl>(*Param) && 5662cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor cast<NonTypeTemplateParmDecl>(*Param)->hasDefaultArgument()) && 5762cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor !(isa<TemplateTemplateParmDecl>(*Param) && 5862cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor cast<TemplateTemplateParmDecl>(*Param)->hasDefaultArgument())) 5962cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor break; 6062cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor 6162cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor --NumRequiredArgs; 6262cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor } 6362cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor 6462cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor return NumRequiredArgs; 6562cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor} 6662cb18dd11472965e03374d40bc27d650bc331b6Douglas Gregor 67aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 68aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// TemplateDecl Implementation 69aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 70aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 71aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorTemplateDecl::~TemplateDecl() { 72aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor} 73aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 74aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 75aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// FunctionTemplateDecl Implementation 76aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 77aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 78aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorFunctionTemplateDecl *FunctionTemplateDecl::Create(ASTContext &C, 79aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor DeclContext *DC, 80aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor SourceLocation L, 81aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor DeclarationName Name, 82aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor TemplateParameterList *Params, 83aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor NamedDecl *Decl) { 84aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor return new (C) FunctionTemplateDecl(DC, L, Name, Params, Decl); 85aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor} 86aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 87aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 88aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// ClassTemplateDecl Implementation 89aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 90aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 91aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorClassTemplateDecl *ClassTemplateDecl::Create(ASTContext &C, 92aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor DeclContext *DC, 93aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor SourceLocation L, 94aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor DeclarationName Name, 95aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor TemplateParameterList *Params, 96aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor NamedDecl *Decl) { 97aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor return new (C) ClassTemplateDecl(DC, L, Name, Params, Decl); 98aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor} 99aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 100aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 101aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// TemplateTypeParm Allocation/Deallocation Method Implementations 102aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 103aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 104aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorTemplateTypeParmDecl * 105aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorTemplateTypeParmDecl::Create(ASTContext &C, DeclContext *DC, 106aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor SourceLocation L, unsigned D, unsigned P, 107aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor IdentifierInfo *Id, bool Typename) { 108fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor QualType Type = C.getTemplateTypeParmType(D, P, Id); 109fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor return new (C) TemplateTypeParmDecl(DC, L, Id, Typename, Type); 110aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor} 111aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 112aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 113aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// NonTypeTemplateParmDecl Method Implementations 114aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 115aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 116aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorNonTypeTemplateParmDecl * 117aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorNonTypeTemplateParmDecl::Create(ASTContext &C, DeclContext *DC, 118aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor SourceLocation L, unsigned D, unsigned P, 119aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor IdentifierInfo *Id, QualType T, 120aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor SourceLocation TypeSpecStartLoc) { 121aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor return new (C) NonTypeTemplateParmDecl(DC, L, D, P, Id, T, 122aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor TypeSpecStartLoc); 123aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor} 124aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 125d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas GregorSourceLocation NonTypeTemplateParmDecl::getDefaultArgumentLoc() const { 126d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas Gregor return DefaultArgument? DefaultArgument->getSourceRange().getBegin() 127d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas Gregor : SourceLocation(); 128d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas Gregor} 129d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas Gregor 130aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 131aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// TemplateTemplateParmDecl Method Implementations 132aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 133aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 134aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorTemplateTemplateParmDecl * 135aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorTemplateTemplateParmDecl::Create(ASTContext &C, DeclContext *DC, 136aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor SourceLocation L, unsigned D, unsigned P, 137aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor IdentifierInfo *Id, 138aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor TemplateParameterList *Params) { 139aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor return new (C) TemplateTemplateParmDecl(DC, L, D, P, Id, Params); 140aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor} 141aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 142d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas GregorSourceLocation TemplateTemplateParmDecl::getDefaultArgumentLoc() const { 143d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas Gregor return DefaultArgument? DefaultArgument->getSourceRange().getBegin() 144d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas Gregor : SourceLocation(); 145d684b0027e16163c4bdba3e2f8bfadda7d62a0d3Douglas Gregor} 1463e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor 1473e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor//===----------------------------------------------------------------------===// 1483e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor// ClassTemplateSpecializationDecl Implementation 1493e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor//===----------------------------------------------------------------------===// 1503e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas GregorClassTemplateSpecializationDecl:: 1513e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas GregorClassTemplateSpecializationDecl(DeclContext *DC, SourceLocation L, 1523e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor ClassTemplateDecl *SpecializedTemplate, 1533e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor TemplateArgument *TemplateArgs, 1543e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor unsigned NumTemplateArgs) 1553e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor : CXXRecordDecl(ClassTemplateSpecialization, 1563e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor SpecializedTemplate->getTemplatedDecl()->getTagKind(), 1573e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor DC, L, 1583e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor // FIXME: Should we use DeclarationName for the name of 1593e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor // class template specializations? 1603e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor SpecializedTemplate->getIdentifier()), 1613e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor SpecializedTemplate(SpecializedTemplate), 162cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor NumTemplateArgs(NumTemplateArgs), SpecializationKind(TSK_Undeclared) { 1633e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor TemplateArgument *Arg = reinterpret_cast<TemplateArgument *>(this + 1); 1643e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor for (unsigned ArgIdx = 0; ArgIdx < NumTemplateArgs; ++ArgIdx, ++Arg) 1653e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor *Arg = TemplateArgs[ArgIdx]; 1663e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor} 1673e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor 1683e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas GregorClassTemplateSpecializationDecl * 1693e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas GregorClassTemplateSpecializationDecl::Create(ASTContext &Context, 1703e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor DeclContext *DC, SourceLocation L, 1713e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor ClassTemplateDecl *SpecializedTemplate, 1723e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor TemplateArgument *TemplateArgs, 173cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor unsigned NumTemplateArgs, 174cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor ClassTemplateSpecializationDecl *PrevDecl) { 1753e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor unsigned Size = sizeof(ClassTemplateSpecializationDecl) + 1763e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor sizeof(TemplateArgument) * NumTemplateArgs; 1773e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor unsigned Align = llvm::AlignOf<ClassTemplateSpecializationDecl>::Alignment; 1783e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor void *Mem = Context.Allocate(Size, Align); 179cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor ClassTemplateSpecializationDecl *Result 180cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor = new (Mem) ClassTemplateSpecializationDecl(DC, L, SpecializedTemplate, 181cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor TemplateArgs, NumTemplateArgs); 182cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor // FIXME: Do we want a prettier type here? 183cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor Context.getTypeDeclType(Result, PrevDecl); 184cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor return Result; 1853e00bad490f1bae8a2c60f934e7eb5dbb9752c5dDouglas Gregor} 186