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