Decl.cpp revision 1637be727f2a0434c1ed7aa385ea1c18328b0ccd
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" 152a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor#include "clang/AST/DeclCXX.h" 160de21fd85d79bccd32f04256f5b3328ab5ed7c95Steve Naroff#include "clang/AST/DeclObjC.h" 177da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor#include "clang/AST/DeclTemplate.h" 186c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner#include "clang/AST/ASTContext.h" 19e91593ef084479340582b2ba177b44be50a717b7Daniel Dunbar#include "clang/AST/Stmt.h" 2099f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes#include "clang/AST/Expr.h" 21d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor#include "clang/AST/PrettyPrinter.h" 221b63e4f732dbc73d90abf886b4d21f8e3a165f6dChris Lattner#include "clang/Basic/Builtins.h" 23e91593ef084479340582b2ba177b44be50a717b7Daniel Dunbar#include "clang/Basic/IdentifierTable.h" 2447b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor#include <vector> 2527f8a28bee33bb0e857cfe1a61c281bbc234b338Ted Kremenek 265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerusing namespace clang; 275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 280b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattnervoid Attr::Destroy(ASTContext &C) { 290b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner if (Next) { 300b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner Next->Destroy(C); 310b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner Next = 0; 320b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner } 330b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner this->~Attr(); 340b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner C.Deallocate((void*)this); 350b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner} 360b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner 370b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner 38d3b9065ec7052ec4741783d2fb4130d13c766933Chris Lattner//===----------------------------------------------------------------------===// 396c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner// Decl Allocation/Deallocation Method Implementations 406c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner//===----------------------------------------------------------------------===// 412d1c5d313cd0c229cc614e74baa4c5756a4b46f4Argyrios Kyrtzidis 420b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner 43ef177820100ab583b08fd3056e2a5a52ee4b1629Argyrios KyrtzidisTranslationUnitDecl *TranslationUnitDecl::Create(ASTContext &C) { 443e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff return new (C) TranslationUnitDecl(); 45ef177820100ab583b08fd3056e2a5a52ee4b1629Argyrios Kyrtzidis} 46ef177820100ab583b08fd3056e2a5a52ee4b1629Argyrios Kyrtzidis 472d1c5d313cd0c229cc614e74baa4c5756a4b46f4Argyrios KyrtzidisNamespaceDecl *NamespaceDecl::Create(ASTContext &C, DeclContext *DC, 482d1c5d313cd0c229cc614e74baa4c5756a4b46f4Argyrios Kyrtzidis SourceLocation L, IdentifierInfo *Id) { 493e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff return new (C) NamespaceDecl(DC, L, Id); 502d1c5d313cd0c229cc614e74baa4c5756a4b46f4Argyrios Kyrtzidis} 512d1c5d313cd0c229cc614e74baa4c5756a4b46f4Argyrios Kyrtzidis 52d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenekvoid NamespaceDecl::Destroy(ASTContext& C) { 53d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenek // NamespaceDecl uses "NextDeclarator" to chain namespace declarations 54d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenek // together. They are all top-level Decls. 55d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenek 56ebf27b1831e6c4d7f4bc30e111a4d6340ff690d1Ted Kremenek this->~NamespaceDecl(); 573e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff C.Deallocate((void *)this); 58d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenek} 59d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenek 60d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenek 614111024be81e7c0525e42dadcc126d27e5bf2425Chris LattnerImplicitParamDecl *ImplicitParamDecl::Create(ASTContext &C, DeclContext *DC, 624afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor SourceLocation L, IdentifierInfo *Id, QualType T) { 633e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff return new (C) ImplicitParamDecl(ImplicitParam, DC, L, Id, T); 644111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner} 654111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner 66b286a78c8cce4592306dae6abc3656daf6379c77Daniel Dunbarconst char *VarDecl::getStorageClassSpecifierString(StorageClass SC) { 67b286a78c8cce4592306dae6abc3656daf6379c77Daniel Dunbar switch (SC) { 68b286a78c8cce4592306dae6abc3656daf6379c77Daniel Dunbar case VarDecl::None: break; 69b286a78c8cce4592306dae6abc3656daf6379c77Daniel Dunbar case VarDecl::Auto: return "auto"; break; 70b286a78c8cce4592306dae6abc3656daf6379c77Daniel Dunbar case VarDecl::Extern: return "extern"; break; 71b286a78c8cce4592306dae6abc3656daf6379c77Daniel Dunbar case VarDecl::PrivateExtern: return "__private_extern__"; break; 72b286a78c8cce4592306dae6abc3656daf6379c77Daniel Dunbar case VarDecl::Register: return "register"; break; 73b286a78c8cce4592306dae6abc3656daf6379c77Daniel Dunbar case VarDecl::Static: return "static"; break; 74b286a78c8cce4592306dae6abc3656daf6379c77Daniel Dunbar } 75b286a78c8cce4592306dae6abc3656daf6379c77Daniel Dunbar 76b286a78c8cce4592306dae6abc3656daf6379c77Daniel Dunbar assert(0 && "Invalid storage class"); 77b286a78c8cce4592306dae6abc3656daf6379c77Daniel Dunbar return 0; 78b286a78c8cce4592306dae6abc3656daf6379c77Daniel Dunbar} 79b286a78c8cce4592306dae6abc3656daf6379c77Daniel Dunbar 809fdf9c6d3530bb85f3166e6460d841e2ff8e1a2cChris LattnerParmVarDecl *ParmVarDecl::Create(ASTContext &C, DeclContext *DC, 810ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner SourceLocation L, IdentifierInfo *Id, 820ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner QualType T, StorageClass S, 834afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor Expr *DefArg) { 843e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff return new (C) ParmVarDecl(ParmVar, DC, L, Id, T, S, DefArg); 854306d3cb9116605728252e2738df24b9f6ab53c3Fariborz Jahanian} 864306d3cb9116605728252e2738df24b9f6ab53c3Fariborz Jahanian 874306d3cb9116605728252e2738df24b9f6ab53c3Fariborz JahanianQualType ParmVarDecl::getOriginalType() const { 8864650af7cc4352c6c67b9bd1bf8ef3ce7471b910Douglas Gregor if (const OriginalParmVarDecl *PVD = 8964650af7cc4352c6c67b9bd1bf8ef3ce7471b910Douglas Gregor dyn_cast<OriginalParmVarDecl>(this)) 904306d3cb9116605728252e2738df24b9f6ab53c3Fariborz Jahanian return PVD->OriginalType; 914306d3cb9116605728252e2738df24b9f6ab53c3Fariborz Jahanian return getType(); 929e151e154780e9cd443336143af1e996d1f387e5Chris Lattner} 939e151e154780e9cd443336143af1e996d1f387e5Chris Lattner 9478d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregorvoid VarDecl::setInit(ASTContext &C, Expr *I) { 9578d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor if (EvaluatedStmt *Eval = Init.dyn_cast<EvaluatedStmt *>()) { 9678d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor Eval->~EvaluatedStmt(); 9778d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor C.Deallocate(Eval); 9878d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor } 9978d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor 10078d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor Init = I; 10178d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor } 10278d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor 1036393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregorbool VarDecl::isExternC(ASTContext &Context) const { 1046393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor if (!Context.getLangOptions().CPlusPlus) 1056393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor return (getDeclContext()->isTranslationUnit() && 1066393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor getStorageClass() != Static) || 1076393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor (getDeclContext()->isFunctionOrMethod() && hasExternalStorage()); 1086393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor 1096393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor for (const DeclContext *DC = getDeclContext(); !DC->isTranslationUnit(); 1106393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor DC = DC->getParent()) { 1116393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor if (const LinkageSpecDecl *Linkage = dyn_cast<LinkageSpecDecl>(DC)) { 1126393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor if (Linkage->getLanguage() == LinkageSpecDecl::lang_c) 1136393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor return getStorageClass() != Static; 1146393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor 1156393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor break; 1166393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor } 1176393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor 1186393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor if (DC->isFunctionOrMethod()) 1196393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor return false; 1206393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor } 1216393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor 1226393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor return false; 1236393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor} 1246393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor 12564650af7cc4352c6c67b9bd1bf8ef3ce7471b910Douglas GregorOriginalParmVarDecl *OriginalParmVarDecl::Create( 12673da9e462576faedc2cdf96b37a1c072b404b73dFariborz Jahanian ASTContext &C, DeclContext *DC, 12773da9e462576faedc2cdf96b37a1c072b404b73dFariborz Jahanian SourceLocation L, IdentifierInfo *Id, 12873da9e462576faedc2cdf96b37a1c072b404b73dFariborz Jahanian QualType T, QualType OT, StorageClass S, 1294afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor Expr *DefArg) { 13064650af7cc4352c6c67b9bd1bf8ef3ce7471b910Douglas Gregor return new (C) OriginalParmVarDecl(DC, L, Id, T, OT, S, DefArg); 13173da9e462576faedc2cdf96b37a1c072b404b73dFariborz Jahanian} 13273da9e462576faedc2cdf96b37a1c072b404b73dFariborz Jahanian 1339fdf9c6d3530bb85f3166e6460d841e2ff8e1a2cChris LattnerFunctionDecl *FunctionDecl::Create(ASTContext &C, DeclContext *DC, 1340ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner SourceLocation L, 13510bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor DeclarationName N, QualType T, 136a98e58ddb4696a0020fe97439d5295413f9e90b1Chris Lattner StorageClass S, bool isInline, 137a75e8534f2b7c2480c48f31f301bd00b241c5499Anders Carlsson bool hasWrittenPrototype, 1380eb07bfde0deedcb35cf3d118b3488f5d8db32ecSteve Naroff SourceLocation TypeSpecStartLoc) { 1392224f84658fb9b3725a31f2680edb64ae73bf705Douglas Gregor FunctionDecl *New 1402224f84658fb9b3725a31f2680edb64ae73bf705Douglas Gregor = new (C) FunctionDecl(Function, DC, L, N, T, S, isInline, 1412224f84658fb9b3725a31f2680edb64ae73bf705Douglas Gregor TypeSpecStartLoc); 142a75e8534f2b7c2480c48f31f301bd00b241c5499Anders Carlsson New->HasWrittenPrototype = hasWrittenPrototype; 1432224f84658fb9b3725a31f2680edb64ae73bf705Douglas Gregor return New; 144a98e58ddb4696a0020fe97439d5295413f9e90b1Chris Lattner} 145a98e58ddb4696a0020fe97439d5295413f9e90b1Chris Lattner 146090276f5e164d491a1bb3f541bafdb394f5e6f04Steve NaroffBlockDecl *BlockDecl::Create(ASTContext &C, DeclContext *DC, SourceLocation L) { 1473e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff return new (C) BlockDecl(DC, L); 14856ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff} 14956ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff 15044b4321feab46299d3f5cfd404680884752a0fcfDouglas GregorFieldDecl *FieldDecl::Create(ASTContext &C, DeclContext *DC, SourceLocation L, 15144b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor IdentifierInfo *Id, QualType T, Expr *BW, 1524afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor bool Mutable) { 1533e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff return new (C) FieldDecl(Decl::Field, DC, L, Id, T, BW, Mutable); 1548e25d8681822d8094bfeb97b2239363552548171Chris Lattner} 1558e25d8681822d8094bfeb97b2239363552548171Chris Lattner 1566b3945f4bc757bdadd3e443180cf32c2cccb52a0Douglas Gregorbool FieldDecl::isAnonymousStructOrUnion() const { 1576b3945f4bc757bdadd3e443180cf32c2cccb52a0Douglas Gregor if (!isImplicit() || getDeclName()) 1586b3945f4bc757bdadd3e443180cf32c2cccb52a0Douglas Gregor return false; 1596b3945f4bc757bdadd3e443180cf32c2cccb52a0Douglas Gregor 1606b3945f4bc757bdadd3e443180cf32c2cccb52a0Douglas Gregor if (const RecordType *Record = getType()->getAsRecordType()) 1616b3945f4bc757bdadd3e443180cf32c2cccb52a0Douglas Gregor return Record->getDecl()->isAnonymousStructOrUnion(); 1626b3945f4bc757bdadd3e443180cf32c2cccb52a0Douglas Gregor 1636b3945f4bc757bdadd3e443180cf32c2cccb52a0Douglas Gregor return false; 1646b3945f4bc757bdadd3e443180cf32c2cccb52a0Douglas Gregor} 165a98e58ddb4696a0020fe97439d5295413f9e90b1Chris Lattner 1660ed844b04ea4387caa4e1cf3dc375d269657536bChris LattnerEnumConstantDecl *EnumConstantDecl::Create(ASTContext &C, EnumDecl *CD, 1670ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner SourceLocation L, 168c63e660882ff93841fa234d70ef6757038302b92Chris Lattner IdentifierInfo *Id, QualType T, 1694afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor Expr *E, const llvm::APSInt &V) { 1703e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff return new (C) EnumConstantDecl(CD, L, Id, T, E, V); 1716c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner} 1726c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner 173d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenekvoid EnumConstantDecl::Destroy(ASTContext& C) { 174d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenek if (Init) Init->Destroy(C); 175d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenek Decl::Destroy(C); 176d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenek} 177d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenek 1789fdf9c6d3530bb85f3166e6460d841e2ff8e1a2cChris LattnerTypedefDecl *TypedefDecl::Create(ASTContext &C, DeclContext *DC, 1790ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner SourceLocation L, 1804afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor IdentifierInfo *Id, QualType T) { 1813e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff return new (C) TypedefDecl(DC, L, Id, T); 1826c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner} 1836c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner 1849fdf9c6d3530bb85f3166e6460d841e2ff8e1a2cChris LattnerEnumDecl *EnumDecl::Create(ASTContext &C, DeclContext *DC, SourceLocation L, 1850ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner IdentifierInfo *Id, 1867df7b6bb800e1987951285ea192e4f347e1b603aDouglas Gregor EnumDecl *PrevDecl) { 187c0ac4923f08b25ae973a8ee7942cf3eb89da57b7Steve Naroff EnumDecl *Enum = new (C) EnumDecl(DC, L, Id); 1887df7b6bb800e1987951285ea192e4f347e1b603aDouglas Gregor C.getTypeDeclType(Enum, PrevDecl); 1897df7b6bb800e1987951285ea192e4f347e1b603aDouglas Gregor return Enum; 1906c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner} 1916c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner 192df91eca19bd9738abd9a3b84791f39750e27ad36Ted Kremenekvoid EnumDecl::Destroy(ASTContext& C) { 193df91eca19bd9738abd9a3b84791f39750e27ad36Ted Kremenek Decl::Destroy(C); 194df91eca19bd9738abd9a3b84791f39750e27ad36Ted Kremenek} 195df91eca19bd9738abd9a3b84791f39750e27ad36Ted Kremenek 19644b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregorvoid EnumDecl::completeDefinition(ASTContext &C, QualType NewType) { 19744b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor assert(!isDefinition() && "Cannot redefine enums!"); 19844b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor IntegerType = NewType; 1990b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregor TagDecl::completeDefinition(); 20044b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor} 20144b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 2024afa39deaa245592977136d367251ee2c173dd8dDouglas GregorFileScopeAsmDecl *FileScopeAsmDecl::Create(ASTContext &C, DeclContext *DC, 2030ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner SourceLocation L, 2048e25d8681822d8094bfeb97b2239363552548171Chris Lattner StringLiteral *Str) { 2053e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff return new (C) FileScopeAsmDecl(DC, L, Str); 2068e25d8681822d8094bfeb97b2239363552548171Chris Lattner} 2078e25d8681822d8094bfeb97b2239363552548171Chris Lattner 2086c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner//===----------------------------------------------------------------------===// 2094afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor// NamedDecl Implementation 2105239304ff761b8b03eefb772bd5d830a9b9f1aeaArgyrios Kyrtzidis//===----------------------------------------------------------------------===// 2115239304ff761b8b03eefb772bd5d830a9b9f1aeaArgyrios Kyrtzidis 21247b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregorstd::string NamedDecl::getQualifiedNameAsString() const { 21347b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor std::vector<std::string> Names; 21447b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor std::string QualName; 21547b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor const DeclContext *Ctx = getDeclContext(); 21647b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor 21747b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor if (Ctx->isFunctionOrMethod()) 21847b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor return getNameAsString(); 21947b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor 22047b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor while (Ctx) { 22147b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor if (Ctx->isFunctionOrMethod()) 22247b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor // FIXME: That probably will happen, when D was member of local 22347b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor // scope class/struct/union. How do we handle this case? 22447b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor break; 22547b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor 226f3e7ce4bd9837cdab6a096235922865f95467d3dDouglas Gregor if (const ClassTemplateSpecializationDecl *Spec 227f3e7ce4bd9837cdab6a096235922865f95467d3dDouglas Gregor = dyn_cast<ClassTemplateSpecializationDecl>(Ctx)) { 228f3e7ce4bd9837cdab6a096235922865f95467d3dDouglas Gregor const TemplateArgumentList &TemplateArgs = Spec->getTemplateArgs(); 229d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor PrintingPolicy Policy; 230d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor Policy.CPlusPlus = true; 231f3e7ce4bd9837cdab6a096235922865f95467d3dDouglas Gregor std::string TemplateArgsStr 232f3e7ce4bd9837cdab6a096235922865f95467d3dDouglas Gregor = TemplateSpecializationType::PrintTemplateArgumentList( 233f3e7ce4bd9837cdab6a096235922865f95467d3dDouglas Gregor TemplateArgs.getFlatArgumentList(), 234d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor TemplateArgs.flat_size(), 235d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor Policy); 236f3e7ce4bd9837cdab6a096235922865f95467d3dDouglas Gregor Names.push_back(Spec->getIdentifier()->getName() + TemplateArgsStr); 237f3e7ce4bd9837cdab6a096235922865f95467d3dDouglas Gregor } else if (const NamedDecl *ND = dyn_cast<NamedDecl>(Ctx)) 23847b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor Names.push_back(ND->getNameAsString()); 23947b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor else 24047b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor break; 24147b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor 24247b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor Ctx = Ctx->getParent(); 24347b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor } 24447b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor 24547b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor std::vector<std::string>::reverse_iterator 24647b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor I = Names.rbegin(), 24747b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor End = Names.rend(); 24847b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor 24947b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor for (; I!=End; ++I) 25047b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor QualName += *I + "::"; 25147b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor 25247b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor QualName += getNameAsString(); 25347b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor 25447b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor return QualName; 25547b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor} 25647b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor 25747b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor 2584afa39deaa245592977136d367251ee2c173dd8dDouglas Gregorbool NamedDecl::declarationReplaces(NamedDecl *OldD) const { 2596ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor assert(getDeclName() == OldD->getDeclName() && "Declaration name mismatch"); 2606ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor 2612a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor // UsingDirectiveDecl's are not really NamedDecl's, and all have same name. 2622a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor // We want to keep it, unless it nominates same namespace. 2632a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor if (getKind() == Decl::UsingDirective) { 2642a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor return cast<UsingDirectiveDecl>(this)->getNominatedNamespace() == 2652a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor cast<UsingDirectiveDecl>(OldD)->getNominatedNamespace(); 2662a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor } 2672a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor 2686ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(this)) 2696ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor // For function declarations, we keep track of redeclarations. 2706ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor return FD->getPreviousDeclaration() == OldD; 2716ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor 272e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor // For function templates, the underlying function declarations are linked. 273e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor if (const FunctionTemplateDecl *FunctionTemplate 274e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor = dyn_cast<FunctionTemplateDecl>(this)) 275e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor if (const FunctionTemplateDecl *OldFunctionTemplate 276e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor = dyn_cast<FunctionTemplateDecl>(OldD)) 277e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor return FunctionTemplate->getTemplatedDecl() 278e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor ->declarationReplaces(OldFunctionTemplate->getTemplatedDecl()); 279e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor 2800de21fd85d79bccd32f04256f5b3328ab5ed7c95Steve Naroff // For method declarations, we keep track of redeclarations. 2810de21fd85d79bccd32f04256f5b3328ab5ed7c95Steve Naroff if (isa<ObjCMethodDecl>(this)) 2820de21fd85d79bccd32f04256f5b3328ab5ed7c95Steve Naroff return false; 2830de21fd85d79bccd32f04256f5b3328ab5ed7c95Steve Naroff 2846ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor // For non-function declarations, if the declarations are of the 2856ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor // same kind then this must be a redeclaration, or semantic analysis 2866ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor // would not have given us the new declaration. 2876ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor return this->getKind() == OldD->getKind(); 2886ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor} 2896ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor 290d6f7e9dccd0fa8a5a15d7478324c0ae229fc5e1eDouglas Gregorbool NamedDecl::hasLinkage() const { 291d6f7e9dccd0fa8a5a15d7478324c0ae229fc5e1eDouglas Gregor if (const VarDecl *VD = dyn_cast<VarDecl>(this)) 292d6f7e9dccd0fa8a5a15d7478324c0ae229fc5e1eDouglas Gregor return VD->hasExternalStorage() || VD->isFileVarDecl(); 293d6f7e9dccd0fa8a5a15d7478324c0ae229fc5e1eDouglas Gregor 294d6f7e9dccd0fa8a5a15d7478324c0ae229fc5e1eDouglas Gregor if (isa<FunctionDecl>(this) && !isa<CXXMethodDecl>(this)) 295d6f7e9dccd0fa8a5a15d7478324c0ae229fc5e1eDouglas Gregor return true; 296d6f7e9dccd0fa8a5a15d7478324c0ae229fc5e1eDouglas Gregor 297d6f7e9dccd0fa8a5a15d7478324c0ae229fc5e1eDouglas Gregor return false; 298d6f7e9dccd0fa8a5a15d7478324c0ae229fc5e1eDouglas Gregor} 2994afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor 3005239304ff761b8b03eefb772bd5d830a9b9f1aeaArgyrios Kyrtzidis//===----------------------------------------------------------------------===// 30199f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes// VarDecl Implementation 30299f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes//===----------------------------------------------------------------------===// 30399f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes 3044afa39deaa245592977136d367251ee2c173dd8dDouglas GregorVarDecl *VarDecl::Create(ASTContext &C, DeclContext *DC, SourceLocation L, 3054afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor IdentifierInfo *Id, QualType T, StorageClass S, 30699f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes SourceLocation TypeSpecStartLoc) { 3073e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff return new (C) VarDecl(Var, DC, L, Id, T, S, TypeSpecStartLoc); 30899f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes} 30999f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes 31099f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopesvoid VarDecl::Destroy(ASTContext& C) { 311df2d3cf2be8b91e1e21234ff5a3aa4f820e7001aSebastian Redl Expr *Init = getInit(); 31278d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor if (Init) { 313df2d3cf2be8b91e1e21234ff5a3aa4f820e7001aSebastian Redl Init->Destroy(C); 31478d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor if (EvaluatedStmt *Eval = this->Init.dyn_cast<EvaluatedStmt *>()) { 31578d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor Eval->~EvaluatedStmt(); 31678d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor C.Deallocate(Eval); 31778d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor } 31878d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor } 31999f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes this->~VarDecl(); 3203e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff C.Deallocate((void *)this); 32199f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes} 32299f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes 32399f06ba988922ea721035a89e6d3c66ba100ba8aNuno LopesVarDecl::~VarDecl() { 32499f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes} 32599f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes 32655d608cbadf1e9c05064f9287c057d50b7df65b4Argyrios KyrtzidisSourceRange VarDecl::getSourceRange() const { 32755d608cbadf1e9c05064f9287c057d50b7df65b4Argyrios Kyrtzidis if (getInit()) 32855d608cbadf1e9c05064f9287c057d50b7df65b4Argyrios Kyrtzidis return SourceRange(getLocation(), getInit()->getLocEnd()); 32955d608cbadf1e9c05064f9287c057d50b7df65b4Argyrios Kyrtzidis return SourceRange(getLocation(), getLocation()); 33055d608cbadf1e9c05064f9287c057d50b7df65b4Argyrios Kyrtzidis} 33155d608cbadf1e9c05064f9287c057d50b7df65b4Argyrios Kyrtzidis 332275a369f003f25bd22c00c1c0fc0251c7208caf4Douglas Gregorbool VarDecl::isTentativeDefinition(ASTContext &Context) const { 333275a369f003f25bd22c00c1c0fc0251c7208caf4Douglas Gregor if (!isFileVarDecl() || Context.getLangOptions().CPlusPlus) 334275a369f003f25bd22c00c1c0fc0251c7208caf4Douglas Gregor return false; 335275a369f003f25bd22c00c1c0fc0251c7208caf4Douglas Gregor 336b6c8c8bd8d362c8a6cdb767415b0d21e62b77eb2Douglas Gregor const VarDecl *Def = 0; 337b6c8c8bd8d362c8a6cdb767415b0d21e62b77eb2Douglas Gregor return (!getDefinition(Def) && 338275a369f003f25bd22c00c1c0fc0251c7208caf4Douglas Gregor (getStorageClass() == None || getStorageClass() == Static)); 339275a369f003f25bd22c00c1c0fc0251c7208caf4Douglas Gregor} 340275a369f003f25bd22c00c1c0fc0251c7208caf4Douglas Gregor 341082d936a5b8323ac2c04558d8bca277a647831a3Ted Kremenekconst Expr *VarDecl::getDefinition(const VarDecl *&Def) const { 342275a369f003f25bd22c00c1c0fc0251c7208caf4Douglas Gregor Def = this; 343275a369f003f25bd22c00c1c0fc0251c7208caf4Douglas Gregor while (Def && !Def->getInit()) 344275a369f003f25bd22c00c1c0fc0251c7208caf4Douglas Gregor Def = Def->getPreviousDeclaration(); 345275a369f003f25bd22c00c1c0fc0251c7208caf4Douglas Gregor 346275a369f003f25bd22c00c1c0fc0251c7208caf4Douglas Gregor return Def? Def->getInit() : 0; 347275a369f003f25bd22c00c1c0fc0251c7208caf4Douglas Gregor} 348275a369f003f25bd22c00c1c0fc0251c7208caf4Douglas Gregor 34999f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes//===----------------------------------------------------------------------===// 3508a934233d1582b5bde9d270bc0705aa81e471a79Chris Lattner// FunctionDecl Implementation 3518a934233d1582b5bde9d270bc0705aa81e471a79Chris Lattner//===----------------------------------------------------------------------===// 3528a934233d1582b5bde9d270bc0705aa81e471a79Chris Lattner 35327f8a28bee33bb0e857cfe1a61c281bbc234b338Ted Kremenekvoid FunctionDecl::Destroy(ASTContext& C) { 354250fc9c859fdeed3f200ae911a7e7ea338f38436Douglas Gregor if (Body && Body.isOffset()) 355250fc9c859fdeed3f200ae911a7e7ea338f38436Douglas Gregor Body.get(C.getExternalSource())->Destroy(C); 356b65cf41707d190d5ce3d48b9e5bd2dc9d7b4a4c0Ted Kremenek 357b65cf41707d190d5ce3d48b9e5bd2dc9d7b4a4c0Ted Kremenek for (param_iterator I=param_begin(), E=param_end(); I!=E; ++I) 358b65cf41707d190d5ce3d48b9e5bd2dc9d7b4a4c0Ted Kremenek (*I)->Destroy(C); 359460b0ac80382fa73337d21dd052c1f18b27435d8Nuno Lopes 3603e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff C.Deallocate(ParamInfo); 361460b0ac80382fa73337d21dd052c1f18b27435d8Nuno Lopes 3621637be727f2a0434c1ed7aa385ea1c18328b0ccdDouglas Gregor if (TemplateSpecializationInfo *Info 3631637be727f2a0434c1ed7aa385ea1c18328b0ccdDouglas Gregor = TemplateOrSpecialization.dyn_cast<TemplateSpecializationInfo*>()) 3641637be727f2a0434c1ed7aa385ea1c18328b0ccdDouglas Gregor C.Deallocate(Info); 3651637be727f2a0434c1ed7aa385ea1c18328b0ccdDouglas Gregor 36627f8a28bee33bb0e857cfe1a61c281bbc234b338Ted Kremenek Decl::Destroy(C); 36727f8a28bee33bb0e857cfe1a61c281bbc234b338Ted Kremenek} 36827f8a28bee33bb0e857cfe1a61c281bbc234b338Ted Kremenek 36927f8a28bee33bb0e857cfe1a61c281bbc234b338Ted Kremenek 370d3a413d3b8eb39bcee5944bc545d9997c1abe492Sebastian RedlStmt *FunctionDecl::getBody(ASTContext &Context, 371d3a413d3b8eb39bcee5944bc545d9997c1abe492Sebastian Redl const FunctionDecl *&Definition) const { 372f009795057dc8ca254f5618c80a0a90f07cd44b4Douglas Gregor for (const FunctionDecl *FD = this; FD != 0; FD = FD->PreviousDeclaration) { 373f009795057dc8ca254f5618c80a0a90f07cd44b4Douglas Gregor if (FD->Body) { 374f009795057dc8ca254f5618c80a0a90f07cd44b4Douglas Gregor Definition = FD; 375d3a413d3b8eb39bcee5944bc545d9997c1abe492Sebastian Redl return FD->Body.get(Context.getExternalSource()); 376f009795057dc8ca254f5618c80a0a90f07cd44b4Douglas Gregor } 377f009795057dc8ca254f5618c80a0a90f07cd44b4Douglas Gregor } 378f009795057dc8ca254f5618c80a0a90f07cd44b4Douglas Gregor 379f009795057dc8ca254f5618c80a0a90f07cd44b4Douglas Gregor return 0; 3805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 3815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 382d3a413d3b8eb39bcee5944bc545d9997c1abe492Sebastian RedlStmt *FunctionDecl::getBodyIfAvailable() const { 3837297134f128423fce2e88f92421ed135bded7d4eDouglas Gregor for (const FunctionDecl *FD = this; FD != 0; FD = FD->PreviousDeclaration) { 384250fc9c859fdeed3f200ae911a7e7ea338f38436Douglas Gregor if (FD->Body && !FD->Body.isOffset()) { 385d3a413d3b8eb39bcee5944bc545d9997c1abe492Sebastian Redl return FD->Body.get(0); 386250fc9c859fdeed3f200ae911a7e7ea338f38436Douglas Gregor } 3877297134f128423fce2e88f92421ed135bded7d4eDouglas Gregor } 3887297134f128423fce2e88f92421ed135bded7d4eDouglas Gregor 3897297134f128423fce2e88f92421ed135bded7d4eDouglas Gregor return 0; 3907297134f128423fce2e88f92421ed135bded7d4eDouglas Gregor} 3917297134f128423fce2e88f92421ed135bded7d4eDouglas Gregor 39255d608cbadf1e9c05064f9287c057d50b7df65b4Argyrios Kyrtzidisvoid FunctionDecl::setBody(Stmt *B) { 39355d608cbadf1e9c05064f9287c057d50b7df65b4Argyrios Kyrtzidis Body = B; 3941a5364e0fa0482d8d477d6f136d52e503bbe13f4Argyrios Kyrtzidis if (B) 39555d608cbadf1e9c05064f9287c057d50b7df65b4Argyrios Kyrtzidis EndRangeLoc = B->getLocEnd(); 39655d608cbadf1e9c05064f9287c057d50b7df65b4Argyrios Kyrtzidis} 39755d608cbadf1e9c05064f9287c057d50b7df65b4Argyrios Kyrtzidis 39804495c859f81e440748a9b86baa2913461652bb0Douglas Gregorbool FunctionDecl::isMain() const { 39904495c859f81e440748a9b86baa2913461652bb0Douglas Gregor return getDeclContext()->getLookupContext()->isTranslationUnit() && 40004495c859f81e440748a9b86baa2913461652bb0Douglas Gregor getIdentifier() && getIdentifier()->isStr("main"); 40104495c859f81e440748a9b86baa2913461652bb0Douglas Gregor} 40204495c859f81e440748a9b86baa2913461652bb0Douglas Gregor 4036393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregorbool FunctionDecl::isExternC(ASTContext &Context) const { 4046393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor // In C, any non-static, non-overloadable function has external 4056393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor // linkage. 4066393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor if (!Context.getLangOptions().CPlusPlus) 40768584ed35ad819a1668e3f527ba7f5dd4ae6a333Douglas Gregor return getStorageClass() != Static && !getAttr<OverloadableAttr>(Context); 4086393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor 4096393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor for (const DeclContext *DC = getDeclContext(); !DC->isTranslationUnit(); 4106393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor DC = DC->getParent()) { 4116393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor if (const LinkageSpecDecl *Linkage = dyn_cast<LinkageSpecDecl>(DC)) { 4126393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor if (Linkage->getLanguage() == LinkageSpecDecl::lang_c) 41368584ed35ad819a1668e3f527ba7f5dd4ae6a333Douglas Gregor return getStorageClass() != Static && 41468584ed35ad819a1668e3f527ba7f5dd4ae6a333Douglas Gregor !getAttr<OverloadableAttr>(Context); 4156393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor 4166393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor break; 4176393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor } 4186393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor } 4196393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor 4206393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor return false; 4216393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor} 4226393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor 4238499f3f5ff8d5f95ece8047780030a3daad1b6faDouglas Gregorbool FunctionDecl::isGlobal() const { 4248499f3f5ff8d5f95ece8047780030a3daad1b6faDouglas Gregor if (const CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(this)) 4258499f3f5ff8d5f95ece8047780030a3daad1b6faDouglas Gregor return Method->isStatic(); 4268499f3f5ff8d5f95ece8047780030a3daad1b6faDouglas Gregor 4278499f3f5ff8d5f95ece8047780030a3daad1b6faDouglas Gregor if (getStorageClass() == Static) 4288499f3f5ff8d5f95ece8047780030a3daad1b6faDouglas Gregor return false; 4298499f3f5ff8d5f95ece8047780030a3daad1b6faDouglas Gregor 4308499f3f5ff8d5f95ece8047780030a3daad1b6faDouglas Gregor for (const DeclContext *DC = getDeclContext(); 4318499f3f5ff8d5f95ece8047780030a3daad1b6faDouglas Gregor DC->isNamespace(); 4328499f3f5ff8d5f95ece8047780030a3daad1b6faDouglas Gregor DC = DC->getParent()) { 4338499f3f5ff8d5f95ece8047780030a3daad1b6faDouglas Gregor if (const NamespaceDecl *Namespace = cast<NamespaceDecl>(DC)) { 4348499f3f5ff8d5f95ece8047780030a3daad1b6faDouglas Gregor if (!Namespace->getDeclName()) 4358499f3f5ff8d5f95ece8047780030a3daad1b6faDouglas Gregor return false; 4368499f3f5ff8d5f95ece8047780030a3daad1b6faDouglas Gregor break; 4378499f3f5ff8d5f95ece8047780030a3daad1b6faDouglas Gregor } 4388499f3f5ff8d5f95ece8047780030a3daad1b6faDouglas Gregor } 4398499f3f5ff8d5f95ece8047780030a3daad1b6faDouglas Gregor 4408499f3f5ff8d5f95ece8047780030a3daad1b6faDouglas Gregor return true; 4418499f3f5ff8d5f95ece8047780030a3daad1b6faDouglas Gregor} 4428499f3f5ff8d5f95ece8047780030a3daad1b6faDouglas Gregor 4433e41d60eb627dc227c770f1c1c87d06909cf05fdDouglas Gregor/// \brief Returns a value indicating whether this function 4443e41d60eb627dc227c770f1c1c87d06909cf05fdDouglas Gregor/// corresponds to a builtin function. 4453e41d60eb627dc227c770f1c1c87d06909cf05fdDouglas Gregor/// 4463e41d60eb627dc227c770f1c1c87d06909cf05fdDouglas Gregor/// The function corresponds to a built-in function if it is 4473e41d60eb627dc227c770f1c1c87d06909cf05fdDouglas Gregor/// declared at translation scope or within an extern "C" block and 4483e41d60eb627dc227c770f1c1c87d06909cf05fdDouglas Gregor/// its name matches with the name of a builtin. The returned value 4493e41d60eb627dc227c770f1c1c87d06909cf05fdDouglas Gregor/// will be 0 for functions that do not correspond to a builtin, a 4503e41d60eb627dc227c770f1c1c87d06909cf05fdDouglas Gregor/// value of type \c Builtin::ID if in the target-independent range 4513e41d60eb627dc227c770f1c1c87d06909cf05fdDouglas Gregor/// \c [1,Builtin::First), or a target-specific builtin value. 4523c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregorunsigned FunctionDecl::getBuiltinID(ASTContext &Context) const { 4533c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor if (!getIdentifier() || !getIdentifier()->getBuiltinID()) 4543c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor return 0; 4553c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor 4563c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor unsigned BuiltinID = getIdentifier()->getBuiltinID(); 4573c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor if (!Context.BuiltinInfo.isPredefinedLibFunction(BuiltinID)) 4583c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor return BuiltinID; 4593c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor 4603c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor // This function has the name of a known C library 4613c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor // function. Determine whether it actually refers to the C library 4623c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor // function or whether it just has the same name. 4633c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor 4649add31798f621f843233dbff8bba103fca64447bDouglas Gregor // If this is a static function, it's not a builtin. 4659add31798f621f843233dbff8bba103fca64447bDouglas Gregor if (getStorageClass() == Static) 4669add31798f621f843233dbff8bba103fca64447bDouglas Gregor return 0; 4679add31798f621f843233dbff8bba103fca64447bDouglas Gregor 4683c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor // If this function is at translation-unit scope and we're not in 4693c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor // C++, it refers to the C library function. 4703c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor if (!Context.getLangOptions().CPlusPlus && 4713c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor getDeclContext()->isTranslationUnit()) 4723c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor return BuiltinID; 4733c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor 4743c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor // If the function is in an extern "C" linkage specification and is 4753c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor // not marked "overloadable", it's the real function. 4763c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor if (isa<LinkageSpecDecl>(getDeclContext()) && 4773c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor cast<LinkageSpecDecl>(getDeclContext())->getLanguage() 4783c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor == LinkageSpecDecl::lang_c && 47968584ed35ad819a1668e3f527ba7f5dd4ae6a333Douglas Gregor !getAttr<OverloadableAttr>(Context)) 4803c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor return BuiltinID; 4813c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor 4823c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor // Not a builtin 4833e41d60eb627dc227c770f1c1c87d06909cf05fdDouglas Gregor return 0; 4843e41d60eb627dc227c770f1c1c87d06909cf05fdDouglas Gregor} 4853e41d60eb627dc227c770f1c1c87d06909cf05fdDouglas Gregor 4863e41d60eb627dc227c770f1c1c87d06909cf05fdDouglas Gregor 4871ad9b28e3217c2349a04f3d3bf14f9c73a99afa7Chris Lattner/// getNumParams - Return the number of parameters this function must have 4882dbd285f5033ca6dea25babfd1c43d9fec35e7e5Chris Lattner/// based on its FunctionType. This is the length of the PararmInfo array 4891ad9b28e3217c2349a04f3d3bf14f9c73a99afa7Chris Lattner/// after it has been created. 4901ad9b28e3217c2349a04f3d3bf14f9c73a99afa7Chris Lattnerunsigned FunctionDecl::getNumParams() const { 49111ddb7dc22bb398a6727318729680630bfcefaaeChris Lattner const FunctionType *FT = getType()->getAsFunctionType(); 49272564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor if (isa<FunctionNoProtoType>(FT)) 493d3b9065ec7052ec4741783d2fb4130d13c766933Chris Lattner return 0; 49472564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor return cast<FunctionProtoType>(FT)->getNumArgs(); 49511ddb7dc22bb398a6727318729680630bfcefaaeChris Lattner 4965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 4975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 498fc767615bc67d3a7587b1fb2e0494c32c9dbd7a5Ted Kremenekvoid FunctionDecl::setParams(ASTContext& C, ParmVarDecl **NewParamInfo, 499fc767615bc67d3a7587b1fb2e0494c32c9dbd7a5Ted Kremenek unsigned NumParams) { 5005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer assert(ParamInfo == 0 && "Already has param info!"); 5012dbd285f5033ca6dea25babfd1c43d9fec35e7e5Chris Lattner assert(NumParams == getNumParams() && "Parameter count mismatch!"); 5025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 5035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Zero params -> null pointer. 5045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (NumParams) { 505c0ac4923f08b25ae973a8ee7942cf3eb89da57b7Steve Naroff void *Mem = C.Allocate(sizeof(ParmVarDecl*)*NumParams); 506fc767615bc67d3a7587b1fb2e0494c32c9dbd7a5Ted Kremenek ParamInfo = new (Mem) ParmVarDecl*[NumParams]; 5075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer memcpy(ParamInfo, NewParamInfo, sizeof(ParmVarDecl*)*NumParams); 50855d608cbadf1e9c05064f9287c057d50b7df65b4Argyrios Kyrtzidis 50996888cc2515e55c9b5dd6798063bf4be2c22983aArgyrios Kyrtzidis // Update source range. The check below allows us to set EndRangeLoc before 51096888cc2515e55c9b5dd6798063bf4be2c22983aArgyrios Kyrtzidis // setting the parameters. 511cb5f8f59322c352f51714c3de5d8047e70895165Argyrios Kyrtzidis if (EndRangeLoc.isInvalid() || EndRangeLoc == getLocation()) 51255d608cbadf1e9c05064f9287c057d50b7df65b4Argyrios Kyrtzidis EndRangeLoc = NewParamInfo[NumParams-1]->getLocEnd(); 5135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 5145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 5155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 5168123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner/// getMinRequiredArguments - Returns the minimum number of arguments 5178123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner/// needed to call this function. This may be fewer than the number of 5188123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner/// function parameters, if some of the parameters have default 5199e979557eea3875c9e3d100c68188233dd7f46c0Chris Lattner/// arguments (in C++). 5208123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattnerunsigned FunctionDecl::getMinRequiredArguments() const { 5218123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner unsigned NumRequiredArgs = getNumParams(); 5228123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner while (NumRequiredArgs > 0 523ae0b4e7be78cf0dc2a6a333e865c2be9265774f9Anders Carlsson && getParamDecl(NumRequiredArgs-1)->hasDefaultArg()) 5248123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner --NumRequiredArgs; 5258123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner 5268123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner return NumRequiredArgs; 5278123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner} 5288123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner 52968584ed35ad819a1668e3f527ba7f5dd4ae6a333Douglas Gregorbool FunctionDecl::hasActiveGNUInlineAttribute(ASTContext &Context) const { 53068584ed35ad819a1668e3f527ba7f5dd4ae6a333Douglas Gregor if (!isInline() || !hasAttr<GNUInlineAttr>(Context)) 5319f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor return false; 5329f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor 5339f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor for (const FunctionDecl *FD = getPreviousDeclaration(); FD; 5349f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor FD = FD->getPreviousDeclaration()) { 53568584ed35ad819a1668e3f527ba7f5dd4ae6a333Douglas Gregor if (FD->isInline() && !FD->hasAttr<GNUInlineAttr>(Context)) 5369f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor return false; 5379f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor } 5389f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor 5399f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor return true; 5409f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor} 5419f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor 54268584ed35ad819a1668e3f527ba7f5dd4ae6a333Douglas Gregorbool FunctionDecl::isExternGNUInline(ASTContext &Context) const { 54368584ed35ad819a1668e3f527ba7f5dd4ae6a333Douglas Gregor if (!hasActiveGNUInlineAttribute(Context)) 5449f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor return false; 5459f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor 5469f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor for (const FunctionDecl *FD = this; FD; FD = FD->getPreviousDeclaration()) 54768584ed35ad819a1668e3f527ba7f5dd4ae6a333Douglas Gregor if (FD->getStorageClass() == Extern && FD->hasAttr<GNUInlineAttr>(Context)) 5489f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor return true; 5499f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor 5509f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor return false; 5519f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor} 5529f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor 5531cd1b1e987f5e2f060d7972b13d83239b36d77d6Douglas Gregor/// getOverloadedOperator - Which C++ overloaded operator this 5541cd1b1e987f5e2f060d7972b13d83239b36d77d6Douglas Gregor/// function represents, if any. 5551cd1b1e987f5e2f060d7972b13d83239b36d77d6Douglas GregorOverloadedOperatorKind FunctionDecl::getOverloadedOperator() const { 556e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor if (getDeclName().getNameKind() == DeclarationName::CXXOperatorName) 557e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor return getDeclName().getCXXOverloadedOperator(); 5581cd1b1e987f5e2f060d7972b13d83239b36d77d6Douglas Gregor else 5591cd1b1e987f5e2f060d7972b13d83239b36d77d6Douglas Gregor return OO_None; 5601cd1b1e987f5e2f060d7972b13d83239b36d77d6Douglas Gregor} 5611cd1b1e987f5e2f060d7972b13d83239b36d77d6Douglas Gregor 5621637be727f2a0434c1ed7aa385ea1c18328b0ccdDouglas Gregorvoid 5631637be727f2a0434c1ed7aa385ea1c18328b0ccdDouglas GregorFunctionDecl::setFunctionTemplateSpecialization(ASTContext &Context, 5641637be727f2a0434c1ed7aa385ea1c18328b0ccdDouglas Gregor FunctionTemplateDecl *Template, 5651637be727f2a0434c1ed7aa385ea1c18328b0ccdDouglas Gregor const TemplateArgumentList *TemplateArgs) { 5661637be727f2a0434c1ed7aa385ea1c18328b0ccdDouglas Gregor TemplateSpecializationInfo *Info 5671637be727f2a0434c1ed7aa385ea1c18328b0ccdDouglas Gregor = TemplateOrSpecialization.dyn_cast<TemplateSpecializationInfo*>(); 5681637be727f2a0434c1ed7aa385ea1c18328b0ccdDouglas Gregor if (!Info) 5691637be727f2a0434c1ed7aa385ea1c18328b0ccdDouglas Gregor Info = new (Context) TemplateSpecializationInfo; 5701637be727f2a0434c1ed7aa385ea1c18328b0ccdDouglas Gregor 5711637be727f2a0434c1ed7aa385ea1c18328b0ccdDouglas Gregor Info->Template = Template; 5721637be727f2a0434c1ed7aa385ea1c18328b0ccdDouglas Gregor Info->TemplateArguments = TemplateArgs; 5731637be727f2a0434c1ed7aa385ea1c18328b0ccdDouglas Gregor TemplateOrSpecialization = Info; 5741637be727f2a0434c1ed7aa385ea1c18328b0ccdDouglas Gregor} 5751637be727f2a0434c1ed7aa385ea1c18328b0ccdDouglas Gregor 5768a934233d1582b5bde9d270bc0705aa81e471a79Chris Lattner//===----------------------------------------------------------------------===// 577bcbffc46f1ad3796c4582fa1e3a9113b5aa26061Douglas Gregor// TagDecl Implementation 5784b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek//===----------------------------------------------------------------------===// 5794b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek 5800b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregorvoid TagDecl::startDefinition() { 581fc705b84347e6fb4746a1a7e26949f64c2f2f358Douglas Gregor TagType *TagT = const_cast<TagType *>(TypeForDecl->getAsTagType()); 582fc705b84347e6fb4746a1a7e26949f64c2f2f358Douglas Gregor TagT->decl.setPointer(this); 583fc705b84347e6fb4746a1a7e26949f64c2f2f358Douglas Gregor TagT->getAsTagType()->decl.setInt(1); 5840b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregor} 5850b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregor 5860b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregorvoid TagDecl::completeDefinition() { 5870b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregor assert((!TypeForDecl || 588fc705b84347e6fb4746a1a7e26949f64c2f2f358Douglas Gregor TypeForDecl->getAsTagType()->decl.getPointer() == this) && 5890b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregor "Attempt to redefine a tag definition?"); 5900b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregor IsDefinition = true; 591fc705b84347e6fb4746a1a7e26949f64c2f2f358Douglas Gregor TagType *TagT = const_cast<TagType *>(TypeForDecl->getAsTagType()); 592fc705b84347e6fb4746a1a7e26949f64c2f2f358Douglas Gregor TagT->decl.setPointer(this); 593fc705b84347e6fb4746a1a7e26949f64c2f2f358Douglas Gregor TagT->decl.setInt(0); 5940b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregor} 5950b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregor 5964b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed KremenekTagDecl* TagDecl::getDefinition(ASTContext& C) const { 5974b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek QualType T = C.getTypeDeclType(const_cast<TagDecl*>(this)); 598fc705b84347e6fb4746a1a7e26949f64c2f2f358Douglas Gregor TagDecl* D = cast<TagDecl>(T->getAsTagType()->getDecl()); 5994b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek return D->isDefinition() ? D : 0; 6004b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek} 6014b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek 6024b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek//===----------------------------------------------------------------------===// 6038a934233d1582b5bde9d270bc0705aa81e471a79Chris Lattner// RecordDecl Implementation 6048a934233d1582b5bde9d270bc0705aa81e471a79Chris Lattner//===----------------------------------------------------------------------===// 6055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 60635bc0821c4f80041724cd4c5c4889b2581546a41Argyrios KyrtzidisRecordDecl::RecordDecl(Kind DK, TagKind TK, DeclContext *DC, SourceLocation L, 607df042e6c2bf06b2d9ed53c52469599ac1bd93a3fTed Kremenek IdentifierInfo *Id) 6084afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor : TagDecl(DK, TK, DC, L, Id) { 6096359792ca92e7ca2f416cb804c6604358174e994Ted Kremenek HasFlexibleArrayMember = false; 610bcbffc46f1ad3796c4582fa1e3a9113b5aa26061Douglas Gregor AnonymousStructOrUnion = false; 6116359792ca92e7ca2f416cb804c6604358174e994Ted Kremenek assert(classof(static_cast<Decl*>(this)) && "Invalid Kind!"); 6126359792ca92e7ca2f416cb804c6604358174e994Ted Kremenek} 6136359792ca92e7ca2f416cb804c6604358174e994Ted Kremenek 6146359792ca92e7ca2f416cb804c6604358174e994Ted KremenekRecordDecl *RecordDecl::Create(ASTContext &C, TagKind TK, DeclContext *DC, 6154b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek SourceLocation L, IdentifierInfo *Id, 6164b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek RecordDecl* PrevDecl) { 617df042e6c2bf06b2d9ed53c52469599ac1bd93a3fTed Kremenek 6183e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff RecordDecl* R = new (C) RecordDecl(Record, TK, DC, L, Id); 6194b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek C.getTypeDeclType(R, PrevDecl); 6204b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek return R; 6216359792ca92e7ca2f416cb804c6604358174e994Ted Kremenek} 6226359792ca92e7ca2f416cb804c6604358174e994Ted Kremenek 623997b6c6d73541f010afc81e28191c8eae7b24f77Argyrios KyrtzidisRecordDecl::~RecordDecl() { 624997b6c6d73541f010afc81e28191c8eae7b24f77Argyrios Kyrtzidis} 625997b6c6d73541f010afc81e28191c8eae7b24f77Argyrios Kyrtzidis 626997b6c6d73541f010afc81e28191c8eae7b24f77Argyrios Kyrtzidisvoid RecordDecl::Destroy(ASTContext& C) { 627997b6c6d73541f010afc81e28191c8eae7b24f77Argyrios Kyrtzidis TagDecl::Destroy(C); 628997b6c6d73541f010afc81e28191c8eae7b24f77Argyrios Kyrtzidis} 629997b6c6d73541f010afc81e28191c8eae7b24f77Argyrios Kyrtzidis 630c9b5b4074bd73d4af76e69cccf8ecd365fdd1008Douglas Gregorbool RecordDecl::isInjectedClassName() const { 631c9b5b4074bd73d4af76e69cccf8ecd365fdd1008Douglas Gregor return isImplicit() && getDeclName() && getDeclContext()->isRecord() && 632c9b5b4074bd73d4af76e69cccf8ecd365fdd1008Douglas Gregor cast<RecordDecl>(getDeclContext())->getDeclName() == getDeclName(); 633c9b5b4074bd73d4af76e69cccf8ecd365fdd1008Douglas Gregor} 634c9b5b4074bd73d4af76e69cccf8ecd365fdd1008Douglas Gregor 63544b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor/// completeDefinition - Notes that the definition of this type is now 63644b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor/// complete. 63744b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregorvoid RecordDecl::completeDefinition(ASTContext& C) { 6385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer assert(!isDefinition() && "Cannot redefine record!"); 6390b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregor TagDecl::completeDefinition(); 6405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 6415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 64256ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff//===----------------------------------------------------------------------===// 64356ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff// BlockDecl Implementation 64456ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff//===----------------------------------------------------------------------===// 64556ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff 64656ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve NaroffBlockDecl::~BlockDecl() { 64756ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff} 64856ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff 64956ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroffvoid BlockDecl::Destroy(ASTContext& C) { 65056ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff if (Body) 65156ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff Body->Destroy(C); 65256ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff 65356ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff for (param_iterator I=param_begin(), E=param_end(); I!=E; ++I) 65456ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff (*I)->Destroy(C); 655879d27ad4670716c7cea7f86274f6096f6868fe1Ted Kremenek 656879d27ad4670716c7cea7f86274f6096f6868fe1Ted Kremenek C.Deallocate(ParamInfo); 65756ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff Decl::Destroy(C); 65856ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff} 659e78b809bbcd92928a63da81f2cd843faad3e4dfdSteve Naroff 660e78b809bbcd92928a63da81f2cd843faad3e4dfdSteve Naroffvoid BlockDecl::setParams(ASTContext& C, ParmVarDecl **NewParamInfo, 661e78b809bbcd92928a63da81f2cd843faad3e4dfdSteve Naroff unsigned NParms) { 662e78b809bbcd92928a63da81f2cd843faad3e4dfdSteve Naroff assert(ParamInfo == 0 && "Already has param info!"); 663e78b809bbcd92928a63da81f2cd843faad3e4dfdSteve Naroff 664e78b809bbcd92928a63da81f2cd843faad3e4dfdSteve Naroff // Zero params -> null pointer. 665e78b809bbcd92928a63da81f2cd843faad3e4dfdSteve Naroff if (NParms) { 666e78b809bbcd92928a63da81f2cd843faad3e4dfdSteve Naroff NumParams = NParms; 667e78b809bbcd92928a63da81f2cd843faad3e4dfdSteve Naroff void *Mem = C.Allocate(sizeof(ParmVarDecl*)*NumParams); 668e78b809bbcd92928a63da81f2cd843faad3e4dfdSteve Naroff ParamInfo = new (Mem) ParmVarDecl*[NumParams]; 669e78b809bbcd92928a63da81f2cd843faad3e4dfdSteve Naroff memcpy(ParamInfo, NewParamInfo, sizeof(ParmVarDecl*)*NumParams); 670e78b809bbcd92928a63da81f2cd843faad3e4dfdSteve Naroff } 671e78b809bbcd92928a63da81f2cd843faad3e4dfdSteve Naroff} 672e78b809bbcd92928a63da81f2cd843faad3e4dfdSteve Naroff 673e78b809bbcd92928a63da81f2cd843faad3e4dfdSteve Naroffunsigned BlockDecl::getNumParams() const { 674e78b809bbcd92928a63da81f2cd843faad3e4dfdSteve Naroff return NumParams; 675e78b809bbcd92928a63da81f2cd843faad3e4dfdSteve Naroff} 676