Decl.cpp revision a5d82000f7b173a0a5ce34dc8c09a03f98d9e439
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" 19b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis#include "clang/AST/TypeLoc.h" 20e91593ef084479340582b2ba177b44be50a717b7Daniel Dunbar#include "clang/AST/Stmt.h" 2199f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes#include "clang/AST/Expr.h" 22d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor#include "clang/AST/PrettyPrinter.h" 231b63e4f732dbc73d90abf886b4d21f8e3a165f6dChris Lattner#include "clang/Basic/Builtins.h" 24e91593ef084479340582b2ba177b44be50a717b7Daniel Dunbar#include "clang/Basic/IdentifierTable.h" 2547b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor#include <vector> 2627f8a28bee33bb0e857cfe1a61c281bbc234b338Ted Kremenek 275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerusing namespace clang; 285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 290b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattnervoid Attr::Destroy(ASTContext &C) { 300b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner if (Next) { 310b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner Next->Destroy(C); 320b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner Next = 0; 330b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner } 340b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner this->~Attr(); 350b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner C.Deallocate((void*)this); 360b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner} 370b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner 38b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis/// \brief Return the TypeLoc wrapper for the type source info. 39b17166c8077cd900cca83a895c43b30ea6660598Argyrios KyrtzidisTypeLoc DeclaratorInfo::getTypeLoc() const { 40b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis return TypeLoc::Create(Ty, (void*)(this + 1)); 41b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis} 420b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner 43d3b9065ec7052ec4741783d2fb4130d13c766933Chris Lattner//===----------------------------------------------------------------------===// 446c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner// Decl Allocation/Deallocation Method Implementations 456c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner//===----------------------------------------------------------------------===// 462d1c5d313cd0c229cc614e74baa4c5756a4b46f4Argyrios Kyrtzidis 470b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner 48ef177820100ab583b08fd3056e2a5a52ee4b1629Argyrios KyrtzidisTranslationUnitDecl *TranslationUnitDecl::Create(ASTContext &C) { 493708b3df2e86998dca4c006939014ea1174da834Argyrios Kyrtzidis return new (C) TranslationUnitDecl(C); 50ef177820100ab583b08fd3056e2a5a52ee4b1629Argyrios Kyrtzidis} 51ef177820100ab583b08fd3056e2a5a52ee4b1629Argyrios Kyrtzidis 522d1c5d313cd0c229cc614e74baa4c5756a4b46f4Argyrios KyrtzidisNamespaceDecl *NamespaceDecl::Create(ASTContext &C, DeclContext *DC, 532d1c5d313cd0c229cc614e74baa4c5756a4b46f4Argyrios Kyrtzidis SourceLocation L, IdentifierInfo *Id) { 543e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff return new (C) NamespaceDecl(DC, L, Id); 552d1c5d313cd0c229cc614e74baa4c5756a4b46f4Argyrios Kyrtzidis} 562d1c5d313cd0c229cc614e74baa4c5756a4b46f4Argyrios Kyrtzidis 57d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenekvoid NamespaceDecl::Destroy(ASTContext& C) { 58d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenek // NamespaceDecl uses "NextDeclarator" to chain namespace declarations 59d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenek // together. They are all top-level Decls. 60d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenek 61ebf27b1831e6c4d7f4bc30e111a4d6340ff690d1Ted Kremenek this->~NamespaceDecl(); 623e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff C.Deallocate((void *)this); 63d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenek} 64d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenek 65d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenek 664111024be81e7c0525e42dadcc126d27e5bf2425Chris LattnerImplicitParamDecl *ImplicitParamDecl::Create(ASTContext &C, DeclContext *DC, 674afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor SourceLocation L, IdentifierInfo *Id, QualType T) { 683e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff return new (C) ImplicitParamDecl(ImplicitParam, DC, L, Id, T); 694111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner} 704111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner 71b286a78c8cce4592306dae6abc3656daf6379c77Daniel Dunbarconst char *VarDecl::getStorageClassSpecifierString(StorageClass SC) { 72b286a78c8cce4592306dae6abc3656daf6379c77Daniel Dunbar switch (SC) { 73b286a78c8cce4592306dae6abc3656daf6379c77Daniel Dunbar case VarDecl::None: break; 74b286a78c8cce4592306dae6abc3656daf6379c77Daniel Dunbar case VarDecl::Auto: return "auto"; break; 75b286a78c8cce4592306dae6abc3656daf6379c77Daniel Dunbar case VarDecl::Extern: return "extern"; break; 76b286a78c8cce4592306dae6abc3656daf6379c77Daniel Dunbar case VarDecl::PrivateExtern: return "__private_extern__"; break; 77b286a78c8cce4592306dae6abc3656daf6379c77Daniel Dunbar case VarDecl::Register: return "register"; break; 78b286a78c8cce4592306dae6abc3656daf6379c77Daniel Dunbar case VarDecl::Static: return "static"; break; 79b286a78c8cce4592306dae6abc3656daf6379c77Daniel Dunbar } 80b286a78c8cce4592306dae6abc3656daf6379c77Daniel Dunbar 81b286a78c8cce4592306dae6abc3656daf6379c77Daniel Dunbar assert(0 && "Invalid storage class"); 82b286a78c8cce4592306dae6abc3656daf6379c77Daniel Dunbar return 0; 83b286a78c8cce4592306dae6abc3656daf6379c77Daniel Dunbar} 84b286a78c8cce4592306dae6abc3656daf6379c77Daniel Dunbar 859fdf9c6d3530bb85f3166e6460d841e2ff8e1a2cChris LattnerParmVarDecl *ParmVarDecl::Create(ASTContext &C, DeclContext *DC, 860ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner SourceLocation L, IdentifierInfo *Id, 87a1d5662d96465f0fddf8819d245da4d19b892effArgyrios Kyrtzidis QualType T, DeclaratorInfo *DInfo, 88a1d5662d96465f0fddf8819d245da4d19b892effArgyrios Kyrtzidis StorageClass S, Expr *DefArg) { 89a1d5662d96465f0fddf8819d245da4d19b892effArgyrios Kyrtzidis return new (C) ParmVarDecl(ParmVar, DC, L, Id, T, DInfo, S, DefArg); 904306d3cb9116605728252e2738df24b9f6ab53c3Fariborz Jahanian} 914306d3cb9116605728252e2738df24b9f6ab53c3Fariborz Jahanian 924306d3cb9116605728252e2738df24b9f6ab53c3Fariborz JahanianQualType ParmVarDecl::getOriginalType() const { 9364650af7cc4352c6c67b9bd1bf8ef3ce7471b910Douglas Gregor if (const OriginalParmVarDecl *PVD = 9464650af7cc4352c6c67b9bd1bf8ef3ce7471b910Douglas Gregor dyn_cast<OriginalParmVarDecl>(this)) 954306d3cb9116605728252e2738df24b9f6ab53c3Fariborz Jahanian return PVD->OriginalType; 964306d3cb9116605728252e2738df24b9f6ab53c3Fariborz Jahanian return getType(); 979e151e154780e9cd443336143af1e996d1f387e5Chris Lattner} 989e151e154780e9cd443336143af1e996d1f387e5Chris Lattner 9978d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregorvoid VarDecl::setInit(ASTContext &C, Expr *I) { 10078d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor if (EvaluatedStmt *Eval = Init.dyn_cast<EvaluatedStmt *>()) { 10178d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor Eval->~EvaluatedStmt(); 10278d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor C.Deallocate(Eval); 10378d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor } 10478d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor 10578d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor Init = I; 10678d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor } 10778d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor 1086393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregorbool VarDecl::isExternC(ASTContext &Context) const { 1096393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor if (!Context.getLangOptions().CPlusPlus) 1106393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor return (getDeclContext()->isTranslationUnit() && 1116393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor getStorageClass() != Static) || 1126393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor (getDeclContext()->isFunctionOrMethod() && hasExternalStorage()); 1136393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor 1146393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor for (const DeclContext *DC = getDeclContext(); !DC->isTranslationUnit(); 1156393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor DC = DC->getParent()) { 1166393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor if (const LinkageSpecDecl *Linkage = dyn_cast<LinkageSpecDecl>(DC)) { 1176393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor if (Linkage->getLanguage() == LinkageSpecDecl::lang_c) 1186393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor return getStorageClass() != Static; 1196393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor 1206393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor break; 1216393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor } 1226393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor 1236393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor if (DC->isFunctionOrMethod()) 1246393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor return false; 1256393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor } 1266393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor 1276393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor return false; 1286393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor} 1296393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor 13064650af7cc4352c6c67b9bd1bf8ef3ce7471b910Douglas GregorOriginalParmVarDecl *OriginalParmVarDecl::Create( 13173da9e462576faedc2cdf96b37a1c072b404b73dFariborz Jahanian ASTContext &C, DeclContext *DC, 13273da9e462576faedc2cdf96b37a1c072b404b73dFariborz Jahanian SourceLocation L, IdentifierInfo *Id, 133a1d5662d96465f0fddf8819d245da4d19b892effArgyrios Kyrtzidis QualType T, DeclaratorInfo *DInfo, 134a1d5662d96465f0fddf8819d245da4d19b892effArgyrios Kyrtzidis QualType OT, StorageClass S, Expr *DefArg) { 135a1d5662d96465f0fddf8819d245da4d19b892effArgyrios Kyrtzidis return new (C) OriginalParmVarDecl(DC, L, Id, T, DInfo, OT, S, DefArg); 13673da9e462576faedc2cdf96b37a1c072b404b73dFariborz Jahanian} 13773da9e462576faedc2cdf96b37a1c072b404b73dFariborz Jahanian 1389fdf9c6d3530bb85f3166e6460d841e2ff8e1a2cChris LattnerFunctionDecl *FunctionDecl::Create(ASTContext &C, DeclContext *DC, 1390ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner SourceLocation L, 140a1d5662d96465f0fddf8819d245da4d19b892effArgyrios Kyrtzidis DeclarationName N, QualType T, 141a1d5662d96465f0fddf8819d245da4d19b892effArgyrios Kyrtzidis DeclaratorInfo *DInfo, 142a98e58ddb4696a0020fe97439d5295413f9e90b1Chris Lattner StorageClass S, bool isInline, 143a5d82000f7b173a0a5ce34dc8c09a03f98d9e439Argyrios Kyrtzidis bool hasWrittenPrototype) { 1442224f84658fb9b3725a31f2680edb64ae73bf705Douglas Gregor FunctionDecl *New 145a5d82000f7b173a0a5ce34dc8c09a03f98d9e439Argyrios Kyrtzidis = new (C) FunctionDecl(Function, DC, L, N, T, DInfo, S, isInline); 146a75e8534f2b7c2480c48f31f301bd00b241c5499Anders Carlsson New->HasWrittenPrototype = hasWrittenPrototype; 1472224f84658fb9b3725a31f2680edb64ae73bf705Douglas Gregor return New; 148a98e58ddb4696a0020fe97439d5295413f9e90b1Chris Lattner} 149a98e58ddb4696a0020fe97439d5295413f9e90b1Chris Lattner 150090276f5e164d491a1bb3f541bafdb394f5e6f04Steve NaroffBlockDecl *BlockDecl::Create(ASTContext &C, DeclContext *DC, SourceLocation L) { 1513e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff return new (C) BlockDecl(DC, L); 15256ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff} 15356ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff 15444b4321feab46299d3f5cfd404680884752a0fcfDouglas GregorFieldDecl *FieldDecl::Create(ASTContext &C, DeclContext *DC, SourceLocation L, 155a1d5662d96465f0fddf8819d245da4d19b892effArgyrios Kyrtzidis IdentifierInfo *Id, QualType T, 156a5d82000f7b173a0a5ce34dc8c09a03f98d9e439Argyrios Kyrtzidis DeclaratorInfo *DInfo, Expr *BW, bool Mutable) { 157a5d82000f7b173a0a5ce34dc8c09a03f98d9e439Argyrios Kyrtzidis return new (C) FieldDecl(Decl::Field, DC, L, Id, T, DInfo, BW, Mutable); 1588e25d8681822d8094bfeb97b2239363552548171Chris Lattner} 1598e25d8681822d8094bfeb97b2239363552548171Chris Lattner 1606b3945f4bc757bdadd3e443180cf32c2cccb52a0Douglas Gregorbool FieldDecl::isAnonymousStructOrUnion() const { 1616b3945f4bc757bdadd3e443180cf32c2cccb52a0Douglas Gregor if (!isImplicit() || getDeclName()) 1626b3945f4bc757bdadd3e443180cf32c2cccb52a0Douglas Gregor return false; 1636b3945f4bc757bdadd3e443180cf32c2cccb52a0Douglas Gregor 1646217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek if (const RecordType *Record = getType()->getAs<RecordType>()) 1656b3945f4bc757bdadd3e443180cf32c2cccb52a0Douglas Gregor return Record->getDecl()->isAnonymousStructOrUnion(); 1666b3945f4bc757bdadd3e443180cf32c2cccb52a0Douglas Gregor 1676b3945f4bc757bdadd3e443180cf32c2cccb52a0Douglas Gregor return false; 1686b3945f4bc757bdadd3e443180cf32c2cccb52a0Douglas Gregor} 169a98e58ddb4696a0020fe97439d5295413f9e90b1Chris Lattner 1700ed844b04ea4387caa4e1cf3dc375d269657536bChris LattnerEnumConstantDecl *EnumConstantDecl::Create(ASTContext &C, EnumDecl *CD, 1710ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner SourceLocation L, 172c63e660882ff93841fa234d70ef6757038302b92Chris Lattner IdentifierInfo *Id, QualType T, 1734afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor Expr *E, const llvm::APSInt &V) { 1743e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff return new (C) EnumConstantDecl(CD, L, Id, T, E, V); 1756c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner} 1766c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner 177d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenekvoid EnumConstantDecl::Destroy(ASTContext& C) { 178d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenek if (Init) Init->Destroy(C); 179d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenek Decl::Destroy(C); 180d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenek} 181d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenek 1829fdf9c6d3530bb85f3166e6460d841e2ff8e1a2cChris LattnerTypedefDecl *TypedefDecl::Create(ASTContext &C, DeclContext *DC, 1830ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner SourceLocation L, 1844afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor IdentifierInfo *Id, QualType T) { 1853e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff return new (C) TypedefDecl(DC, L, Id, T); 1866c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner} 1876c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner 1889fdf9c6d3530bb85f3166e6460d841e2ff8e1a2cChris LattnerEnumDecl *EnumDecl::Create(ASTContext &C, DeclContext *DC, SourceLocation L, 189741dd9a7e1d63e4e385b657e4ce11c5d96d44f72Douglas Gregor IdentifierInfo *Id, SourceLocation TKL, 1907df7b6bb800e1987951285ea192e4f347e1b603aDouglas Gregor EnumDecl *PrevDecl) { 1918e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor EnumDecl *Enum = new (C) EnumDecl(DC, L, Id, PrevDecl, TKL); 1927df7b6bb800e1987951285ea192e4f347e1b603aDouglas Gregor C.getTypeDeclType(Enum, PrevDecl); 1937df7b6bb800e1987951285ea192e4f347e1b603aDouglas Gregor return Enum; 1946c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner} 1956c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner 196df91eca19bd9738abd9a3b84791f39750e27ad36Ted Kremenekvoid EnumDecl::Destroy(ASTContext& C) { 197df91eca19bd9738abd9a3b84791f39750e27ad36Ted Kremenek Decl::Destroy(C); 198df91eca19bd9738abd9a3b84791f39750e27ad36Ted Kremenek} 199df91eca19bd9738abd9a3b84791f39750e27ad36Ted Kremenek 20044b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregorvoid EnumDecl::completeDefinition(ASTContext &C, QualType NewType) { 20144b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor assert(!isDefinition() && "Cannot redefine enums!"); 20244b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor IntegerType = NewType; 2030b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregor TagDecl::completeDefinition(); 20444b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor} 20544b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 2064afa39deaa245592977136d367251ee2c173dd8dDouglas GregorFileScopeAsmDecl *FileScopeAsmDecl::Create(ASTContext &C, DeclContext *DC, 2070ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner SourceLocation L, 2088e25d8681822d8094bfeb97b2239363552548171Chris Lattner StringLiteral *Str) { 2093e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff return new (C) FileScopeAsmDecl(DC, L, Str); 2108e25d8681822d8094bfeb97b2239363552548171Chris Lattner} 2118e25d8681822d8094bfeb97b2239363552548171Chris Lattner 2126c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner//===----------------------------------------------------------------------===// 2134afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor// NamedDecl Implementation 2145239304ff761b8b03eefb772bd5d830a9b9f1aeaArgyrios Kyrtzidis//===----------------------------------------------------------------------===// 2155239304ff761b8b03eefb772bd5d830a9b9f1aeaArgyrios Kyrtzidis 21647b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregorstd::string NamedDecl::getQualifiedNameAsString() const { 21747b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor std::vector<std::string> Names; 21847b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor std::string QualName; 21947b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor const DeclContext *Ctx = getDeclContext(); 22047b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor 22147b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor if (Ctx->isFunctionOrMethod()) 22247b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor return getNameAsString(); 22347b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor 22447b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor while (Ctx) { 22547b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor if (Ctx->isFunctionOrMethod()) 22647b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor // FIXME: That probably will happen, when D was member of local 22747b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor // scope class/struct/union. How do we handle this case? 22847b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor break; 22947b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor 230f3e7ce4bd9837cdab6a096235922865f95467d3dDouglas Gregor if (const ClassTemplateSpecializationDecl *Spec 231f3e7ce4bd9837cdab6a096235922865f95467d3dDouglas Gregor = dyn_cast<ClassTemplateSpecializationDecl>(Ctx)) { 232f3e7ce4bd9837cdab6a096235922865f95467d3dDouglas Gregor const TemplateArgumentList &TemplateArgs = Spec->getTemplateArgs(); 233e4f2142d00fa5fdb580c4e2413da91882d955381Chris Lattner PrintingPolicy Policy(getASTContext().getLangOptions()); 234f3e7ce4bd9837cdab6a096235922865f95467d3dDouglas Gregor std::string TemplateArgsStr 235f3e7ce4bd9837cdab6a096235922865f95467d3dDouglas Gregor = TemplateSpecializationType::PrintTemplateArgumentList( 236f3e7ce4bd9837cdab6a096235922865f95467d3dDouglas Gregor TemplateArgs.getFlatArgumentList(), 237d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor TemplateArgs.flat_size(), 238d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor Policy); 239f3e7ce4bd9837cdab6a096235922865f95467d3dDouglas Gregor Names.push_back(Spec->getIdentifier()->getName() + TemplateArgsStr); 240f3e7ce4bd9837cdab6a096235922865f95467d3dDouglas Gregor } else if (const NamedDecl *ND = dyn_cast<NamedDecl>(Ctx)) 24147b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor Names.push_back(ND->getNameAsString()); 24247b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor else 24347b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor break; 24447b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor 24547b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor Ctx = Ctx->getParent(); 24647b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor } 24747b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor 24847b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor std::vector<std::string>::reverse_iterator 24947b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor I = Names.rbegin(), 25047b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor End = Names.rend(); 25147b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor 25247b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor for (; I!=End; ++I) 25347b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor QualName += *I + "::"; 25447b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor 25547b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor QualName += getNameAsString(); 25647b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor 25747b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor return QualName; 25847b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor} 25947b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor 26047b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor 2614afa39deaa245592977136d367251ee2c173dd8dDouglas Gregorbool NamedDecl::declarationReplaces(NamedDecl *OldD) const { 2626ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor assert(getDeclName() == OldD->getDeclName() && "Declaration name mismatch"); 2636ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor 2642a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor // UsingDirectiveDecl's are not really NamedDecl's, and all have same name. 2652a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor // We want to keep it, unless it nominates same namespace. 2662a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor if (getKind() == Decl::UsingDirective) { 2672a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor return cast<UsingDirectiveDecl>(this)->getNominatedNamespace() == 2682a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor cast<UsingDirectiveDecl>(OldD)->getNominatedNamespace(); 2692a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor } 2702a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor 2716ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(this)) 2726ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor // For function declarations, we keep track of redeclarations. 2736ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor return FD->getPreviousDeclaration() == OldD; 2746ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor 275e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor // For function templates, the underlying function declarations are linked. 276e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor if (const FunctionTemplateDecl *FunctionTemplate 277e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor = dyn_cast<FunctionTemplateDecl>(this)) 278e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor if (const FunctionTemplateDecl *OldFunctionTemplate 279e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor = dyn_cast<FunctionTemplateDecl>(OldD)) 280e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor return FunctionTemplate->getTemplatedDecl() 281e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor ->declarationReplaces(OldFunctionTemplate->getTemplatedDecl()); 282e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor 2830de21fd85d79bccd32f04256f5b3328ab5ed7c95Steve Naroff // For method declarations, we keep track of redeclarations. 2840de21fd85d79bccd32f04256f5b3328ab5ed7c95Steve Naroff if (isa<ObjCMethodDecl>(this)) 2850de21fd85d79bccd32f04256f5b3328ab5ed7c95Steve Naroff return false; 2860de21fd85d79bccd32f04256f5b3328ab5ed7c95Steve Naroff 2876ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor // For non-function declarations, if the declarations are of the 2886ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor // same kind then this must be a redeclaration, or semantic analysis 2896ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor // would not have given us the new declaration. 2906ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor return this->getKind() == OldD->getKind(); 2916ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor} 2926ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor 293d6f7e9dccd0fa8a5a15d7478324c0ae229fc5e1eDouglas Gregorbool NamedDecl::hasLinkage() const { 294d6f7e9dccd0fa8a5a15d7478324c0ae229fc5e1eDouglas Gregor if (const VarDecl *VD = dyn_cast<VarDecl>(this)) 295d6f7e9dccd0fa8a5a15d7478324c0ae229fc5e1eDouglas Gregor return VD->hasExternalStorage() || VD->isFileVarDecl(); 296d6f7e9dccd0fa8a5a15d7478324c0ae229fc5e1eDouglas Gregor 297d6f7e9dccd0fa8a5a15d7478324c0ae229fc5e1eDouglas Gregor if (isa<FunctionDecl>(this) && !isa<CXXMethodDecl>(this)) 298d6f7e9dccd0fa8a5a15d7478324c0ae229fc5e1eDouglas Gregor return true; 299d6f7e9dccd0fa8a5a15d7478324c0ae229fc5e1eDouglas Gregor 300d6f7e9dccd0fa8a5a15d7478324c0ae229fc5e1eDouglas Gregor return false; 301d6f7e9dccd0fa8a5a15d7478324c0ae229fc5e1eDouglas Gregor} 3024afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor 303e136e0e1b74760d7ec3ede38e0e739d5c52a3c0aAnders CarlssonNamedDecl *NamedDecl::getUnderlyingDecl() { 304e136e0e1b74760d7ec3ede38e0e739d5c52a3c0aAnders Carlsson NamedDecl *ND = this; 305e136e0e1b74760d7ec3ede38e0e739d5c52a3c0aAnders Carlsson while (true) { 306e136e0e1b74760d7ec3ede38e0e739d5c52a3c0aAnders Carlsson if (UsingDecl *UD = dyn_cast<UsingDecl>(ND)) 307e136e0e1b74760d7ec3ede38e0e739d5c52a3c0aAnders Carlsson ND = UD->getTargetDecl(); 308e136e0e1b74760d7ec3ede38e0e739d5c52a3c0aAnders Carlsson else if (ObjCCompatibleAliasDecl *AD 309e136e0e1b74760d7ec3ede38e0e739d5c52a3c0aAnders Carlsson = dyn_cast<ObjCCompatibleAliasDecl>(ND)) 310e136e0e1b74760d7ec3ede38e0e739d5c52a3c0aAnders Carlsson return AD->getClassInterface(); 311e136e0e1b74760d7ec3ede38e0e739d5c52a3c0aAnders Carlsson else 312e136e0e1b74760d7ec3ede38e0e739d5c52a3c0aAnders Carlsson return ND; 313e136e0e1b74760d7ec3ede38e0e739d5c52a3c0aAnders Carlsson } 314e136e0e1b74760d7ec3ede38e0e739d5c52a3c0aAnders Carlsson} 315e136e0e1b74760d7ec3ede38e0e739d5c52a3c0aAnders Carlsson 3165239304ff761b8b03eefb772bd5d830a9b9f1aeaArgyrios Kyrtzidis//===----------------------------------------------------------------------===// 317a5d82000f7b173a0a5ce34dc8c09a03f98d9e439Argyrios Kyrtzidis// DeclaratorDecl Implementation 318a5d82000f7b173a0a5ce34dc8c09a03f98d9e439Argyrios Kyrtzidis//===----------------------------------------------------------------------===// 319a5d82000f7b173a0a5ce34dc8c09a03f98d9e439Argyrios Kyrtzidis 320a5d82000f7b173a0a5ce34dc8c09a03f98d9e439Argyrios KyrtzidisSourceLocation DeclaratorDecl::getTypeSpecStartLoc() const { 321a5d82000f7b173a0a5ce34dc8c09a03f98d9e439Argyrios Kyrtzidis if (DeclInfo) 322a5d82000f7b173a0a5ce34dc8c09a03f98d9e439Argyrios Kyrtzidis return DeclInfo->getTypeLoc().getTypeSpecRange().getBegin(); 323a5d82000f7b173a0a5ce34dc8c09a03f98d9e439Argyrios Kyrtzidis return SourceLocation(); 324a5d82000f7b173a0a5ce34dc8c09a03f98d9e439Argyrios Kyrtzidis} 325a5d82000f7b173a0a5ce34dc8c09a03f98d9e439Argyrios Kyrtzidis 326a5d82000f7b173a0a5ce34dc8c09a03f98d9e439Argyrios Kyrtzidis//===----------------------------------------------------------------------===// 32799f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes// VarDecl Implementation 32899f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes//===----------------------------------------------------------------------===// 32999f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes 3304afa39deaa245592977136d367251ee2c173dd8dDouglas GregorVarDecl *VarDecl::Create(ASTContext &C, DeclContext *DC, SourceLocation L, 331a1d5662d96465f0fddf8819d245da4d19b892effArgyrios Kyrtzidis IdentifierInfo *Id, QualType T, DeclaratorInfo *DInfo, 332a5d82000f7b173a0a5ce34dc8c09a03f98d9e439Argyrios Kyrtzidis StorageClass S) { 333a5d82000f7b173a0a5ce34dc8c09a03f98d9e439Argyrios Kyrtzidis return new (C) VarDecl(Var, DC, L, Id, T, DInfo, S); 33499f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes} 33599f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes 33699f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopesvoid VarDecl::Destroy(ASTContext& C) { 337df2d3cf2be8b91e1e21234ff5a3aa4f820e7001aSebastian Redl Expr *Init = getInit(); 33878d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor if (Init) { 339df2d3cf2be8b91e1e21234ff5a3aa4f820e7001aSebastian Redl Init->Destroy(C); 34078d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor if (EvaluatedStmt *Eval = this->Init.dyn_cast<EvaluatedStmt *>()) { 34178d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor Eval->~EvaluatedStmt(); 34278d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor C.Deallocate(Eval); 34378d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor } 34478d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor } 34599f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes this->~VarDecl(); 3463e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff C.Deallocate((void *)this); 34799f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes} 34899f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes 34999f06ba988922ea721035a89e6d3c66ba100ba8aNuno LopesVarDecl::~VarDecl() { 35099f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes} 35199f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes 35255d608cbadf1e9c05064f9287c057d50b7df65b4Argyrios KyrtzidisSourceRange VarDecl::getSourceRange() const { 35355d608cbadf1e9c05064f9287c057d50b7df65b4Argyrios Kyrtzidis if (getInit()) 35455d608cbadf1e9c05064f9287c057d50b7df65b4Argyrios Kyrtzidis return SourceRange(getLocation(), getInit()->getLocEnd()); 35555d608cbadf1e9c05064f9287c057d50b7df65b4Argyrios Kyrtzidis return SourceRange(getLocation(), getLocation()); 35655d608cbadf1e9c05064f9287c057d50b7df65b4Argyrios Kyrtzidis} 35755d608cbadf1e9c05064f9287c057d50b7df65b4Argyrios Kyrtzidis 3587caa6825f42a0f7e97d6fc06233133c42b218e46Douglas GregorVarDecl *VarDecl::getInstantiatedFromStaticDataMember() { 3597caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor return getASTContext().getInstantiatedFromStaticDataMember(this); 3607caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor} 3617caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor 362275a369f003f25bd22c00c1c0fc0251c7208caf4Douglas Gregorbool VarDecl::isTentativeDefinition(ASTContext &Context) const { 363275a369f003f25bd22c00c1c0fc0251c7208caf4Douglas Gregor if (!isFileVarDecl() || Context.getLangOptions().CPlusPlus) 364275a369f003f25bd22c00c1c0fc0251c7208caf4Douglas Gregor return false; 365275a369f003f25bd22c00c1c0fc0251c7208caf4Douglas Gregor 366b6c8c8bd8d362c8a6cdb767415b0d21e62b77eb2Douglas Gregor const VarDecl *Def = 0; 367b6c8c8bd8d362c8a6cdb767415b0d21e62b77eb2Douglas Gregor return (!getDefinition(Def) && 368275a369f003f25bd22c00c1c0fc0251c7208caf4Douglas Gregor (getStorageClass() == None || getStorageClass() == Static)); 369275a369f003f25bd22c00c1c0fc0251c7208caf4Douglas Gregor} 370275a369f003f25bd22c00c1c0fc0251c7208caf4Douglas Gregor 371082d936a5b8323ac2c04558d8bca277a647831a3Ted Kremenekconst Expr *VarDecl::getDefinition(const VarDecl *&Def) const { 372c37929c9e0dba89770dc5f0fbcfa0c9046da0b06Argyrios Kyrtzidis redecl_iterator I = redecls_begin(), E = redecls_end(); 373c37929c9e0dba89770dc5f0fbcfa0c9046da0b06Argyrios Kyrtzidis while (I != E && !I->getInit()) 374c37929c9e0dba89770dc5f0fbcfa0c9046da0b06Argyrios Kyrtzidis ++I; 375275a369f003f25bd22c00c1c0fc0251c7208caf4Douglas Gregor 376c37929c9e0dba89770dc5f0fbcfa0c9046da0b06Argyrios Kyrtzidis if (I != E) { 377c37929c9e0dba89770dc5f0fbcfa0c9046da0b06Argyrios Kyrtzidis Def = *I; 378c37929c9e0dba89770dc5f0fbcfa0c9046da0b06Argyrios Kyrtzidis return I->getInit(); 379c37929c9e0dba89770dc5f0fbcfa0c9046da0b06Argyrios Kyrtzidis } 380c37929c9e0dba89770dc5f0fbcfa0c9046da0b06Argyrios Kyrtzidis return 0; 381275a369f003f25bd22c00c1c0fc0251c7208caf4Douglas Gregor} 382275a369f003f25bd22c00c1c0fc0251c7208caf4Douglas Gregor 383b57a4fe73b8227c0dba651818b8495dfca61e530Argyrios KyrtzidisVarDecl *VarDecl::getCanonicalDecl() { 384f23e839e9ddea324c743d26da43fb767f90ca223Argyrios Kyrtzidis return getFirstDeclaration(); 385fc7e2a8fbb08f0f496ac6cea0721fe72db8ce240Argyrios Kyrtzidis} 386fc7e2a8fbb08f0f496ac6cea0721fe72db8ce240Argyrios Kyrtzidis 38799f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes//===----------------------------------------------------------------------===// 3888a934233d1582b5bde9d270bc0705aa81e471a79Chris Lattner// FunctionDecl Implementation 3898a934233d1582b5bde9d270bc0705aa81e471a79Chris Lattner//===----------------------------------------------------------------------===// 3908a934233d1582b5bde9d270bc0705aa81e471a79Chris Lattner 39127f8a28bee33bb0e857cfe1a61c281bbc234b338Ted Kremenekvoid FunctionDecl::Destroy(ASTContext& C) { 392250fc9c859fdeed3f200ae911a7e7ea338f38436Douglas Gregor if (Body && Body.isOffset()) 393250fc9c859fdeed3f200ae911a7e7ea338f38436Douglas Gregor Body.get(C.getExternalSource())->Destroy(C); 394b65cf41707d190d5ce3d48b9e5bd2dc9d7b4a4c0Ted Kremenek 395b65cf41707d190d5ce3d48b9e5bd2dc9d7b4a4c0Ted Kremenek for (param_iterator I=param_begin(), E=param_end(); I!=E; ++I) 396b65cf41707d190d5ce3d48b9e5bd2dc9d7b4a4c0Ted Kremenek (*I)->Destroy(C); 397460b0ac80382fa73337d21dd052c1f18b27435d8Nuno Lopes 3983e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff C.Deallocate(ParamInfo); 399460b0ac80382fa73337d21dd052c1f18b27435d8Nuno Lopes 40027f8a28bee33bb0e857cfe1a61c281bbc234b338Ted Kremenek Decl::Destroy(C); 40127f8a28bee33bb0e857cfe1a61c281bbc234b338Ted Kremenek} 40227f8a28bee33bb0e857cfe1a61c281bbc234b338Ted Kremenek 40327f8a28bee33bb0e857cfe1a61c281bbc234b338Ted Kremenek 4046fb0aee4f9dc261bbec72e1283ad8dc0557a6d96Argyrios KyrtzidisStmt *FunctionDecl::getBody(const FunctionDecl *&Definition) const { 405c37929c9e0dba89770dc5f0fbcfa0c9046da0b06Argyrios Kyrtzidis for (redecl_iterator I = redecls_begin(), E = redecls_end(); I != E; ++I) { 406c37929c9e0dba89770dc5f0fbcfa0c9046da0b06Argyrios Kyrtzidis if (I->Body) { 407c37929c9e0dba89770dc5f0fbcfa0c9046da0b06Argyrios Kyrtzidis Definition = *I; 408c37929c9e0dba89770dc5f0fbcfa0c9046da0b06Argyrios Kyrtzidis return I->Body.get(getASTContext().getExternalSource()); 409f009795057dc8ca254f5618c80a0a90f07cd44b4Douglas Gregor } 410f009795057dc8ca254f5618c80a0a90f07cd44b4Douglas Gregor } 411f009795057dc8ca254f5618c80a0a90f07cd44b4Douglas Gregor 412f009795057dc8ca254f5618c80a0a90f07cd44b4Douglas Gregor return 0; 4135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 4145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 415d3a413d3b8eb39bcee5944bc545d9997c1abe492Sebastian RedlStmt *FunctionDecl::getBodyIfAvailable() const { 416c37929c9e0dba89770dc5f0fbcfa0c9046da0b06Argyrios Kyrtzidis for (redecl_iterator I = redecls_begin(), E = redecls_end(); I != E; ++I) { 417c37929c9e0dba89770dc5f0fbcfa0c9046da0b06Argyrios Kyrtzidis if (I->Body && !I->Body.isOffset()) { 418c37929c9e0dba89770dc5f0fbcfa0c9046da0b06Argyrios Kyrtzidis return I->Body.get(0); 419250fc9c859fdeed3f200ae911a7e7ea338f38436Douglas Gregor } 4207297134f128423fce2e88f92421ed135bded7d4eDouglas Gregor } 4217297134f128423fce2e88f92421ed135bded7d4eDouglas Gregor 4227297134f128423fce2e88f92421ed135bded7d4eDouglas Gregor return 0; 4237297134f128423fce2e88f92421ed135bded7d4eDouglas Gregor} 4247297134f128423fce2e88f92421ed135bded7d4eDouglas Gregor 42555d608cbadf1e9c05064f9287c057d50b7df65b4Argyrios Kyrtzidisvoid FunctionDecl::setBody(Stmt *B) { 42655d608cbadf1e9c05064f9287c057d50b7df65b4Argyrios Kyrtzidis Body = B; 4271a5364e0fa0482d8d477d6f136d52e503bbe13f4Argyrios Kyrtzidis if (B) 42855d608cbadf1e9c05064f9287c057d50b7df65b4Argyrios Kyrtzidis EndRangeLoc = B->getLocEnd(); 42955d608cbadf1e9c05064f9287c057d50b7df65b4Argyrios Kyrtzidis} 43055d608cbadf1e9c05064f9287c057d50b7df65b4Argyrios Kyrtzidis 43107a5c22bb6fb0674c95205ae189365bf8e1b695eJohn McCallbool FunctionDecl::isMain(ASTContext &Context) const { 43207a5c22bb6fb0674c95205ae189365bf8e1b695eJohn McCall return !Context.getLangOptions().Freestanding && 43307a5c22bb6fb0674c95205ae189365bf8e1b695eJohn McCall getDeclContext()->getLookupContext()->isTranslationUnit() && 43404495c859f81e440748a9b86baa2913461652bb0Douglas Gregor getIdentifier() && getIdentifier()->isStr("main"); 43504495c859f81e440748a9b86baa2913461652bb0Douglas Gregor} 43604495c859f81e440748a9b86baa2913461652bb0Douglas Gregor 4376393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregorbool FunctionDecl::isExternC(ASTContext &Context) const { 4386393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor // In C, any non-static, non-overloadable function has external 4396393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor // linkage. 4406393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor if (!Context.getLangOptions().CPlusPlus) 44140b598eea1310ec9ed554d56ce3e25b34c585458Argyrios Kyrtzidis return getStorageClass() != Static && !getAttr<OverloadableAttr>(); 4426393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor 4436393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor for (const DeclContext *DC = getDeclContext(); !DC->isTranslationUnit(); 4446393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor DC = DC->getParent()) { 4456393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor if (const LinkageSpecDecl *Linkage = dyn_cast<LinkageSpecDecl>(DC)) { 4466393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor if (Linkage->getLanguage() == LinkageSpecDecl::lang_c) 44768584ed35ad819a1668e3f527ba7f5dd4ae6a333Douglas Gregor return getStorageClass() != Static && 44840b598eea1310ec9ed554d56ce3e25b34c585458Argyrios Kyrtzidis !getAttr<OverloadableAttr>(); 4496393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor 4506393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor break; 4516393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor } 4526393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor } 4536393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor 4546393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor return false; 4556393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor} 4566393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor 4578499f3f5ff8d5f95ece8047780030a3daad1b6faDouglas Gregorbool FunctionDecl::isGlobal() const { 4588499f3f5ff8d5f95ece8047780030a3daad1b6faDouglas Gregor if (const CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(this)) 4598499f3f5ff8d5f95ece8047780030a3daad1b6faDouglas Gregor return Method->isStatic(); 4608499f3f5ff8d5f95ece8047780030a3daad1b6faDouglas Gregor 4618499f3f5ff8d5f95ece8047780030a3daad1b6faDouglas Gregor if (getStorageClass() == Static) 4628499f3f5ff8d5f95ece8047780030a3daad1b6faDouglas Gregor return false; 4638499f3f5ff8d5f95ece8047780030a3daad1b6faDouglas Gregor 4648499f3f5ff8d5f95ece8047780030a3daad1b6faDouglas Gregor for (const DeclContext *DC = getDeclContext(); 4658499f3f5ff8d5f95ece8047780030a3daad1b6faDouglas Gregor DC->isNamespace(); 4668499f3f5ff8d5f95ece8047780030a3daad1b6faDouglas Gregor DC = DC->getParent()) { 4678499f3f5ff8d5f95ece8047780030a3daad1b6faDouglas Gregor if (const NamespaceDecl *Namespace = cast<NamespaceDecl>(DC)) { 4688499f3f5ff8d5f95ece8047780030a3daad1b6faDouglas Gregor if (!Namespace->getDeclName()) 4698499f3f5ff8d5f95ece8047780030a3daad1b6faDouglas Gregor return false; 4708499f3f5ff8d5f95ece8047780030a3daad1b6faDouglas Gregor break; 4718499f3f5ff8d5f95ece8047780030a3daad1b6faDouglas Gregor } 4728499f3f5ff8d5f95ece8047780030a3daad1b6faDouglas Gregor } 4738499f3f5ff8d5f95ece8047780030a3daad1b6faDouglas Gregor 4748499f3f5ff8d5f95ece8047780030a3daad1b6faDouglas Gregor return true; 4758499f3f5ff8d5f95ece8047780030a3daad1b6faDouglas Gregor} 4768499f3f5ff8d5f95ece8047780030a3daad1b6faDouglas Gregor 4773e41d60eb627dc227c770f1c1c87d06909cf05fdDouglas Gregor/// \brief Returns a value indicating whether this function 4783e41d60eb627dc227c770f1c1c87d06909cf05fdDouglas Gregor/// corresponds to a builtin function. 4793e41d60eb627dc227c770f1c1c87d06909cf05fdDouglas Gregor/// 4803e41d60eb627dc227c770f1c1c87d06909cf05fdDouglas Gregor/// The function corresponds to a built-in function if it is 4813e41d60eb627dc227c770f1c1c87d06909cf05fdDouglas Gregor/// declared at translation scope or within an extern "C" block and 4823e41d60eb627dc227c770f1c1c87d06909cf05fdDouglas Gregor/// its name matches with the name of a builtin. The returned value 4833e41d60eb627dc227c770f1c1c87d06909cf05fdDouglas Gregor/// will be 0 for functions that do not correspond to a builtin, a 4843e41d60eb627dc227c770f1c1c87d06909cf05fdDouglas Gregor/// value of type \c Builtin::ID if in the target-independent range 4853e41d60eb627dc227c770f1c1c87d06909cf05fdDouglas Gregor/// \c [1,Builtin::First), or a target-specific builtin value. 4863c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregorunsigned FunctionDecl::getBuiltinID(ASTContext &Context) const { 4873c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor if (!getIdentifier() || !getIdentifier()->getBuiltinID()) 4883c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor return 0; 4893c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor 4903c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor unsigned BuiltinID = getIdentifier()->getBuiltinID(); 4913c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor if (!Context.BuiltinInfo.isPredefinedLibFunction(BuiltinID)) 4923c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor return BuiltinID; 4933c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor 4943c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor // This function has the name of a known C library 4953c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor // function. Determine whether it actually refers to the C library 4963c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor // function or whether it just has the same name. 4973c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor 4989add31798f621f843233dbff8bba103fca64447bDouglas Gregor // If this is a static function, it's not a builtin. 4999add31798f621f843233dbff8bba103fca64447bDouglas Gregor if (getStorageClass() == Static) 5009add31798f621f843233dbff8bba103fca64447bDouglas Gregor return 0; 5019add31798f621f843233dbff8bba103fca64447bDouglas Gregor 5023c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor // If this function is at translation-unit scope and we're not in 5033c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor // C++, it refers to the C library function. 5043c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor if (!Context.getLangOptions().CPlusPlus && 5053c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor getDeclContext()->isTranslationUnit()) 5063c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor return BuiltinID; 5073c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor 5083c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor // If the function is in an extern "C" linkage specification and is 5093c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor // not marked "overloadable", it's the real function. 5103c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor if (isa<LinkageSpecDecl>(getDeclContext()) && 5113c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor cast<LinkageSpecDecl>(getDeclContext())->getLanguage() 5123c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor == LinkageSpecDecl::lang_c && 51340b598eea1310ec9ed554d56ce3e25b34c585458Argyrios Kyrtzidis !getAttr<OverloadableAttr>()) 5143c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor return BuiltinID; 5153c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor 5163c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor // Not a builtin 5173e41d60eb627dc227c770f1c1c87d06909cf05fdDouglas Gregor return 0; 5183e41d60eb627dc227c770f1c1c87d06909cf05fdDouglas Gregor} 5193e41d60eb627dc227c770f1c1c87d06909cf05fdDouglas Gregor 5203e41d60eb627dc227c770f1c1c87d06909cf05fdDouglas Gregor 5211ad9b28e3217c2349a04f3d3bf14f9c73a99afa7Chris Lattner/// getNumParams - Return the number of parameters this function must have 5222dbd285f5033ca6dea25babfd1c43d9fec35e7e5Chris Lattner/// based on its FunctionType. This is the length of the PararmInfo array 5231ad9b28e3217c2349a04f3d3bf14f9c73a99afa7Chris Lattner/// after it has been created. 5241ad9b28e3217c2349a04f3d3bf14f9c73a99afa7Chris Lattnerunsigned FunctionDecl::getNumParams() const { 52511ddb7dc22bb398a6727318729680630bfcefaaeChris Lattner const FunctionType *FT = getType()->getAsFunctionType(); 52672564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor if (isa<FunctionNoProtoType>(FT)) 527d3b9065ec7052ec4741783d2fb4130d13c766933Chris Lattner return 0; 52872564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor return cast<FunctionProtoType>(FT)->getNumArgs(); 52911ddb7dc22bb398a6727318729680630bfcefaaeChris Lattner 5305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 5315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 532fc767615bc67d3a7587b1fb2e0494c32c9dbd7a5Ted Kremenekvoid FunctionDecl::setParams(ASTContext& C, ParmVarDecl **NewParamInfo, 533fc767615bc67d3a7587b1fb2e0494c32c9dbd7a5Ted Kremenek unsigned NumParams) { 5345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer assert(ParamInfo == 0 && "Already has param info!"); 5352dbd285f5033ca6dea25babfd1c43d9fec35e7e5Chris Lattner assert(NumParams == getNumParams() && "Parameter count mismatch!"); 5365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 5375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Zero params -> null pointer. 5385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (NumParams) { 539c0ac4923f08b25ae973a8ee7942cf3eb89da57b7Steve Naroff void *Mem = C.Allocate(sizeof(ParmVarDecl*)*NumParams); 540fc767615bc67d3a7587b1fb2e0494c32c9dbd7a5Ted Kremenek ParamInfo = new (Mem) ParmVarDecl*[NumParams]; 5415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer memcpy(ParamInfo, NewParamInfo, sizeof(ParmVarDecl*)*NumParams); 54255d608cbadf1e9c05064f9287c057d50b7df65b4Argyrios Kyrtzidis 54396888cc2515e55c9b5dd6798063bf4be2c22983aArgyrios Kyrtzidis // Update source range. The check below allows us to set EndRangeLoc before 54496888cc2515e55c9b5dd6798063bf4be2c22983aArgyrios Kyrtzidis // setting the parameters. 545cb5f8f59322c352f51714c3de5d8047e70895165Argyrios Kyrtzidis if (EndRangeLoc.isInvalid() || EndRangeLoc == getLocation()) 54655d608cbadf1e9c05064f9287c057d50b7df65b4Argyrios Kyrtzidis EndRangeLoc = NewParamInfo[NumParams-1]->getLocEnd(); 5475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 5485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 5495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 5508123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner/// getMinRequiredArguments - Returns the minimum number of arguments 5518123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner/// needed to call this function. This may be fewer than the number of 5528123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner/// function parameters, if some of the parameters have default 5539e979557eea3875c9e3d100c68188233dd7f46c0Chris Lattner/// arguments (in C++). 5548123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattnerunsigned FunctionDecl::getMinRequiredArguments() const { 5558123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner unsigned NumRequiredArgs = getNumParams(); 5568123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner while (NumRequiredArgs > 0 557ae0b4e7be78cf0dc2a6a333e865c2be9265774f9Anders Carlsson && getParamDecl(NumRequiredArgs-1)->hasDefaultArg()) 5588123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner --NumRequiredArgs; 5598123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner 5608123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner return NumRequiredArgs; 5618123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner} 5628123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner 56368584ed35ad819a1668e3f527ba7f5dd4ae6a333Douglas Gregorbool FunctionDecl::hasActiveGNUInlineAttribute(ASTContext &Context) const { 56440b598eea1310ec9ed554d56ce3e25b34c585458Argyrios Kyrtzidis if (!isInline() || !hasAttr<GNUInlineAttr>()) 5659f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor return false; 5669f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor 567c37929c9e0dba89770dc5f0fbcfa0c9046da0b06Argyrios Kyrtzidis for (redecl_iterator I = redecls_begin(), E = redecls_end(); I != E; ++I) 568c37929c9e0dba89770dc5f0fbcfa0c9046da0b06Argyrios Kyrtzidis if (I->isInline() && !I->hasAttr<GNUInlineAttr>()) 5699f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor return false; 5709f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor 5719f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor return true; 5729f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor} 5739f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor 57468584ed35ad819a1668e3f527ba7f5dd4ae6a333Douglas Gregorbool FunctionDecl::isExternGNUInline(ASTContext &Context) const { 57568584ed35ad819a1668e3f527ba7f5dd4ae6a333Douglas Gregor if (!hasActiveGNUInlineAttribute(Context)) 5769f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor return false; 5779f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor 578c37929c9e0dba89770dc5f0fbcfa0c9046da0b06Argyrios Kyrtzidis for (redecl_iterator I = redecls_begin(), E = redecls_end(); I != E; ++I) 579c37929c9e0dba89770dc5f0fbcfa0c9046da0b06Argyrios Kyrtzidis if (I->getStorageClass() == Extern && I->hasAttr<GNUInlineAttr>()) 5809f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor return true; 5819f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor 5829f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor return false; 5839f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor} 5849f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor 585127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregorvoid 586127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas GregorFunctionDecl::setPreviousDeclaration(FunctionDecl *PrevDecl) { 5871e4bc099882626059f14d687ed7a1a5518b7f3c2Argyrios Kyrtzidis redeclarable_base::setPreviousDeclaration(PrevDecl); 588f23e839e9ddea324c743d26da43fb767f90ca223Argyrios Kyrtzidis 589127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor if (FunctionTemplateDecl *FunTmpl = getDescribedFunctionTemplate()) { 590127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor FunctionTemplateDecl *PrevFunTmpl 591127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor = PrevDecl? PrevDecl->getDescribedFunctionTemplate() : 0; 592127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor assert((!PrevDecl || PrevFunTmpl) && "Function/function template mismatch"); 593127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor FunTmpl->setPreviousDeclaration(PrevFunTmpl); 594127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor } 595127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor} 596127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor 597b57a4fe73b8227c0dba651818b8495dfca61e530Argyrios KyrtzidisFunctionDecl *FunctionDecl::getCanonicalDecl() { 598f23e839e9ddea324c743d26da43fb767f90ca223Argyrios Kyrtzidis return getFirstDeclaration(); 599fc7e2a8fbb08f0f496ac6cea0721fe72db8ce240Argyrios Kyrtzidis} 600fc7e2a8fbb08f0f496ac6cea0721fe72db8ce240Argyrios Kyrtzidis 6011cd1b1e987f5e2f060d7972b13d83239b36d77d6Douglas Gregor/// getOverloadedOperator - Which C++ overloaded operator this 6021cd1b1e987f5e2f060d7972b13d83239b36d77d6Douglas Gregor/// function represents, if any. 6031cd1b1e987f5e2f060d7972b13d83239b36d77d6Douglas GregorOverloadedOperatorKind FunctionDecl::getOverloadedOperator() const { 604e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor if (getDeclName().getNameKind() == DeclarationName::CXXOperatorName) 605e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor return getDeclName().getCXXOverloadedOperator(); 6061cd1b1e987f5e2f060d7972b13d83239b36d77d6Douglas Gregor else 6071cd1b1e987f5e2f060d7972b13d83239b36d77d6Douglas Gregor return OO_None; 6081cd1b1e987f5e2f060d7972b13d83239b36d77d6Douglas Gregor} 6091cd1b1e987f5e2f060d7972b13d83239b36d77d6Douglas Gregor 61016e8be2ac532358d4e413fdfa2643b1876edda78Douglas GregorFunctionTemplateDecl *FunctionDecl::getPrimaryTemplate() const { 61116e8be2ac532358d4e413fdfa2643b1876edda78Douglas Gregor if (FunctionTemplateSpecializationInfo *Info 61216e8be2ac532358d4e413fdfa2643b1876edda78Douglas Gregor = TemplateOrSpecialization 61316e8be2ac532358d4e413fdfa2643b1876edda78Douglas Gregor .dyn_cast<FunctionTemplateSpecializationInfo*>()) { 6141fd2dd145d9bcdf0b8d60a88e1795b6ae83656f5Douglas Gregor return Info->Template.getPointer(); 61516e8be2ac532358d4e413fdfa2643b1876edda78Douglas Gregor } 61616e8be2ac532358d4e413fdfa2643b1876edda78Douglas Gregor return 0; 61716e8be2ac532358d4e413fdfa2643b1876edda78Douglas Gregor} 61816e8be2ac532358d4e413fdfa2643b1876edda78Douglas Gregor 61916e8be2ac532358d4e413fdfa2643b1876edda78Douglas Gregorconst TemplateArgumentList * 62016e8be2ac532358d4e413fdfa2643b1876edda78Douglas GregorFunctionDecl::getTemplateSpecializationArgs() const { 62116e8be2ac532358d4e413fdfa2643b1876edda78Douglas Gregor if (FunctionTemplateSpecializationInfo *Info 62216e8be2ac532358d4e413fdfa2643b1876edda78Douglas Gregor = TemplateOrSpecialization 62316e8be2ac532358d4e413fdfa2643b1876edda78Douglas Gregor .dyn_cast<FunctionTemplateSpecializationInfo*>()) { 62416e8be2ac532358d4e413fdfa2643b1876edda78Douglas Gregor return Info->TemplateArguments; 62516e8be2ac532358d4e413fdfa2643b1876edda78Douglas Gregor } 62616e8be2ac532358d4e413fdfa2643b1876edda78Douglas Gregor return 0; 62716e8be2ac532358d4e413fdfa2643b1876edda78Douglas Gregor} 62816e8be2ac532358d4e413fdfa2643b1876edda78Douglas Gregor 6291637be727f2a0434c1ed7aa385ea1c18328b0ccdDouglas Gregorvoid 6301637be727f2a0434c1ed7aa385ea1c18328b0ccdDouglas GregorFunctionDecl::setFunctionTemplateSpecialization(ASTContext &Context, 6311637be727f2a0434c1ed7aa385ea1c18328b0ccdDouglas Gregor FunctionTemplateDecl *Template, 632127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor const TemplateArgumentList *TemplateArgs, 633127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor void *InsertPos) { 63416e8be2ac532358d4e413fdfa2643b1876edda78Douglas Gregor FunctionTemplateSpecializationInfo *Info 63516e8be2ac532358d4e413fdfa2643b1876edda78Douglas Gregor = TemplateOrSpecialization.dyn_cast<FunctionTemplateSpecializationInfo*>(); 6361637be727f2a0434c1ed7aa385ea1c18328b0ccdDouglas Gregor if (!Info) 63716e8be2ac532358d4e413fdfa2643b1876edda78Douglas Gregor Info = new (Context) FunctionTemplateSpecializationInfo; 6381637be727f2a0434c1ed7aa385ea1c18328b0ccdDouglas Gregor 639127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor Info->Function = this; 6401fd2dd145d9bcdf0b8d60a88e1795b6ae83656f5Douglas Gregor Info->Template.setPointer(Template); 6411fd2dd145d9bcdf0b8d60a88e1795b6ae83656f5Douglas Gregor Info->Template.setInt(0); // Implicit instantiation, unless told otherwise 6421637be727f2a0434c1ed7aa385ea1c18328b0ccdDouglas Gregor Info->TemplateArguments = TemplateArgs; 6431637be727f2a0434c1ed7aa385ea1c18328b0ccdDouglas Gregor TemplateOrSpecialization = Info; 644127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor 645127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor // Insert this function template specialization into the set of known 646127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor // function template specialiations. 647127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor Template->getSpecializations().InsertNode(Info, InsertPos); 6481637be727f2a0434c1ed7aa385ea1c18328b0ccdDouglas Gregor} 6491637be727f2a0434c1ed7aa385ea1c18328b0ccdDouglas Gregor 6501fd2dd145d9bcdf0b8d60a88e1795b6ae83656f5Douglas Gregorbool FunctionDecl::isExplicitSpecialization() const { 6511fd2dd145d9bcdf0b8d60a88e1795b6ae83656f5Douglas Gregor // FIXME: check this property for explicit specializations of member 6521fd2dd145d9bcdf0b8d60a88e1795b6ae83656f5Douglas Gregor // functions of class templates. 6531fd2dd145d9bcdf0b8d60a88e1795b6ae83656f5Douglas Gregor FunctionTemplateSpecializationInfo *Info 6541fd2dd145d9bcdf0b8d60a88e1795b6ae83656f5Douglas Gregor = TemplateOrSpecialization.dyn_cast<FunctionTemplateSpecializationInfo*>(); 6551fd2dd145d9bcdf0b8d60a88e1795b6ae83656f5Douglas Gregor if (!Info) 6561fd2dd145d9bcdf0b8d60a88e1795b6ae83656f5Douglas Gregor return false; 6571fd2dd145d9bcdf0b8d60a88e1795b6ae83656f5Douglas Gregor 6581fd2dd145d9bcdf0b8d60a88e1795b6ae83656f5Douglas Gregor return Info->isExplicitSpecialization(); 6591fd2dd145d9bcdf0b8d60a88e1795b6ae83656f5Douglas Gregor} 6601fd2dd145d9bcdf0b8d60a88e1795b6ae83656f5Douglas Gregor 6611fd2dd145d9bcdf0b8d60a88e1795b6ae83656f5Douglas Gregorvoid FunctionDecl::setExplicitSpecialization(bool ES) { 6621fd2dd145d9bcdf0b8d60a88e1795b6ae83656f5Douglas Gregor // FIXME: set this property for explicit specializations of member functions 6631fd2dd145d9bcdf0b8d60a88e1795b6ae83656f5Douglas Gregor // of class templates. 6641fd2dd145d9bcdf0b8d60a88e1795b6ae83656f5Douglas Gregor FunctionTemplateSpecializationInfo *Info 6651fd2dd145d9bcdf0b8d60a88e1795b6ae83656f5Douglas Gregor = TemplateOrSpecialization.dyn_cast<FunctionTemplateSpecializationInfo*>(); 6661fd2dd145d9bcdf0b8d60a88e1795b6ae83656f5Douglas Gregor if (Info) 6671fd2dd145d9bcdf0b8d60a88e1795b6ae83656f5Douglas Gregor Info->setExplicitSpecialization(ES); 6681fd2dd145d9bcdf0b8d60a88e1795b6ae83656f5Douglas Gregor} 6691fd2dd145d9bcdf0b8d60a88e1795b6ae83656f5Douglas Gregor 6708a934233d1582b5bde9d270bc0705aa81e471a79Chris Lattner//===----------------------------------------------------------------------===// 671bcbffc46f1ad3796c4582fa1e3a9113b5aa26061Douglas Gregor// TagDecl Implementation 6724b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek//===----------------------------------------------------------------------===// 6734b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek 674f602c8b6ce1a269c0bf8b3f049e923f4ea5c18e2Argyrios KyrtzidisSourceRange TagDecl::getSourceRange() const { 675f602c8b6ce1a269c0bf8b3f049e923f4ea5c18e2Argyrios Kyrtzidis SourceLocation E = RBraceLoc.isValid() ? RBraceLoc : getLocation(); 676741dd9a7e1d63e4e385b657e4ce11c5d96d44f72Douglas Gregor return SourceRange(TagKeywordLoc, E); 677f602c8b6ce1a269c0bf8b3f049e923f4ea5c18e2Argyrios Kyrtzidis} 678f602c8b6ce1a269c0bf8b3f049e923f4ea5c18e2Argyrios Kyrtzidis 679b57a4fe73b8227c0dba651818b8495dfca61e530Argyrios KyrtzidisTagDecl* TagDecl::getCanonicalDecl() { 6808e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor return getFirstDeclaration(); 681b57a4fe73b8227c0dba651818b8495dfca61e530Argyrios Kyrtzidis} 682b57a4fe73b8227c0dba651818b8495dfca61e530Argyrios Kyrtzidis 6830b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregorvoid TagDecl::startDefinition() { 6848e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor if (TagType *TagT = const_cast<TagType *>(TypeForDecl->getAs<TagType>())) { 6858e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor TagT->decl.setPointer(this); 6868e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor TagT->decl.setInt(1); 6878e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor } 6880b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregor} 6890b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregor 6900b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregorvoid TagDecl::completeDefinition() { 6910b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregor IsDefinition = true; 6928e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor if (TagType *TagT = const_cast<TagType *>(TypeForDecl->getAs<TagType>())) { 6938e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor assert(TagT->decl.getPointer() == this && 6948e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor "Attempt to redefine a tag definition?"); 6958e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor TagT->decl.setInt(0); 6968e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor } 6970b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregor} 6980b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregor 6994b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed KremenekTagDecl* TagDecl::getDefinition(ASTContext& C) const { 7008e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor if (isDefinition()) 7018e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor return const_cast<TagDecl *>(this); 7028e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor 7038e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor for (redecl_iterator R = redecls_begin(), REnd = redecls_end(); 7048e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor R != REnd; ++R) 7058e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor if (R->isDefinition()) 7068e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor return *R; 7078e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor 7088e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor return 0; 7094b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek} 7104b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek 7114b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek//===----------------------------------------------------------------------===// 7128a934233d1582b5bde9d270bc0705aa81e471a79Chris Lattner// RecordDecl Implementation 7138a934233d1582b5bde9d270bc0705aa81e471a79Chris Lattner//===----------------------------------------------------------------------===// 7145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 71535bc0821c4f80041724cd4c5c4889b2581546a41Argyrios KyrtzidisRecordDecl::RecordDecl(Kind DK, TagKind TK, DeclContext *DC, SourceLocation L, 7168e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor IdentifierInfo *Id, RecordDecl *PrevDecl, 7178e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor SourceLocation TKL) 7188e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor : TagDecl(DK, TK, DC, L, Id, PrevDecl, TKL) { 7196359792ca92e7ca2f416cb804c6604358174e994Ted Kremenek HasFlexibleArrayMember = false; 720bcbffc46f1ad3796c4582fa1e3a9113b5aa26061Douglas Gregor AnonymousStructOrUnion = false; 721082b02e8403d3ee9d2ded969fbe0e5d472f04cd8Fariborz Jahanian HasObjectMember = false; 7226359792ca92e7ca2f416cb804c6604358174e994Ted Kremenek assert(classof(static_cast<Decl*>(this)) && "Invalid Kind!"); 7236359792ca92e7ca2f416cb804c6604358174e994Ted Kremenek} 7246359792ca92e7ca2f416cb804c6604358174e994Ted Kremenek 7256359792ca92e7ca2f416cb804c6604358174e994Ted KremenekRecordDecl *RecordDecl::Create(ASTContext &C, TagKind TK, DeclContext *DC, 7264b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek SourceLocation L, IdentifierInfo *Id, 727741dd9a7e1d63e4e385b657e4ce11c5d96d44f72Douglas Gregor SourceLocation TKL, RecordDecl* PrevDecl) { 728df042e6c2bf06b2d9ed53c52469599ac1bd93a3fTed Kremenek 7298e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor RecordDecl* R = new (C) RecordDecl(Record, TK, DC, L, Id, PrevDecl, TKL); 7304b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek C.getTypeDeclType(R, PrevDecl); 7314b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek return R; 7326359792ca92e7ca2f416cb804c6604358174e994Ted Kremenek} 7336359792ca92e7ca2f416cb804c6604358174e994Ted Kremenek 734997b6c6d73541f010afc81e28191c8eae7b24f77Argyrios KyrtzidisRecordDecl::~RecordDecl() { 735997b6c6d73541f010afc81e28191c8eae7b24f77Argyrios Kyrtzidis} 736997b6c6d73541f010afc81e28191c8eae7b24f77Argyrios Kyrtzidis 737997b6c6d73541f010afc81e28191c8eae7b24f77Argyrios Kyrtzidisvoid RecordDecl::Destroy(ASTContext& C) { 738997b6c6d73541f010afc81e28191c8eae7b24f77Argyrios Kyrtzidis TagDecl::Destroy(C); 739997b6c6d73541f010afc81e28191c8eae7b24f77Argyrios Kyrtzidis} 740997b6c6d73541f010afc81e28191c8eae7b24f77Argyrios Kyrtzidis 741c9b5b4074bd73d4af76e69cccf8ecd365fdd1008Douglas Gregorbool RecordDecl::isInjectedClassName() const { 742c9b5b4074bd73d4af76e69cccf8ecd365fdd1008Douglas Gregor return isImplicit() && getDeclName() && getDeclContext()->isRecord() && 743c9b5b4074bd73d4af76e69cccf8ecd365fdd1008Douglas Gregor cast<RecordDecl>(getDeclContext())->getDeclName() == getDeclName(); 744c9b5b4074bd73d4af76e69cccf8ecd365fdd1008Douglas Gregor} 745c9b5b4074bd73d4af76e69cccf8ecd365fdd1008Douglas Gregor 74644b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor/// completeDefinition - Notes that the definition of this type is now 74744b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor/// complete. 74844b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregorvoid RecordDecl::completeDefinition(ASTContext& C) { 7495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer assert(!isDefinition() && "Cannot redefine record!"); 7500b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregor TagDecl::completeDefinition(); 7515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 7525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 75356ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff//===----------------------------------------------------------------------===// 75456ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff// BlockDecl Implementation 75556ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff//===----------------------------------------------------------------------===// 75656ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff 75756ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve NaroffBlockDecl::~BlockDecl() { 75856ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff} 75956ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff 76056ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroffvoid BlockDecl::Destroy(ASTContext& C) { 76156ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff if (Body) 76256ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff Body->Destroy(C); 76356ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff 76456ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff for (param_iterator I=param_begin(), E=param_end(); I!=E; ++I) 76556ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff (*I)->Destroy(C); 766879d27ad4670716c7cea7f86274f6096f6868fe1Ted Kremenek 767879d27ad4670716c7cea7f86274f6096f6868fe1Ted Kremenek C.Deallocate(ParamInfo); 76856ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff Decl::Destroy(C); 76956ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff} 770e78b809bbcd92928a63da81f2cd843faad3e4dfdSteve Naroff 771e78b809bbcd92928a63da81f2cd843faad3e4dfdSteve Naroffvoid BlockDecl::setParams(ASTContext& C, ParmVarDecl **NewParamInfo, 772e78b809bbcd92928a63da81f2cd843faad3e4dfdSteve Naroff unsigned NParms) { 773e78b809bbcd92928a63da81f2cd843faad3e4dfdSteve Naroff assert(ParamInfo == 0 && "Already has param info!"); 774e78b809bbcd92928a63da81f2cd843faad3e4dfdSteve Naroff 775e78b809bbcd92928a63da81f2cd843faad3e4dfdSteve Naroff // Zero params -> null pointer. 776e78b809bbcd92928a63da81f2cd843faad3e4dfdSteve Naroff if (NParms) { 777e78b809bbcd92928a63da81f2cd843faad3e4dfdSteve Naroff NumParams = NParms; 778e78b809bbcd92928a63da81f2cd843faad3e4dfdSteve Naroff void *Mem = C.Allocate(sizeof(ParmVarDecl*)*NumParams); 779e78b809bbcd92928a63da81f2cd843faad3e4dfdSteve Naroff ParamInfo = new (Mem) ParmVarDecl*[NumParams]; 780e78b809bbcd92928a63da81f2cd843faad3e4dfdSteve Naroff memcpy(ParamInfo, NewParamInfo, sizeof(ParmVarDecl*)*NumParams); 781e78b809bbcd92928a63da81f2cd843faad3e4dfdSteve Naroff } 782e78b809bbcd92928a63da81f2cd843faad3e4dfdSteve Naroff} 783e78b809bbcd92928a63da81f2cd843faad3e4dfdSteve Naroff 784e78b809bbcd92928a63da81f2cd843faad3e4dfdSteve Naroffunsigned BlockDecl::getNumParams() const { 785e78b809bbcd92928a63da81f2cd843faad3e4dfdSteve Naroff return NumParams; 786e78b809bbcd92928a63da81f2cd843faad3e4dfdSteve Naroff} 787