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