Decl.cpp revision 0eb07bfde0deedcb35cf3d118b3488f5d8db32ec
15f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===--- Decl.cpp - Declaration AST Node Implementation -------------------===//
25f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
35f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//                     The LLVM Compiler Infrastructure
45f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
50bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// This file is distributed under the University of Illinois Open Source
60bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// License. See LICENSE.TXT for details.
75f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
85f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
95f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
10e184baeaa112ceac32420f8ca127b8d4d152d109Argyrios Kyrtzidis// This file implements the Decl subclasses.
115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/AST/Decl.h"
156c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner#include "clang/AST/ASTContext.h"
16e91593ef084479340582b2ba177b44be50a717b7Daniel Dunbar#include "clang/AST/Stmt.h"
17e91593ef084479340582b2ba177b44be50a717b7Daniel Dunbar#include "clang/Basic/IdentifierTable.h"
1827f8a28bee33bb0e857cfe1a61c281bbc234b338Ted Kremenek
195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerusing namespace clang;
205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
21d3b9065ec7052ec4741783d2fb4130d13c766933Chris Lattner//===----------------------------------------------------------------------===//
226c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner// Decl Allocation/Deallocation Method Implementations
236c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner//===----------------------------------------------------------------------===//
242d1c5d313cd0c229cc614e74baa4c5756a4b46f4Argyrios Kyrtzidis
25ef177820100ab583b08fd3056e2a5a52ee4b1629Argyrios KyrtzidisTranslationUnitDecl *TranslationUnitDecl::Create(ASTContext &C) {
26ef177820100ab583b08fd3056e2a5a52ee4b1629Argyrios Kyrtzidis  void *Mem = C.getAllocator().Allocate<TranslationUnitDecl>();
27ef177820100ab583b08fd3056e2a5a52ee4b1629Argyrios Kyrtzidis  return new (Mem) TranslationUnitDecl();
28ef177820100ab583b08fd3056e2a5a52ee4b1629Argyrios Kyrtzidis}
29ef177820100ab583b08fd3056e2a5a52ee4b1629Argyrios Kyrtzidis
302d1c5d313cd0c229cc614e74baa4c5756a4b46f4Argyrios KyrtzidisNamespaceDecl *NamespaceDecl::Create(ASTContext &C, DeclContext *DC,
312d1c5d313cd0c229cc614e74baa4c5756a4b46f4Argyrios Kyrtzidis                                     SourceLocation L, IdentifierInfo *Id) {
322d1c5d313cd0c229cc614e74baa4c5756a4b46f4Argyrios Kyrtzidis  void *Mem = C.getAllocator().Allocate<NamespaceDecl>();
332d1c5d313cd0c229cc614e74baa4c5756a4b46f4Argyrios Kyrtzidis  return new (Mem) NamespaceDecl(DC, L, Id);
342d1c5d313cd0c229cc614e74baa4c5756a4b46f4Argyrios Kyrtzidis}
352d1c5d313cd0c229cc614e74baa4c5756a4b46f4Argyrios Kyrtzidis
36d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenekvoid NamespaceDecl::Destroy(ASTContext& C) {
37d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenek  // NamespaceDecl uses "NextDeclarator" to chain namespace declarations
38d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenek  // together. They are all top-level Decls.
39d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenek
40ebf27b1831e6c4d7f4bc30e111a4d6340ff690d1Ted Kremenek  this->~NamespaceDecl();
41d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenek  C.getAllocator().Deallocate((void *)this);
42d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenek}
43d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenek
44d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenek
454111024be81e7c0525e42dadcc126d27e5bf2425Chris LattnerImplicitParamDecl *ImplicitParamDecl::Create(ASTContext &C, DeclContext *DC,
464111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner    SourceLocation L, IdentifierInfo *Id, QualType T, ScopedDecl *PrevDecl) {
474111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner  void *Mem = C.getAllocator().Allocate<ImplicitParamDecl>();
484111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner  return new (Mem) ImplicitParamDecl(ImplicitParam, DC, L, Id, T, PrevDecl);
494111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner}
504111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner
519fdf9c6d3530bb85f3166e6460d841e2ff8e1a2cChris LattnerVarDecl *VarDecl::Create(ASTContext &C, DeclContext *DC,
52248a753f6b670692523c99afaeb8fe98f7ae3ca7Steve Naroff                         SourceLocation L,
53248a753f6b670692523c99afaeb8fe98f7ae3ca7Steve Naroff                         IdentifierInfo *Id, QualType T,
540eb07bfde0deedcb35cf3d118b3488f5d8db32ecSteve Naroff                         StorageClass S, ScopedDecl *PrevDecl,
550eb07bfde0deedcb35cf3d118b3488f5d8db32ecSteve Naroff                         SourceLocation TypeSpecStartLoc) {
56248a753f6b670692523c99afaeb8fe98f7ae3ca7Steve Naroff  void *Mem = C.getAllocator().Allocate<VarDecl>();
570eb07bfde0deedcb35cf3d118b3488f5d8db32ecSteve Naroff  return new (Mem) VarDecl(Var, DC, L, Id, T, S, PrevDecl, TypeSpecStartLoc);
589e151e154780e9cd443336143af1e996d1f387e5Chris Lattner}
599e151e154780e9cd443336143af1e996d1f387e5Chris Lattner
609fdf9c6d3530bb85f3166e6460d841e2ff8e1a2cChris LattnerParmVarDecl *ParmVarDecl::Create(ASTContext &C, DeclContext *DC,
610ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner                                 SourceLocation L, IdentifierInfo *Id,
620ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner                                 QualType T, StorageClass S,
6304421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner                                 Expr *DefArg, ScopedDecl *PrevDecl) {
649e151e154780e9cd443336143af1e996d1f387e5Chris Lattner  void *Mem = C.getAllocator().Allocate<ParmVarDecl>();
659fdf9c6d3530bb85f3166e6460d841e2ff8e1a2cChris Lattner  return new (Mem) ParmVarDecl(DC, L, Id, T, S, DefArg, PrevDecl);
669e151e154780e9cd443336143af1e996d1f387e5Chris Lattner}
679e151e154780e9cd443336143af1e996d1f387e5Chris Lattner
689fdf9c6d3530bb85f3166e6460d841e2ff8e1a2cChris LattnerFunctionDecl *FunctionDecl::Create(ASTContext &C, DeclContext *DC,
690ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner                                   SourceLocation L,
70a98e58ddb4696a0020fe97439d5295413f9e90b1Chris Lattner                                   IdentifierInfo *Id, QualType T,
71a98e58ddb4696a0020fe97439d5295413f9e90b1Chris Lattner                                   StorageClass S, bool isInline,
720eb07bfde0deedcb35cf3d118b3488f5d8db32ecSteve Naroff                                   ScopedDecl *PrevDecl,
730eb07bfde0deedcb35cf3d118b3488f5d8db32ecSteve Naroff                                   SourceLocation TypeSpecStartLoc) {
74a98e58ddb4696a0020fe97439d5295413f9e90b1Chris Lattner  void *Mem = C.getAllocator().Allocate<FunctionDecl>();
750eb07bfde0deedcb35cf3d118b3488f5d8db32ecSteve Naroff  return new (Mem) FunctionDecl(Function, DC, L, Id, T, S, isInline, PrevDecl,
760eb07bfde0deedcb35cf3d118b3488f5d8db32ecSteve Naroff                                TypeSpecStartLoc);
77a98e58ddb4696a0020fe97439d5295413f9e90b1Chris Lattner}
78a98e58ddb4696a0020fe97439d5295413f9e90b1Chris Lattner
79b048c9835969c4f7fe06264748be18ed4b442116Chris LattnerFieldDecl *FieldDecl::Create(ASTContext &C, SourceLocation L,
808e25d8681822d8094bfeb97b2239363552548171Chris Lattner                             IdentifierInfo *Id, QualType T, Expr *BW) {
818e25d8681822d8094bfeb97b2239363552548171Chris Lattner  void *Mem = C.getAllocator().Allocate<FieldDecl>();
82b048c9835969c4f7fe06264748be18ed4b442116Chris Lattner  return new (Mem) FieldDecl(L, Id, T, BW);
838e25d8681822d8094bfeb97b2239363552548171Chris Lattner}
848e25d8681822d8094bfeb97b2239363552548171Chris Lattner
85a98e58ddb4696a0020fe97439d5295413f9e90b1Chris Lattner
860ed844b04ea4387caa4e1cf3dc375d269657536bChris LattnerEnumConstantDecl *EnumConstantDecl::Create(ASTContext &C, EnumDecl *CD,
870ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner                                           SourceLocation L,
88c63e660882ff93841fa234d70ef6757038302b92Chris Lattner                                           IdentifierInfo *Id, QualType T,
89c63e660882ff93841fa234d70ef6757038302b92Chris Lattner                                           Expr *E, const llvm::APSInt &V,
90c63e660882ff93841fa234d70ef6757038302b92Chris Lattner                                           ScopedDecl *PrevDecl){
916c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner  void *Mem = C.getAllocator().Allocate<EnumConstantDecl>();
920ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  return new (Mem) EnumConstantDecl(CD, L, Id, T, E, V, PrevDecl);
936c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner}
946c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner
95d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenekvoid EnumConstantDecl::Destroy(ASTContext& C) {
96d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenek  if (Init) Init->Destroy(C);
97d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenek  Decl::Destroy(C);
98d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenek}
99d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenek
1009fdf9c6d3530bb85f3166e6460d841e2ff8e1a2cChris LattnerTypedefDecl *TypedefDecl::Create(ASTContext &C, DeclContext *DC,
1010ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner                                 SourceLocation L,
102c63e660882ff93841fa234d70ef6757038302b92Chris Lattner                                 IdentifierInfo *Id, QualType T,
103c63e660882ff93841fa234d70ef6757038302b92Chris Lattner                                 ScopedDecl *PD) {
1046c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner  void *Mem = C.getAllocator().Allocate<TypedefDecl>();
1059fdf9c6d3530bb85f3166e6460d841e2ff8e1a2cChris Lattner  return new (Mem) TypedefDecl(DC, L, Id, T, PD);
1066c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner}
1076c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner
1089fdf9c6d3530bb85f3166e6460d841e2ff8e1a2cChris LattnerEnumDecl *EnumDecl::Create(ASTContext &C, DeclContext *DC, SourceLocation L,
1090ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner                           IdentifierInfo *Id,
110c63e660882ff93841fa234d70ef6757038302b92Chris Lattner                           ScopedDecl *PrevDecl) {
1116c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner  void *Mem = C.getAllocator().Allocate<EnumDecl>();
1129fdf9c6d3530bb85f3166e6460d841e2ff8e1a2cChris Lattner  return new (Mem) EnumDecl(DC, L, Id, PrevDecl);
1136c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner}
1146c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner
115df91eca19bd9738abd9a3b84791f39750e27ad36Ted Kremenekvoid EnumDecl::Destroy(ASTContext& C) {
116df91eca19bd9738abd9a3b84791f39750e27ad36Ted Kremenek  if (getEnumConstantList()) getEnumConstantList()->Destroy(C);
117df91eca19bd9738abd9a3b84791f39750e27ad36Ted Kremenek  Decl::Destroy(C);
118df91eca19bd9738abd9a3b84791f39750e27ad36Ted Kremenek}
119df91eca19bd9738abd9a3b84791f39750e27ad36Ted Kremenek
1200ed844b04ea4387caa4e1cf3dc375d269657536bChris LattnerFileScopeAsmDecl *FileScopeAsmDecl::Create(ASTContext &C,
1210ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner                                           SourceLocation L,
1228e25d8681822d8094bfeb97b2239363552548171Chris Lattner                                           StringLiteral *Str) {
1238e25d8681822d8094bfeb97b2239363552548171Chris Lattner  void *Mem = C.getAllocator().Allocate<FileScopeAsmDecl>();
1248e25d8681822d8094bfeb97b2239363552548171Chris Lattner  return new (Mem) FileScopeAsmDecl(L, Str);
1258e25d8681822d8094bfeb97b2239363552548171Chris Lattner}
1268e25d8681822d8094bfeb97b2239363552548171Chris Lattner
1270ed844b04ea4387caa4e1cf3dc375d269657536bChris LattnerLinkageSpecDecl *LinkageSpecDecl::Create(ASTContext &C,
1280ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner                                         SourceLocation L,
1298e25d8681822d8094bfeb97b2239363552548171Chris Lattner                                         LanguageIDs Lang, Decl *D) {
1308e25d8681822d8094bfeb97b2239363552548171Chris Lattner  void *Mem = C.getAllocator().Allocate<LinkageSpecDecl>();
1318e25d8681822d8094bfeb97b2239363552548171Chris Lattner  return new (Mem) LinkageSpecDecl(L, Lang, D);
1328e25d8681822d8094bfeb97b2239363552548171Chris Lattner}
1336c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner
1346c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner//===----------------------------------------------------------------------===//
1350ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner// NamedDecl Implementation
1368a934233d1582b5bde9d270bc0705aa81e471a79Chris Lattner//===----------------------------------------------------------------------===//
1378a934233d1582b5bde9d270bc0705aa81e471a79Chris Lattner
1380ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattnerconst char *NamedDecl::getName() const {
1390ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  if (const IdentifierInfo *II = getIdentifier())
1400ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner    return II->getName();
1410ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  return "";
1428a934233d1582b5bde9d270bc0705aa81e471a79Chris Lattner}
1438a934233d1582b5bde9d270bc0705aa81e471a79Chris Lattner
1448a934233d1582b5bde9d270bc0705aa81e471a79Chris Lattner//===----------------------------------------------------------------------===//
1458a934233d1582b5bde9d270bc0705aa81e471a79Chris Lattner// FunctionDecl Implementation
1468a934233d1582b5bde9d270bc0705aa81e471a79Chris Lattner//===----------------------------------------------------------------------===//
1478a934233d1582b5bde9d270bc0705aa81e471a79Chris Lattner
1485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid SpencerFunctionDecl::~FunctionDecl() {
1495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  delete[] ParamInfo;
150f009795057dc8ca254f5618c80a0a90f07cd44b4Douglas Gregor}
151f009795057dc8ca254f5618c80a0a90f07cd44b4Douglas Gregor
15227f8a28bee33bb0e857cfe1a61c281bbc234b338Ted Kremenekvoid FunctionDecl::Destroy(ASTContext& C) {
153b65cf41707d190d5ce3d48b9e5bd2dc9d7b4a4c0Ted Kremenek  if (Body)
154b65cf41707d190d5ce3d48b9e5bd2dc9d7b4a4c0Ted Kremenek    Body->Destroy(C);
155b65cf41707d190d5ce3d48b9e5bd2dc9d7b4a4c0Ted Kremenek
156b65cf41707d190d5ce3d48b9e5bd2dc9d7b4a4c0Ted Kremenek  for (param_iterator I=param_begin(), E=param_end(); I!=E; ++I)
157b65cf41707d190d5ce3d48b9e5bd2dc9d7b4a4c0Ted Kremenek    (*I)->Destroy(C);
158b65cf41707d190d5ce3d48b9e5bd2dc9d7b4a4c0Ted Kremenek
15927f8a28bee33bb0e857cfe1a61c281bbc234b338Ted Kremenek  Decl::Destroy(C);
16027f8a28bee33bb0e857cfe1a61c281bbc234b338Ted Kremenek}
16127f8a28bee33bb0e857cfe1a61c281bbc234b338Ted Kremenek
16227f8a28bee33bb0e857cfe1a61c281bbc234b338Ted Kremenek
163f009795057dc8ca254f5618c80a0a90f07cd44b4Douglas GregorStmt *FunctionDecl::getBody(const FunctionDecl *&Definition) const {
164f009795057dc8ca254f5618c80a0a90f07cd44b4Douglas Gregor  for (const FunctionDecl *FD = this; FD != 0; FD = FD->PreviousDeclaration) {
165f009795057dc8ca254f5618c80a0a90f07cd44b4Douglas Gregor    if (FD->Body) {
166f009795057dc8ca254f5618c80a0a90f07cd44b4Douglas Gregor      Definition = FD;
167f009795057dc8ca254f5618c80a0a90f07cd44b4Douglas Gregor      return FD->Body;
168f009795057dc8ca254f5618c80a0a90f07cd44b4Douglas Gregor    }
169f009795057dc8ca254f5618c80a0a90f07cd44b4Douglas Gregor  }
170f009795057dc8ca254f5618c80a0a90f07cd44b4Douglas Gregor
171f009795057dc8ca254f5618c80a0a90f07cd44b4Douglas Gregor  return 0;
1725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
1735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerunsigned FunctionDecl::getNumParams() const {
175d8bdba5d3534b87cae606d559933bc62752e8828Chris Lattner  const FunctionType *FT = getType()->getAsFunctionType();
176d8bdba5d3534b87cae606d559933bc62752e8828Chris Lattner  if (isa<FunctionTypeNoProto>(FT))
177d3b9065ec7052ec4741783d2fb4130d13c766933Chris Lattner    return 0;
178d8bdba5d3534b87cae606d559933bc62752e8828Chris Lattner  return cast<FunctionTypeProto>(FT)->getNumArgs();
1795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
1805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid FunctionDecl::setParams(ParmVarDecl **NewParamInfo, unsigned NumParams) {
1825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  assert(ParamInfo == 0 && "Already has param info!");
1835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  assert(NumParams == getNumParams() && "Parameter count mismatch!");
1845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Zero params -> null pointer.
1865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (NumParams) {
1875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    ParamInfo = new ParmVarDecl*[NumParams];
1885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    memcpy(ParamInfo, NewParamInfo, sizeof(ParmVarDecl*)*NumParams);
1895f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
1905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
1915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1928123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner/// getMinRequiredArguments - Returns the minimum number of arguments
1938123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner/// needed to call this function. This may be fewer than the number of
1948123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner/// function parameters, if some of the parameters have default
1959e979557eea3875c9e3d100c68188233dd7f46c0Chris Lattner/// arguments (in C++).
1968123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattnerunsigned FunctionDecl::getMinRequiredArguments() const {
1978123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner  unsigned NumRequiredArgs = getNumParams();
1988123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner  while (NumRequiredArgs > 0
1998123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner         && getParamDecl(NumRequiredArgs-1)->getDefaultArg())
2008123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner    --NumRequiredArgs;
2018123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner
2028123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner  return NumRequiredArgs;
2038123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner}
2048123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner
2058a934233d1582b5bde9d270bc0705aa81e471a79Chris Lattner//===----------------------------------------------------------------------===//
2064b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek// TagdDecl Implementation
2074b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek//===----------------------------------------------------------------------===//
2084b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek
2094b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed KremenekTagDecl* TagDecl::getDefinition(ASTContext& C) const {
2104b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek  QualType T = C.getTypeDeclType(const_cast<TagDecl*>(this));
2114b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek  TagDecl* D = cast<TagDecl>(cast<TagType>(T)->getDecl());
2124b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek  return D->isDefinition() ? D : 0;
2134b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek}
2144b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek
2154b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek//===----------------------------------------------------------------------===//
2168a934233d1582b5bde9d270bc0705aa81e471a79Chris Lattner// RecordDecl Implementation
2178a934233d1582b5bde9d270bc0705aa81e471a79Chris Lattner//===----------------------------------------------------------------------===//
2185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2196359792ca92e7ca2f416cb804c6604358174e994Ted KremenekRecordDecl::RecordDecl(Kind DK, DeclContext *DC, SourceLocation L,
220df042e6c2bf06b2d9ed53c52469599ac1bd93a3fTed Kremenek                       IdentifierInfo *Id)
221df042e6c2bf06b2d9ed53c52469599ac1bd93a3fTed Kremenek: TagDecl(DK, DC, L, Id, 0) {
2226359792ca92e7ca2f416cb804c6604358174e994Ted Kremenek
2236359792ca92e7ca2f416cb804c6604358174e994Ted Kremenek  HasFlexibleArrayMember = false;
2246359792ca92e7ca2f416cb804c6604358174e994Ted Kremenek  assert(classof(static_cast<Decl*>(this)) && "Invalid Kind!");
2256359792ca92e7ca2f416cb804c6604358174e994Ted Kremenek  Members = 0;
226df042e6c2bf06b2d9ed53c52469599ac1bd93a3fTed Kremenek  NumMembers = -1;
2276359792ca92e7ca2f416cb804c6604358174e994Ted Kremenek}
2286359792ca92e7ca2f416cb804c6604358174e994Ted Kremenek
2296359792ca92e7ca2f416cb804c6604358174e994Ted KremenekRecordDecl *RecordDecl::Create(ASTContext &C, TagKind TK, DeclContext *DC,
2304b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek                               SourceLocation L, IdentifierInfo *Id,
2314b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek                               RecordDecl* PrevDecl) {
232df042e6c2bf06b2d9ed53c52469599ac1bd93a3fTed Kremenek
2336359792ca92e7ca2f416cb804c6604358174e994Ted Kremenek  void *Mem = C.getAllocator().Allocate<RecordDecl>();
2346359792ca92e7ca2f416cb804c6604358174e994Ted Kremenek  Kind DK;
2356359792ca92e7ca2f416cb804c6604358174e994Ted Kremenek  switch (TK) {
2366359792ca92e7ca2f416cb804c6604358174e994Ted Kremenek    default: assert(0 && "Invalid TagKind!");
2376359792ca92e7ca2f416cb804c6604358174e994Ted Kremenek    case TK_enum: assert(0 && "Enum TagKind passed for Record!");
2386359792ca92e7ca2f416cb804c6604358174e994Ted Kremenek    case TK_struct: DK = Struct; break;
2396359792ca92e7ca2f416cb804c6604358174e994Ted Kremenek    case TK_union:  DK = Union;  break;
2406359792ca92e7ca2f416cb804c6604358174e994Ted Kremenek    case TK_class:  DK = Class;  break;
2416359792ca92e7ca2f416cb804c6604358174e994Ted Kremenek  }
2424b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek
2434b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek  RecordDecl* R = new (Mem) RecordDecl(DK, DC, L, Id);
2444b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek  C.getTypeDeclType(R, PrevDecl);
2454b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek  return R;
2466359792ca92e7ca2f416cb804c6604358174e994Ted Kremenek}
2476359792ca92e7ca2f416cb804c6604358174e994Ted Kremenek
248997b6c6d73541f010afc81e28191c8eae7b24f77Argyrios KyrtzidisRecordDecl::~RecordDecl() {
249997b6c6d73541f010afc81e28191c8eae7b24f77Argyrios Kyrtzidis  delete[] Members;
250997b6c6d73541f010afc81e28191c8eae7b24f77Argyrios Kyrtzidis}
251997b6c6d73541f010afc81e28191c8eae7b24f77Argyrios Kyrtzidis
252997b6c6d73541f010afc81e28191c8eae7b24f77Argyrios Kyrtzidisvoid RecordDecl::Destroy(ASTContext& C) {
253997b6c6d73541f010afc81e28191c8eae7b24f77Argyrios Kyrtzidis  if (isDefinition())
254997b6c6d73541f010afc81e28191c8eae7b24f77Argyrios Kyrtzidis    for (field_iterator I=field_begin(), E=field_end(); I!=E; ++I)
255997b6c6d73541f010afc81e28191c8eae7b24f77Argyrios Kyrtzidis      (*I)->Destroy(C);
256997b6c6d73541f010afc81e28191c8eae7b24f77Argyrios Kyrtzidis
257997b6c6d73541f010afc81e28191c8eae7b24f77Argyrios Kyrtzidis  TagDecl::Destroy(C);
258997b6c6d73541f010afc81e28191c8eae7b24f77Argyrios Kyrtzidis}
259997b6c6d73541f010afc81e28191c8eae7b24f77Argyrios Kyrtzidis
2605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// defineBody - When created, RecordDecl's correspond to a forward declared
2615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// record.  This method is used to mark the decl as being defined, with the
2625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// specified contents.
2634b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenekvoid RecordDecl::defineBody(ASTContext& C, FieldDecl **members,
2644b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek                            unsigned numMembers) {
2655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  assert(!isDefinition() && "Cannot redefine record!");
2665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  setDefinition(true);
2675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  NumMembers = numMembers;
2685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (numMembers) {
2695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    Members = new FieldDecl*[numMembers];
2705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    memcpy(Members, members, numMembers*sizeof(Decl*));
2715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
2724b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek
2734b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek  // Let ASTContext know that this is the defining RecordDecl this type.
2744b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek  C.setTagDefinition(this);
2755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
2765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2774b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek
2788a934233d1582b5bde9d270bc0705aa81e471a79Chris LattnerFieldDecl *RecordDecl::getMember(IdentifierInfo *II) {
2795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (Members == 0 || NumMembers < 0)
2805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return 0;
2813f5faf7c28a51d920b043fa69e268c6fad78caf8Fariborz Jahanian
2828a934233d1582b5bde9d270bc0705aa81e471a79Chris Lattner  // Linear search.  When C++ classes come along, will likely need to revisit.
2838a934233d1582b5bde9d270bc0705aa81e471a79Chris Lattner  for (int i = 0; i != NumMembers; ++i)
2848a934233d1582b5bde9d270bc0705aa81e471a79Chris Lattner    if (Members[i]->getIdentifier() == II)
2855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      return Members[i];
2865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  return 0;
2876fa5f0943a84233b2e1ec9716eae55643225bfd4Chris Lattner}
288