DeclTemplate.cpp revision aaba5e346dffdbad5d1c42765a89e4a7afb0da67
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" 16aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor#include "clang/AST/ASTContext.h" 17aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor#include "clang/Basic/IdentifierTable.h" 18aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor#include "llvm/ADT/STLExtras.h" 19aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregorusing namespace clang; 20aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 21aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 22aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// TemplateParameterList Implementation 23aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 24aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 25aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorTemplateParameterList::TemplateParameterList(Decl **Params, unsigned NumParams) 26aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor : NumParams(NumParams) { 27aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor for (unsigned Idx = 0; Idx < NumParams; ++Idx) 28aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor begin()[Idx] = Params[Idx]; 29aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor} 30aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 31aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorTemplateParameterList * 32aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorTemplateParameterList::Create(ASTContext &C, Decl **Params, 33aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor unsigned NumParams) { 34aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor unsigned Size = sizeof(TemplateParameterList) + sizeof(Decl *) * NumParams; 35aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor unsigned Align = llvm::AlignOf<TemplateParameterList>::Alignment; 36aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor void *Mem = C.Allocate(Size, Align); 37aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor return new (Mem) TemplateParameterList(Params, NumParams); 38aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor} 39aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 40aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 41aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// TemplateDecl Implementation 42aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 43aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 44aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorTemplateDecl::~TemplateDecl() { 45aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor} 46aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 47aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 48aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// FunctionTemplateDecl Implementation 49aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 50aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 51aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorFunctionTemplateDecl *FunctionTemplateDecl::Create(ASTContext &C, 52aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor DeclContext *DC, 53aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor SourceLocation L, 54aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor DeclarationName Name, 55aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor TemplateParameterList *Params, 56aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor NamedDecl *Decl) { 57aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor return new (C) FunctionTemplateDecl(DC, L, Name, Params, Decl); 58aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor} 59aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 60aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 61aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// ClassTemplateDecl Implementation 62aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 63aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 64aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorClassTemplateDecl *ClassTemplateDecl::Create(ASTContext &C, 65aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor DeclContext *DC, 66aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor SourceLocation L, 67aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor DeclarationName Name, 68aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor TemplateParameterList *Params, 69aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor NamedDecl *Decl) { 70aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor return new (C) ClassTemplateDecl(DC, L, Name, Params, Decl); 71aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor} 72aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 73aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 74aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// TemplateTypeParm Allocation/Deallocation Method Implementations 75aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 76aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 77aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorTemplateTypeParmDecl * 78aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorTemplateTypeParmDecl::Create(ASTContext &C, DeclContext *DC, 79aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor SourceLocation L, unsigned D, unsigned P, 80aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor IdentifierInfo *Id, bool Typename) { 81aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor return new (C) TemplateTypeParmDecl(DC, L, D, P, Id, Typename); 82aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor} 83aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 84aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 85aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// NonTypeTemplateParmDecl Method Implementations 86aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 87aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 88aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorNonTypeTemplateParmDecl * 89aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorNonTypeTemplateParmDecl::Create(ASTContext &C, DeclContext *DC, 90aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor SourceLocation L, unsigned D, unsigned P, 91aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor IdentifierInfo *Id, QualType T, 92aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor SourceLocation TypeSpecStartLoc) { 93aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor return new (C) NonTypeTemplateParmDecl(DC, L, D, P, Id, T, 94aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor TypeSpecStartLoc); 95aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor} 96aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 97aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 98aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor// TemplateTemplateParmDecl Method Implementations 99aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor//===----------------------------------------------------------------------===// 100aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 101aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorTemplateTemplateParmDecl * 102aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas GregorTemplateTemplateParmDecl::Create(ASTContext &C, DeclContext *DC, 103aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor SourceLocation L, unsigned D, unsigned P, 104aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor IdentifierInfo *Id, 105aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor TemplateParameterList *Params) { 106aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor return new (C) TemplateTemplateParmDecl(DC, L, D, P, Id, Params); 107aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor} 108aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor 109