Decl.cpp revision fc767615bc67d3a7587b1fb2e0494c32c9dbd7a5
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" 1799f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes#include "clang/AST/Expr.h" 18e91593ef084479340582b2ba177b44be50a717b7Daniel Dunbar#include "clang/Basic/IdentifierTable.h" 1927f8a28bee33bb0e857cfe1a61c281bbc234b338Ted Kremenek 205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerusing namespace clang; 215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 22d3b9065ec7052ec4741783d2fb4130d13c766933Chris Lattner//===----------------------------------------------------------------------===// 236c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner// Decl Allocation/Deallocation Method Implementations 246c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner//===----------------------------------------------------------------------===// 252d1c5d313cd0c229cc614e74baa4c5756a4b46f4Argyrios Kyrtzidis 26ef177820100ab583b08fd3056e2a5a52ee4b1629Argyrios KyrtzidisTranslationUnitDecl *TranslationUnitDecl::Create(ASTContext &C) { 27ef177820100ab583b08fd3056e2a5a52ee4b1629Argyrios Kyrtzidis void *Mem = C.getAllocator().Allocate<TranslationUnitDecl>(); 28ef177820100ab583b08fd3056e2a5a52ee4b1629Argyrios Kyrtzidis return new (Mem) TranslationUnitDecl(); 29ef177820100ab583b08fd3056e2a5a52ee4b1629Argyrios Kyrtzidis} 30ef177820100ab583b08fd3056e2a5a52ee4b1629Argyrios Kyrtzidis 312d1c5d313cd0c229cc614e74baa4c5756a4b46f4Argyrios KyrtzidisNamespaceDecl *NamespaceDecl::Create(ASTContext &C, DeclContext *DC, 322d1c5d313cd0c229cc614e74baa4c5756a4b46f4Argyrios Kyrtzidis SourceLocation L, IdentifierInfo *Id) { 332d1c5d313cd0c229cc614e74baa4c5756a4b46f4Argyrios Kyrtzidis void *Mem = C.getAllocator().Allocate<NamespaceDecl>(); 342d1c5d313cd0c229cc614e74baa4c5756a4b46f4Argyrios Kyrtzidis return new (Mem) NamespaceDecl(DC, L, Id); 352d1c5d313cd0c229cc614e74baa4c5756a4b46f4Argyrios Kyrtzidis} 362d1c5d313cd0c229cc614e74baa4c5756a4b46f4Argyrios Kyrtzidis 37d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenekvoid NamespaceDecl::Destroy(ASTContext& C) { 38d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenek // NamespaceDecl uses "NextDeclarator" to chain namespace declarations 39d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenek // together. They are all top-level Decls. 40d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenek 41ebf27b1831e6c4d7f4bc30e111a4d6340ff690d1Ted Kremenek this->~NamespaceDecl(); 42d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenek C.getAllocator().Deallocate((void *)this); 43d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenek} 44d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenek 45d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenek 464111024be81e7c0525e42dadcc126d27e5bf2425Chris LattnerImplicitParamDecl *ImplicitParamDecl::Create(ASTContext &C, DeclContext *DC, 474111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner SourceLocation L, IdentifierInfo *Id, QualType T, ScopedDecl *PrevDecl) { 484111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner void *Mem = C.getAllocator().Allocate<ImplicitParamDecl>(); 494111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner return new (Mem) ImplicitParamDecl(ImplicitParam, DC, L, Id, T, PrevDecl); 504111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner} 514111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner 529fdf9c6d3530bb85f3166e6460d841e2ff8e1a2cChris LattnerParmVarDecl *ParmVarDecl::Create(ASTContext &C, DeclContext *DC, 530ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner SourceLocation L, IdentifierInfo *Id, 540ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner QualType T, StorageClass S, 5504421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner Expr *DefArg, ScopedDecl *PrevDecl) { 569e151e154780e9cd443336143af1e996d1f387e5Chris Lattner void *Mem = C.getAllocator().Allocate<ParmVarDecl>(); 574306d3cb9116605728252e2738df24b9f6ab53c3Fariborz Jahanian return new (Mem) ParmVarDecl(ParmVar, DC, L, Id, T, S, DefArg, PrevDecl); 584306d3cb9116605728252e2738df24b9f6ab53c3Fariborz Jahanian} 594306d3cb9116605728252e2738df24b9f6ab53c3Fariborz Jahanian 604306d3cb9116605728252e2738df24b9f6ab53c3Fariborz JahanianQualType ParmVarDecl::getOriginalType() const { 614306d3cb9116605728252e2738df24b9f6ab53c3Fariborz Jahanian if (const ParmVarWithOriginalTypeDecl *PVD = 624306d3cb9116605728252e2738df24b9f6ab53c3Fariborz Jahanian dyn_cast<ParmVarWithOriginalTypeDecl>(this)) 634306d3cb9116605728252e2738df24b9f6ab53c3Fariborz Jahanian return PVD->OriginalType; 644306d3cb9116605728252e2738df24b9f6ab53c3Fariborz Jahanian return getType(); 659e151e154780e9cd443336143af1e996d1f387e5Chris Lattner} 669e151e154780e9cd443336143af1e996d1f387e5Chris Lattner 6773da9e462576faedc2cdf96b37a1c072b404b73dFariborz JahanianParmVarWithOriginalTypeDecl *ParmVarWithOriginalTypeDecl::Create( 6873da9e462576faedc2cdf96b37a1c072b404b73dFariborz Jahanian ASTContext &C, DeclContext *DC, 6973da9e462576faedc2cdf96b37a1c072b404b73dFariborz Jahanian SourceLocation L, IdentifierInfo *Id, 7073da9e462576faedc2cdf96b37a1c072b404b73dFariborz Jahanian QualType T, QualType OT, StorageClass S, 7173da9e462576faedc2cdf96b37a1c072b404b73dFariborz Jahanian Expr *DefArg, ScopedDecl *PrevDecl) { 7273da9e462576faedc2cdf96b37a1c072b404b73dFariborz Jahanian void *Mem = C.getAllocator().Allocate<ParmVarWithOriginalTypeDecl>(); 7373da9e462576faedc2cdf96b37a1c072b404b73dFariborz Jahanian return new (Mem) ParmVarWithOriginalTypeDecl(DC, L, Id, T, OT, S, 7473da9e462576faedc2cdf96b37a1c072b404b73dFariborz Jahanian DefArg, PrevDecl); 7573da9e462576faedc2cdf96b37a1c072b404b73dFariborz Jahanian} 7673da9e462576faedc2cdf96b37a1c072b404b73dFariborz Jahanian 779fdf9c6d3530bb85f3166e6460d841e2ff8e1a2cChris LattnerFunctionDecl *FunctionDecl::Create(ASTContext &C, DeclContext *DC, 780ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner SourceLocation L, 7910bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor DeclarationName N, QualType T, 80a98e58ddb4696a0020fe97439d5295413f9e90b1Chris Lattner StorageClass S, bool isInline, 810eb07bfde0deedcb35cf3d118b3488f5d8db32ecSteve Naroff ScopedDecl *PrevDecl, 820eb07bfde0deedcb35cf3d118b3488f5d8db32ecSteve Naroff SourceLocation TypeSpecStartLoc) { 83a98e58ddb4696a0020fe97439d5295413f9e90b1Chris Lattner void *Mem = C.getAllocator().Allocate<FunctionDecl>(); 8410bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor return new (Mem) FunctionDecl(Function, DC, L, N, T, S, isInline, PrevDecl, 850eb07bfde0deedcb35cf3d118b3488f5d8db32ecSteve Naroff TypeSpecStartLoc); 86a98e58ddb4696a0020fe97439d5295413f9e90b1Chris Lattner} 87a98e58ddb4696a0020fe97439d5295413f9e90b1Chris Lattner 88090276f5e164d491a1bb3f541bafdb394f5e6f04Steve NaroffBlockDecl *BlockDecl::Create(ASTContext &C, DeclContext *DC, SourceLocation L) { 8956ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff void *Mem = C.getAllocator().Allocate<BlockDecl>(); 90090276f5e164d491a1bb3f541bafdb394f5e6f04Steve Naroff return new (Mem) BlockDecl(DC, L); 9156ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff} 9256ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff 9344b4321feab46299d3f5cfd404680884752a0fcfDouglas GregorFieldDecl *FieldDecl::Create(ASTContext &C, DeclContext *DC, SourceLocation L, 9444b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor IdentifierInfo *Id, QualType T, Expr *BW, 9544b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor bool Mutable, ScopedDecl *PrevDecl) { 968e25d8681822d8094bfeb97b2239363552548171Chris Lattner void *Mem = C.getAllocator().Allocate<FieldDecl>(); 9744b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor return new (Mem) FieldDecl(Decl::Field, DC, L, Id, T, BW, Mutable, PrevDecl); 988e25d8681822d8094bfeb97b2239363552548171Chris Lattner} 998e25d8681822d8094bfeb97b2239363552548171Chris Lattner 1006b3945f4bc757bdadd3e443180cf32c2cccb52a0Douglas Gregorbool FieldDecl::isAnonymousStructOrUnion() const { 1016b3945f4bc757bdadd3e443180cf32c2cccb52a0Douglas Gregor if (!isImplicit() || getDeclName()) 1026b3945f4bc757bdadd3e443180cf32c2cccb52a0Douglas Gregor return false; 1036b3945f4bc757bdadd3e443180cf32c2cccb52a0Douglas Gregor 1046b3945f4bc757bdadd3e443180cf32c2cccb52a0Douglas Gregor if (const RecordType *Record = getType()->getAsRecordType()) 1056b3945f4bc757bdadd3e443180cf32c2cccb52a0Douglas Gregor return Record->getDecl()->isAnonymousStructOrUnion(); 1066b3945f4bc757bdadd3e443180cf32c2cccb52a0Douglas Gregor 1076b3945f4bc757bdadd3e443180cf32c2cccb52a0Douglas Gregor return false; 1086b3945f4bc757bdadd3e443180cf32c2cccb52a0Douglas Gregor} 109a98e58ddb4696a0020fe97439d5295413f9e90b1Chris Lattner 1100ed844b04ea4387caa4e1cf3dc375d269657536bChris LattnerEnumConstantDecl *EnumConstantDecl::Create(ASTContext &C, EnumDecl *CD, 1110ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner SourceLocation L, 112c63e660882ff93841fa234d70ef6757038302b92Chris Lattner IdentifierInfo *Id, QualType T, 113c63e660882ff93841fa234d70ef6757038302b92Chris Lattner Expr *E, const llvm::APSInt &V, 114c63e660882ff93841fa234d70ef6757038302b92Chris Lattner ScopedDecl *PrevDecl){ 1156c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner void *Mem = C.getAllocator().Allocate<EnumConstantDecl>(); 1160ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner return new (Mem) EnumConstantDecl(CD, L, Id, T, E, V, PrevDecl); 1176c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner} 1186c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner 119d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenekvoid EnumConstantDecl::Destroy(ASTContext& C) { 120d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenek if (Init) Init->Destroy(C); 121d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenek Decl::Destroy(C); 122d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenek} 123d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenek 1249fdf9c6d3530bb85f3166e6460d841e2ff8e1a2cChris LattnerTypedefDecl *TypedefDecl::Create(ASTContext &C, DeclContext *DC, 1250ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner SourceLocation L, 126c63e660882ff93841fa234d70ef6757038302b92Chris Lattner IdentifierInfo *Id, QualType T, 127c63e660882ff93841fa234d70ef6757038302b92Chris Lattner ScopedDecl *PD) { 1286c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner void *Mem = C.getAllocator().Allocate<TypedefDecl>(); 1299fdf9c6d3530bb85f3166e6460d841e2ff8e1a2cChris Lattner return new (Mem) TypedefDecl(DC, L, Id, T, PD); 1306c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner} 1316c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner 1329fdf9c6d3530bb85f3166e6460d841e2ff8e1a2cChris LattnerEnumDecl *EnumDecl::Create(ASTContext &C, DeclContext *DC, SourceLocation L, 1330ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner IdentifierInfo *Id, 1347df7b6bb800e1987951285ea192e4f347e1b603aDouglas Gregor EnumDecl *PrevDecl) { 1356c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner void *Mem = C.getAllocator().Allocate<EnumDecl>(); 1367df7b6bb800e1987951285ea192e4f347e1b603aDouglas Gregor EnumDecl *Enum = new (Mem) EnumDecl(DC, L, Id, 0); 1377df7b6bb800e1987951285ea192e4f347e1b603aDouglas Gregor C.getTypeDeclType(Enum, PrevDecl); 1387df7b6bb800e1987951285ea192e4f347e1b603aDouglas Gregor return Enum; 1396c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner} 1406c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner 141df91eca19bd9738abd9a3b84791f39750e27ad36Ted Kremenekvoid EnumDecl::Destroy(ASTContext& C) { 142df91eca19bd9738abd9a3b84791f39750e27ad36Ted Kremenek Decl::Destroy(C); 143df91eca19bd9738abd9a3b84791f39750e27ad36Ted Kremenek} 144df91eca19bd9738abd9a3b84791f39750e27ad36Ted Kremenek 14544b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregorvoid EnumDecl::completeDefinition(ASTContext &C, QualType NewType) { 14644b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor assert(!isDefinition() && "Cannot redefine enums!"); 14744b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor setDefinition(true); 14844b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 14944b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor IntegerType = NewType; 15044b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 15144b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor // Let ASTContext know that this is the defining EnumDecl for this 15244b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor // type. 15344b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor C.setTagDefinition(this); 15444b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor} 15544b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 1560ed844b04ea4387caa4e1cf3dc375d269657536bChris LattnerFileScopeAsmDecl *FileScopeAsmDecl::Create(ASTContext &C, 1570ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner SourceLocation L, 1588e25d8681822d8094bfeb97b2239363552548171Chris Lattner StringLiteral *Str) { 1598e25d8681822d8094bfeb97b2239363552548171Chris Lattner void *Mem = C.getAllocator().Allocate<FileScopeAsmDecl>(); 1608e25d8681822d8094bfeb97b2239363552548171Chris Lattner return new (Mem) FileScopeAsmDecl(L, Str); 1618e25d8681822d8094bfeb97b2239363552548171Chris Lattner} 1628e25d8681822d8094bfeb97b2239363552548171Chris Lattner 1636c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner//===----------------------------------------------------------------------===// 1645239304ff761b8b03eefb772bd5d830a9b9f1aeaArgyrios Kyrtzidis// ScopedDecl Implementation 1655239304ff761b8b03eefb772bd5d830a9b9f1aeaArgyrios Kyrtzidis//===----------------------------------------------------------------------===// 1665239304ff761b8b03eefb772bd5d830a9b9f1aeaArgyrios Kyrtzidis 167a8cc8ce044e5d2589128f0c1a84e586cce743b27Douglas Gregorvoid ScopedDecl::setDeclContext(DeclContext *DC) { 168a8cc8ce044e5d2589128f0c1a84e586cce743b27Douglas Gregor if (isOutOfSemaDC()) 169a8cc8ce044e5d2589128f0c1a84e586cce743b27Douglas Gregor delete getMultipleDC(); 170a8cc8ce044e5d2589128f0c1a84e586cce743b27Douglas Gregor 171a8cc8ce044e5d2589128f0c1a84e586cce743b27Douglas Gregor DeclCtx = reinterpret_cast<uintptr_t>(DC); 172a8cc8ce044e5d2589128f0c1a84e586cce743b27Douglas Gregor} 173a8cc8ce044e5d2589128f0c1a84e586cce743b27Douglas Gregor 1745239304ff761b8b03eefb772bd5d830a9b9f1aeaArgyrios Kyrtzidisvoid ScopedDecl::setLexicalDeclContext(DeclContext *DC) { 1755239304ff761b8b03eefb772bd5d830a9b9f1aeaArgyrios Kyrtzidis if (DC == getLexicalDeclContext()) 1765239304ff761b8b03eefb772bd5d830a9b9f1aeaArgyrios Kyrtzidis return; 1775239304ff761b8b03eefb772bd5d830a9b9f1aeaArgyrios Kyrtzidis 1785239304ff761b8b03eefb772bd5d830a9b9f1aeaArgyrios Kyrtzidis if (isInSemaDC()) { 1795239304ff761b8b03eefb772bd5d830a9b9f1aeaArgyrios Kyrtzidis MultipleDC *MDC = new MultipleDC(); 1805239304ff761b8b03eefb772bd5d830a9b9f1aeaArgyrios Kyrtzidis MDC->SemanticDC = getDeclContext(); 1815239304ff761b8b03eefb772bd5d830a9b9f1aeaArgyrios Kyrtzidis MDC->LexicalDC = DC; 1825239304ff761b8b03eefb772bd5d830a9b9f1aeaArgyrios Kyrtzidis DeclCtx = reinterpret_cast<uintptr_t>(MDC) | 0x1; 1835239304ff761b8b03eefb772bd5d830a9b9f1aeaArgyrios Kyrtzidis } else { 1845239304ff761b8b03eefb772bd5d830a9b9f1aeaArgyrios Kyrtzidis getMultipleDC()->LexicalDC = DC; 1855239304ff761b8b03eefb772bd5d830a9b9f1aeaArgyrios Kyrtzidis } 1865239304ff761b8b03eefb772bd5d830a9b9f1aeaArgyrios Kyrtzidis} 1875239304ff761b8b03eefb772bd5d830a9b9f1aeaArgyrios Kyrtzidis 1885239304ff761b8b03eefb772bd5d830a9b9f1aeaArgyrios KyrtzidisScopedDecl::~ScopedDecl() { 1895239304ff761b8b03eefb772bd5d830a9b9f1aeaArgyrios Kyrtzidis if (isOutOfSemaDC()) 1905239304ff761b8b03eefb772bd5d830a9b9f1aeaArgyrios Kyrtzidis delete getMultipleDC(); 1915239304ff761b8b03eefb772bd5d830a9b9f1aeaArgyrios Kyrtzidis} 1925239304ff761b8b03eefb772bd5d830a9b9f1aeaArgyrios Kyrtzidis 1936ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregorbool ScopedDecl::declarationReplaces(NamedDecl *OldD) const { 1946ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor assert(getDeclName() == OldD->getDeclName() && "Declaration name mismatch"); 1956ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor 1966ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(this)) 1976ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor // For function declarations, we keep track of redeclarations. 1986ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor return FD->getPreviousDeclaration() == OldD; 1996ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor 2006ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor // For non-function declarations, if the declarations are of the 2016ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor // same kind then this must be a redeclaration, or semantic analysis 2026ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor // would not have given us the new declaration. 2036ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor return this->getKind() == OldD->getKind(); 2046ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor} 2056ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor 2065239304ff761b8b03eefb772bd5d830a9b9f1aeaArgyrios Kyrtzidis//===----------------------------------------------------------------------===// 20799f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes// VarDecl Implementation 20899f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes//===----------------------------------------------------------------------===// 20999f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes 21099f06ba988922ea721035a89e6d3c66ba100ba8aNuno LopesVarDecl *VarDecl::Create(ASTContext &C, DeclContext *DC, 21199f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes SourceLocation L, 21299f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes IdentifierInfo *Id, QualType T, 21399f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes StorageClass S, ScopedDecl *PrevDecl, 21499f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes SourceLocation TypeSpecStartLoc) { 21599f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes void *Mem = C.getAllocator().Allocate<VarDecl>(); 21699f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes return new (Mem) VarDecl(Var, DC, L, Id, T, S, PrevDecl, TypeSpecStartLoc); 21799f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes} 21899f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes 21999f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopesvoid VarDecl::Destroy(ASTContext& C) { 22099f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes this->~VarDecl(); 22199f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes C.getAllocator().Deallocate((void *)this); 22299f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes} 22399f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes 22499f06ba988922ea721035a89e6d3c66ba100ba8aNuno LopesVarDecl::~VarDecl() { 22599f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes delete getInit(); 22699f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes} 22799f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes 22899f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes//===----------------------------------------------------------------------===// 2298a934233d1582b5bde9d270bc0705aa81e471a79Chris Lattner// FunctionDecl Implementation 2308a934233d1582b5bde9d270bc0705aa81e471a79Chris Lattner//===----------------------------------------------------------------------===// 2318a934233d1582b5bde9d270bc0705aa81e471a79Chris Lattner 2325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid SpencerFunctionDecl::~FunctionDecl() { 2335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer delete[] ParamInfo; 234f009795057dc8ca254f5618c80a0a90f07cd44b4Douglas Gregor} 235f009795057dc8ca254f5618c80a0a90f07cd44b4Douglas Gregor 23627f8a28bee33bb0e857cfe1a61c281bbc234b338Ted Kremenekvoid FunctionDecl::Destroy(ASTContext& C) { 237b65cf41707d190d5ce3d48b9e5bd2dc9d7b4a4c0Ted Kremenek if (Body) 238b65cf41707d190d5ce3d48b9e5bd2dc9d7b4a4c0Ted Kremenek Body->Destroy(C); 239b65cf41707d190d5ce3d48b9e5bd2dc9d7b4a4c0Ted Kremenek 240b65cf41707d190d5ce3d48b9e5bd2dc9d7b4a4c0Ted Kremenek for (param_iterator I=param_begin(), E=param_end(); I!=E; ++I) 241b65cf41707d190d5ce3d48b9e5bd2dc9d7b4a4c0Ted Kremenek (*I)->Destroy(C); 242b65cf41707d190d5ce3d48b9e5bd2dc9d7b4a4c0Ted Kremenek 24327f8a28bee33bb0e857cfe1a61c281bbc234b338Ted Kremenek Decl::Destroy(C); 24427f8a28bee33bb0e857cfe1a61c281bbc234b338Ted Kremenek} 24527f8a28bee33bb0e857cfe1a61c281bbc234b338Ted Kremenek 24627f8a28bee33bb0e857cfe1a61c281bbc234b338Ted Kremenek 247f009795057dc8ca254f5618c80a0a90f07cd44b4Douglas GregorStmt *FunctionDecl::getBody(const FunctionDecl *&Definition) const { 248f009795057dc8ca254f5618c80a0a90f07cd44b4Douglas Gregor for (const FunctionDecl *FD = this; FD != 0; FD = FD->PreviousDeclaration) { 249f009795057dc8ca254f5618c80a0a90f07cd44b4Douglas Gregor if (FD->Body) { 250f009795057dc8ca254f5618c80a0a90f07cd44b4Douglas Gregor Definition = FD; 251f009795057dc8ca254f5618c80a0a90f07cd44b4Douglas Gregor return FD->Body; 252f009795057dc8ca254f5618c80a0a90f07cd44b4Douglas Gregor } 253f009795057dc8ca254f5618c80a0a90f07cd44b4Douglas Gregor } 254f009795057dc8ca254f5618c80a0a90f07cd44b4Douglas Gregor 255f009795057dc8ca254f5618c80a0a90f07cd44b4Douglas Gregor return 0; 2565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 2575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 2584f03fd61ee45245dd3a1552a023e730d56c2e697Ted Kremenek// Helper function for FunctionDecl::getNumParams and FunctionDecl::setParams() 2594f03fd61ee45245dd3a1552a023e730d56c2e697Ted Kremenekstatic unsigned getNumTypeParams(QualType T) { 2604f03fd61ee45245dd3a1552a023e730d56c2e697Ted Kremenek const FunctionType *FT = T->getAsFunctionType(); 261d8bdba5d3534b87cae606d559933bc62752e8828Chris Lattner if (isa<FunctionTypeNoProto>(FT)) 262d3b9065ec7052ec4741783d2fb4130d13c766933Chris Lattner return 0; 263d8bdba5d3534b87cae606d559933bc62752e8828Chris Lattner return cast<FunctionTypeProto>(FT)->getNumArgs(); 2645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 2655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 2664f03fd61ee45245dd3a1552a023e730d56c2e697Ted Kremenekunsigned FunctionDecl::getNumParams() const { 2674f03fd61ee45245dd3a1552a023e730d56c2e697Ted Kremenek // Can happen if a FunctionDecl is declared using typeof(some_other_func) bar; 2684f03fd61ee45245dd3a1552a023e730d56c2e697Ted Kremenek if (!ParamInfo) 2694f03fd61ee45245dd3a1552a023e730d56c2e697Ted Kremenek return 0; 2704f03fd61ee45245dd3a1552a023e730d56c2e697Ted Kremenek 2714f03fd61ee45245dd3a1552a023e730d56c2e697Ted Kremenek return getNumTypeParams(getType()); 2724f03fd61ee45245dd3a1552a023e730d56c2e697Ted Kremenek} 2734f03fd61ee45245dd3a1552a023e730d56c2e697Ted Kremenek 274fc767615bc67d3a7587b1fb2e0494c32c9dbd7a5Ted Kremenekvoid FunctionDecl::setParams(ASTContext& C, ParmVarDecl **NewParamInfo, 275fc767615bc67d3a7587b1fb2e0494c32c9dbd7a5Ted Kremenek unsigned NumParams) { 2765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer assert(ParamInfo == 0 && "Already has param info!"); 2774f03fd61ee45245dd3a1552a023e730d56c2e697Ted Kremenek assert(NumParams == getNumTypeParams(getType()) && 2784f03fd61ee45245dd3a1552a023e730d56c2e697Ted Kremenek "Parameter count mismatch!"); 2795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 2805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Zero params -> null pointer. 2815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (NumParams) { 282fc767615bc67d3a7587b1fb2e0494c32c9dbd7a5Ted Kremenek void *Mem = C.getAllocator().Allocate<ParmVarDecl*>(NumParams); 283fc767615bc67d3a7587b1fb2e0494c32c9dbd7a5Ted Kremenek ParamInfo = new (Mem) ParmVarDecl*[NumParams]; 2845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer memcpy(ParamInfo, NewParamInfo, sizeof(ParmVarDecl*)*NumParams); 2855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 2865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 2875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 2888123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner/// getMinRequiredArguments - Returns the minimum number of arguments 2898123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner/// needed to call this function. This may be fewer than the number of 2908123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner/// function parameters, if some of the parameters have default 2919e979557eea3875c9e3d100c68188233dd7f46c0Chris Lattner/// arguments (in C++). 2928123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattnerunsigned FunctionDecl::getMinRequiredArguments() const { 2938123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner unsigned NumRequiredArgs = getNumParams(); 2948123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner while (NumRequiredArgs > 0 2958123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner && getParamDecl(NumRequiredArgs-1)->getDefaultArg()) 2968123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner --NumRequiredArgs; 2978123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner 2988123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner return NumRequiredArgs; 2998123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner} 3008123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner 3011cd1b1e987f5e2f060d7972b13d83239b36d77d6Douglas Gregor/// getOverloadedOperator - Which C++ overloaded operator this 3021cd1b1e987f5e2f060d7972b13d83239b36d77d6Douglas Gregor/// function represents, if any. 3031cd1b1e987f5e2f060d7972b13d83239b36d77d6Douglas GregorOverloadedOperatorKind FunctionDecl::getOverloadedOperator() const { 304e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor if (getDeclName().getNameKind() == DeclarationName::CXXOperatorName) 305e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor return getDeclName().getCXXOverloadedOperator(); 3061cd1b1e987f5e2f060d7972b13d83239b36d77d6Douglas Gregor else 3071cd1b1e987f5e2f060d7972b13d83239b36d77d6Douglas Gregor return OO_None; 3081cd1b1e987f5e2f060d7972b13d83239b36d77d6Douglas Gregor} 3091cd1b1e987f5e2f060d7972b13d83239b36d77d6Douglas Gregor 3108a934233d1582b5bde9d270bc0705aa81e471a79Chris Lattner//===----------------------------------------------------------------------===// 311bcbffc46f1ad3796c4582fa1e3a9113b5aa26061Douglas Gregor// TagDecl Implementation 3124b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek//===----------------------------------------------------------------------===// 3134b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek 3144b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed KremenekTagDecl* TagDecl::getDefinition(ASTContext& C) const { 3154b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek QualType T = C.getTypeDeclType(const_cast<TagDecl*>(this)); 3164b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek TagDecl* D = cast<TagDecl>(cast<TagType>(T)->getDecl()); 3174b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek return D->isDefinition() ? D : 0; 3184b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek} 3194b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek 3204b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek//===----------------------------------------------------------------------===// 3218a934233d1582b5bde9d270bc0705aa81e471a79Chris Lattner// RecordDecl Implementation 3228a934233d1582b5bde9d270bc0705aa81e471a79Chris Lattner//===----------------------------------------------------------------------===// 3235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 32435bc0821c4f80041724cd4c5c4889b2581546a41Argyrios KyrtzidisRecordDecl::RecordDecl(Kind DK, TagKind TK, DeclContext *DC, SourceLocation L, 325df042e6c2bf06b2d9ed53c52469599ac1bd93a3fTed Kremenek IdentifierInfo *Id) 32672de6676bd30f9081ee4166bbe07b4c270258ce6Douglas Gregor : TagDecl(DK, TK, DC, L, Id, 0) { 3276359792ca92e7ca2f416cb804c6604358174e994Ted Kremenek HasFlexibleArrayMember = false; 328bcbffc46f1ad3796c4582fa1e3a9113b5aa26061Douglas Gregor AnonymousStructOrUnion = false; 3296359792ca92e7ca2f416cb804c6604358174e994Ted Kremenek assert(classof(static_cast<Decl*>(this)) && "Invalid Kind!"); 3306359792ca92e7ca2f416cb804c6604358174e994Ted Kremenek} 3316359792ca92e7ca2f416cb804c6604358174e994Ted Kremenek 3326359792ca92e7ca2f416cb804c6604358174e994Ted KremenekRecordDecl *RecordDecl::Create(ASTContext &C, TagKind TK, DeclContext *DC, 3334b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek SourceLocation L, IdentifierInfo *Id, 3344b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek RecordDecl* PrevDecl) { 335df042e6c2bf06b2d9ed53c52469599ac1bd93a3fTed Kremenek 3366359792ca92e7ca2f416cb804c6604358174e994Ted Kremenek void *Mem = C.getAllocator().Allocate<RecordDecl>(); 33735bc0821c4f80041724cd4c5c4889b2581546a41Argyrios Kyrtzidis RecordDecl* R = new (Mem) RecordDecl(Record, TK, DC, L, Id); 3384b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek C.getTypeDeclType(R, PrevDecl); 3394b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek return R; 3406359792ca92e7ca2f416cb804c6604358174e994Ted Kremenek} 3416359792ca92e7ca2f416cb804c6604358174e994Ted Kremenek 342997b6c6d73541f010afc81e28191c8eae7b24f77Argyrios KyrtzidisRecordDecl::~RecordDecl() { 343997b6c6d73541f010afc81e28191c8eae7b24f77Argyrios Kyrtzidis} 344997b6c6d73541f010afc81e28191c8eae7b24f77Argyrios Kyrtzidis 345997b6c6d73541f010afc81e28191c8eae7b24f77Argyrios Kyrtzidisvoid RecordDecl::Destroy(ASTContext& C) { 34644b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor DeclContext::DestroyDecls(C); 347997b6c6d73541f010afc81e28191c8eae7b24f77Argyrios Kyrtzidis TagDecl::Destroy(C); 348997b6c6d73541f010afc81e28191c8eae7b24f77Argyrios Kyrtzidis} 349997b6c6d73541f010afc81e28191c8eae7b24f77Argyrios Kyrtzidis 35044b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor/// completeDefinition - Notes that the definition of this type is now 35144b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor/// complete. 35244b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregorvoid RecordDecl::completeDefinition(ASTContext& C) { 3535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer assert(!isDefinition() && "Cannot redefine record!"); 35444b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 3555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer setDefinition(true); 3564b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek 35744b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor // Let ASTContext know that this is the defining RecordDecl for this 35844b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor // type. 3594b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek C.setTagDefinition(this); 3605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 3615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 36256ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff//===----------------------------------------------------------------------===// 36356ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff// BlockDecl Implementation 36456ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff//===----------------------------------------------------------------------===// 36556ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff 36656ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve NaroffBlockDecl::~BlockDecl() { 36756ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff} 36856ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff 36956ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroffvoid BlockDecl::Destroy(ASTContext& C) { 37056ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff if (Body) 37156ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff Body->Destroy(C); 37256ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff 37356ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff for (param_iterator I=param_begin(), E=param_end(); I!=E; ++I) 37456ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff (*I)->Destroy(C); 37556ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff 37656ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff Decl::Destroy(C); 37756ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff} 378