Decl.cpp revision 1fc09a92d0bffda20e06fa882388c01e192e2069
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" 25f1bbbb49f06a7462476cd88166fccda5feb15cabJohn McCall#include "clang/Parse/DeclSpec.h" 26f1bbbb49f06a7462476cd88166fccda5feb15cabJohn McCall#include "llvm/Support/ErrorHandling.h" 2747b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor#include <vector> 2827f8a28bee33bb0e857cfe1a61c281bbc234b338Ted Kremenek 295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerusing namespace clang; 305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 310b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattnervoid Attr::Destroy(ASTContext &C) { 320b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner if (Next) { 330b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner Next->Destroy(C); 340b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner Next = 0; 350b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner } 360b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner this->~Attr(); 370b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner C.Deallocate((void*)this); 380b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner} 390b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner 40b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis/// \brief Return the TypeLoc wrapper for the type source info. 41b17166c8077cd900cca83a895c43b30ea6660598Argyrios KyrtzidisTypeLoc DeclaratorInfo::getTypeLoc() const { 42b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis return TypeLoc::Create(Ty, (void*)(this + 1)); 43b17166c8077cd900cca83a895c43b30ea6660598Argyrios Kyrtzidis} 440b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner 45d3b9065ec7052ec4741783d2fb4130d13c766933Chris Lattner//===----------------------------------------------------------------------===// 466c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner// Decl Allocation/Deallocation Method Implementations 476c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner//===----------------------------------------------------------------------===// 481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 490b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner 50ef177820100ab583b08fd3056e2a5a52ee4b1629Argyrios KyrtzidisTranslationUnitDecl *TranslationUnitDecl::Create(ASTContext &C) { 513708b3df2e86998dca4c006939014ea1174da834Argyrios Kyrtzidis return new (C) TranslationUnitDecl(C); 52ef177820100ab583b08fd3056e2a5a52ee4b1629Argyrios Kyrtzidis} 53ef177820100ab583b08fd3056e2a5a52ee4b1629Argyrios Kyrtzidis 542d1c5d313cd0c229cc614e74baa4c5756a4b46f4Argyrios KyrtzidisNamespaceDecl *NamespaceDecl::Create(ASTContext &C, DeclContext *DC, 552d1c5d313cd0c229cc614e74baa4c5756a4b46f4Argyrios Kyrtzidis SourceLocation L, IdentifierInfo *Id) { 563e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff return new (C) NamespaceDecl(DC, L, Id); 572d1c5d313cd0c229cc614e74baa4c5756a4b46f4Argyrios Kyrtzidis} 582d1c5d313cd0c229cc614e74baa4c5756a4b46f4Argyrios Kyrtzidis 59d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenekvoid NamespaceDecl::Destroy(ASTContext& C) { 60d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenek // NamespaceDecl uses "NextDeclarator" to chain namespace declarations 61d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenek // together. They are all top-level Decls. 621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 63ebf27b1831e6c4d7f4bc30e111a4d6340ff690d1Ted Kremenek this->~NamespaceDecl(); 643e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff C.Deallocate((void *)this); 65d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenek} 66d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenek 67d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenek 684111024be81e7c0525e42dadcc126d27e5bf2425Chris LattnerImplicitParamDecl *ImplicitParamDecl::Create(ASTContext &C, DeclContext *DC, 694afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor SourceLocation L, IdentifierInfo *Id, QualType T) { 703e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff return new (C) ImplicitParamDecl(ImplicitParam, DC, L, Id, T); 714111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner} 724111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner 73b286a78c8cce4592306dae6abc3656daf6379c77Daniel Dunbarconst char *VarDecl::getStorageClassSpecifierString(StorageClass SC) { 74b286a78c8cce4592306dae6abc3656daf6379c77Daniel Dunbar switch (SC) { 75b286a78c8cce4592306dae6abc3656daf6379c77Daniel Dunbar case VarDecl::None: break; 76b286a78c8cce4592306dae6abc3656daf6379c77Daniel Dunbar case VarDecl::Auto: return "auto"; break; 77b286a78c8cce4592306dae6abc3656daf6379c77Daniel Dunbar case VarDecl::Extern: return "extern"; break; 781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump case VarDecl::PrivateExtern: return "__private_extern__"; break; 79b286a78c8cce4592306dae6abc3656daf6379c77Daniel Dunbar case VarDecl::Register: return "register"; break; 801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump case VarDecl::Static: return "static"; break; 81b286a78c8cce4592306dae6abc3656daf6379c77Daniel Dunbar } 82b286a78c8cce4592306dae6abc3656daf6379c77Daniel Dunbar 83b286a78c8cce4592306dae6abc3656daf6379c77Daniel Dunbar assert(0 && "Invalid storage class"); 84b286a78c8cce4592306dae6abc3656daf6379c77Daniel Dunbar return 0; 85b286a78c8cce4592306dae6abc3656daf6379c77Daniel Dunbar} 86b286a78c8cce4592306dae6abc3656daf6379c77Daniel Dunbar 879fdf9c6d3530bb85f3166e6460d841e2ff8e1a2cChris LattnerParmVarDecl *ParmVarDecl::Create(ASTContext &C, DeclContext *DC, 880ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner SourceLocation L, IdentifierInfo *Id, 89a1d5662d96465f0fddf8819d245da4d19b892effArgyrios Kyrtzidis QualType T, DeclaratorInfo *DInfo, 90a1d5662d96465f0fddf8819d245da4d19b892effArgyrios Kyrtzidis StorageClass S, Expr *DefArg) { 91a1d5662d96465f0fddf8819d245da4d19b892effArgyrios Kyrtzidis return new (C) ParmVarDecl(ParmVar, DC, L, Id, T, DInfo, S, DefArg); 924306d3cb9116605728252e2738df24b9f6ab53c3Fariborz Jahanian} 934306d3cb9116605728252e2738df24b9f6ab53c3Fariborz Jahanian 944306d3cb9116605728252e2738df24b9f6ab53c3Fariborz JahanianQualType ParmVarDecl::getOriginalType() const { 951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (const OriginalParmVarDecl *PVD = 9664650af7cc4352c6c67b9bd1bf8ef3ce7471b910Douglas Gregor dyn_cast<OriginalParmVarDecl>(this)) 974306d3cb9116605728252e2738df24b9f6ab53c3Fariborz Jahanian return PVD->OriginalType; 984306d3cb9116605728252e2738df24b9f6ab53c3Fariborz Jahanian return getType(); 999e151e154780e9cd443336143af1e996d1f387e5Chris Lattner} 1009e151e154780e9cd443336143af1e996d1f387e5Chris Lattner 1016cc1518b9f15ca846b8c35518eeae9557935678dDouglas GregorSourceRange ParmVarDecl::getDefaultArgRange() const { 1026cc1518b9f15ca846b8c35518eeae9557935678dDouglas Gregor if (const Expr *E = getInit()) 1036cc1518b9f15ca846b8c35518eeae9557935678dDouglas Gregor return E->getSourceRange(); 1046cc1518b9f15ca846b8c35518eeae9557935678dDouglas Gregor 1056cc1518b9f15ca846b8c35518eeae9557935678dDouglas Gregor if (const Expr *E = getUninstantiatedDefaultArg()) 1066cc1518b9f15ca846b8c35518eeae9557935678dDouglas Gregor return E->getSourceRange(); 1076cc1518b9f15ca846b8c35518eeae9557935678dDouglas Gregor 1086cc1518b9f15ca846b8c35518eeae9557935678dDouglas Gregor return SourceRange(); 1096cc1518b9f15ca846b8c35518eeae9557935678dDouglas Gregor} 11078d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor 1116cc1518b9f15ca846b8c35518eeae9557935678dDouglas Gregorvoid VarDecl::setInit(ASTContext &C, Expr *I) { 1126cc1518b9f15ca846b8c35518eeae9557935678dDouglas Gregor if (EvaluatedStmt *Eval = Init.dyn_cast<EvaluatedStmt *>()) { 1136cc1518b9f15ca846b8c35518eeae9557935678dDouglas Gregor Eval->~EvaluatedStmt(); 1146cc1518b9f15ca846b8c35518eeae9557935678dDouglas Gregor C.Deallocate(Eval); 11578d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor } 11678d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor 1176cc1518b9f15ca846b8c35518eeae9557935678dDouglas Gregor Init = I; 1186cc1518b9f15ca846b8c35518eeae9557935678dDouglas Gregor} 1196cc1518b9f15ca846b8c35518eeae9557935678dDouglas Gregor 12048a83b5e7ae4051c7c11680ac00c1fa02d610a62Douglas Gregorbool VarDecl::isExternC() const { 12148a83b5e7ae4051c7c11680ac00c1fa02d610a62Douglas Gregor ASTContext &Context = getASTContext(); 1226393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor if (!Context.getLangOptions().CPlusPlus) 1231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return (getDeclContext()->isTranslationUnit() && 1246393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor getStorageClass() != Static) || 1256393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor (getDeclContext()->isFunctionOrMethod() && hasExternalStorage()); 1266393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor 1271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump for (const DeclContext *DC = getDeclContext(); !DC->isTranslationUnit(); 1286393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor DC = DC->getParent()) { 1296393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor if (const LinkageSpecDecl *Linkage = dyn_cast<LinkageSpecDecl>(DC)) { 1306393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor if (Linkage->getLanguage() == LinkageSpecDecl::lang_c) 1316393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor return getStorageClass() != Static; 1326393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor 1336393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor break; 1346393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor } 1356393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor 1366393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor if (DC->isFunctionOrMethod()) 1376393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor return false; 1386393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor } 1396393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor 1406393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor return false; 1416393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor} 1426393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor 14364650af7cc4352c6c67b9bd1bf8ef3ce7471b910Douglas GregorOriginalParmVarDecl *OriginalParmVarDecl::Create( 14473da9e462576faedc2cdf96b37a1c072b404b73dFariborz Jahanian ASTContext &C, DeclContext *DC, 14573da9e462576faedc2cdf96b37a1c072b404b73dFariborz Jahanian SourceLocation L, IdentifierInfo *Id, 146a1d5662d96465f0fddf8819d245da4d19b892effArgyrios Kyrtzidis QualType T, DeclaratorInfo *DInfo, 147a1d5662d96465f0fddf8819d245da4d19b892effArgyrios Kyrtzidis QualType OT, StorageClass S, Expr *DefArg) { 148a1d5662d96465f0fddf8819d245da4d19b892effArgyrios Kyrtzidis return new (C) OriginalParmVarDecl(DC, L, Id, T, DInfo, OT, S, DefArg); 14973da9e462576faedc2cdf96b37a1c072b404b73dFariborz Jahanian} 15073da9e462576faedc2cdf96b37a1c072b404b73dFariborz Jahanian 1519fdf9c6d3530bb85f3166e6460d841e2ff8e1a2cChris LattnerFunctionDecl *FunctionDecl::Create(ASTContext &C, DeclContext *DC, 1521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation L, 153a1d5662d96465f0fddf8819d245da4d19b892effArgyrios Kyrtzidis DeclarationName N, QualType T, 154a1d5662d96465f0fddf8819d245da4d19b892effArgyrios Kyrtzidis DeclaratorInfo *DInfo, 1551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump StorageClass S, bool isInline, 156a5d82000f7b173a0a5ce34dc8c09a03f98d9e439Argyrios Kyrtzidis bool hasWrittenPrototype) { 1571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump FunctionDecl *New 158a5d82000f7b173a0a5ce34dc8c09a03f98d9e439Argyrios Kyrtzidis = new (C) FunctionDecl(Function, DC, L, N, T, DInfo, S, isInline); 159a75e8534f2b7c2480c48f31f301bd00b241c5499Anders Carlsson New->HasWrittenPrototype = hasWrittenPrototype; 1602224f84658fb9b3725a31f2680edb64ae73bf705Douglas Gregor return New; 161a98e58ddb4696a0020fe97439d5295413f9e90b1Chris Lattner} 162a98e58ddb4696a0020fe97439d5295413f9e90b1Chris Lattner 163090276f5e164d491a1bb3f541bafdb394f5e6f04Steve NaroffBlockDecl *BlockDecl::Create(ASTContext &C, DeclContext *DC, SourceLocation L) { 1643e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff return new (C) BlockDecl(DC, L); 16556ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff} 16656ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff 16744b4321feab46299d3f5cfd404680884752a0fcfDouglas GregorFieldDecl *FieldDecl::Create(ASTContext &C, DeclContext *DC, SourceLocation L, 168a1d5662d96465f0fddf8819d245da4d19b892effArgyrios Kyrtzidis IdentifierInfo *Id, QualType T, 169a5d82000f7b173a0a5ce34dc8c09a03f98d9e439Argyrios Kyrtzidis DeclaratorInfo *DInfo, Expr *BW, bool Mutable) { 170a5d82000f7b173a0a5ce34dc8c09a03f98d9e439Argyrios Kyrtzidis return new (C) FieldDecl(Decl::Field, DC, L, Id, T, DInfo, BW, Mutable); 1718e25d8681822d8094bfeb97b2239363552548171Chris Lattner} 1728e25d8681822d8094bfeb97b2239363552548171Chris Lattner 1736b3945f4bc757bdadd3e443180cf32c2cccb52a0Douglas Gregorbool FieldDecl::isAnonymousStructOrUnion() const { 1746b3945f4bc757bdadd3e443180cf32c2cccb52a0Douglas Gregor if (!isImplicit() || getDeclName()) 1756b3945f4bc757bdadd3e443180cf32c2cccb52a0Douglas Gregor return false; 1761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1776217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek if (const RecordType *Record = getType()->getAs<RecordType>()) 1786b3945f4bc757bdadd3e443180cf32c2cccb52a0Douglas Gregor return Record->getDecl()->isAnonymousStructOrUnion(); 1796b3945f4bc757bdadd3e443180cf32c2cccb52a0Douglas Gregor 1806b3945f4bc757bdadd3e443180cf32c2cccb52a0Douglas Gregor return false; 1816b3945f4bc757bdadd3e443180cf32c2cccb52a0Douglas Gregor} 182a98e58ddb4696a0020fe97439d5295413f9e90b1Chris Lattner 1830ed844b04ea4387caa4e1cf3dc375d269657536bChris LattnerEnumConstantDecl *EnumConstantDecl::Create(ASTContext &C, EnumDecl *CD, 1840ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner SourceLocation L, 185c63e660882ff93841fa234d70ef6757038302b92Chris Lattner IdentifierInfo *Id, QualType T, 1864afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor Expr *E, const llvm::APSInt &V) { 1873e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff return new (C) EnumConstantDecl(CD, L, Id, T, E, V); 1886c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner} 1896c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner 190d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenekvoid EnumConstantDecl::Destroy(ASTContext& C) { 191d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenek if (Init) Init->Destroy(C); 192d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenek Decl::Destroy(C); 193d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenek} 194d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenek 1959fdf9c6d3530bb85f3166e6460d841e2ff8e1a2cChris LattnerTypedefDecl *TypedefDecl::Create(ASTContext &C, DeclContext *DC, 1960ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner SourceLocation L, 1974afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor IdentifierInfo *Id, QualType T) { 1983e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff return new (C) TypedefDecl(DC, L, Id, T); 1996c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner} 2006c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner 2019fdf9c6d3530bb85f3166e6460d841e2ff8e1a2cChris LattnerEnumDecl *EnumDecl::Create(ASTContext &C, DeclContext *DC, SourceLocation L, 202741dd9a7e1d63e4e385b657e4ce11c5d96d44f72Douglas Gregor IdentifierInfo *Id, SourceLocation TKL, 2037df7b6bb800e1987951285ea192e4f347e1b603aDouglas Gregor EnumDecl *PrevDecl) { 2048e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor EnumDecl *Enum = new (C) EnumDecl(DC, L, Id, PrevDecl, TKL); 2057df7b6bb800e1987951285ea192e4f347e1b603aDouglas Gregor C.getTypeDeclType(Enum, PrevDecl); 2067df7b6bb800e1987951285ea192e4f347e1b603aDouglas Gregor return Enum; 2076c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner} 2086c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner 209df91eca19bd9738abd9a3b84791f39750e27ad36Ted Kremenekvoid EnumDecl::Destroy(ASTContext& C) { 210df91eca19bd9738abd9a3b84791f39750e27ad36Ted Kremenek Decl::Destroy(C); 211df91eca19bd9738abd9a3b84791f39750e27ad36Ted Kremenek} 212df91eca19bd9738abd9a3b84791f39750e27ad36Ted Kremenek 21344b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregorvoid EnumDecl::completeDefinition(ASTContext &C, QualType NewType) { 21444b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor assert(!isDefinition() && "Cannot redefine enums!"); 21544b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor IntegerType = NewType; 2160b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregor TagDecl::completeDefinition(); 21744b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor} 21844b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 2194afa39deaa245592977136d367251ee2c173dd8dDouglas GregorFileScopeAsmDecl *FileScopeAsmDecl::Create(ASTContext &C, DeclContext *DC, 2200ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner SourceLocation L, 2218e25d8681822d8094bfeb97b2239363552548171Chris Lattner StringLiteral *Str) { 2223e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff return new (C) FileScopeAsmDecl(DC, L, Str); 2238e25d8681822d8094bfeb97b2239363552548171Chris Lattner} 2248e25d8681822d8094bfeb97b2239363552548171Chris Lattner 2256c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner//===----------------------------------------------------------------------===// 2264afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor// NamedDecl Implementation 2275239304ff761b8b03eefb772bd5d830a9b9f1aeaArgyrios Kyrtzidis//===----------------------------------------------------------------------===// 2285239304ff761b8b03eefb772bd5d830a9b9f1aeaArgyrios Kyrtzidis 22947b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregorstd::string NamedDecl::getQualifiedNameAsString() const { 2303a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson return getQualifiedNameAsString(getASTContext().getLangOptions()); 2313a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson} 2323a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson 2333a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlssonstd::string NamedDecl::getQualifiedNameAsString(const PrintingPolicy &P) const { 23447b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor std::vector<std::string> Names; 23547b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor std::string QualName; 23647b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor const DeclContext *Ctx = getDeclContext(); 23747b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor 23847b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor if (Ctx->isFunctionOrMethod()) 23947b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor return getNameAsString(); 24047b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor 24147b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor while (Ctx) { 24247b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor if (Ctx->isFunctionOrMethod()) 24347b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor // FIXME: That probably will happen, when D was member of local 24447b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor // scope class/struct/union. How do we handle this case? 24547b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor break; 24647b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor 2471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (const ClassTemplateSpecializationDecl *Spec 248f3e7ce4bd9837cdab6a096235922865f95467d3dDouglas Gregor = dyn_cast<ClassTemplateSpecializationDecl>(Ctx)) { 249f3e7ce4bd9837cdab6a096235922865f95467d3dDouglas Gregor const TemplateArgumentList &TemplateArgs = Spec->getTemplateArgs(); 250f3e7ce4bd9837cdab6a096235922865f95467d3dDouglas Gregor std::string TemplateArgsStr 251f3e7ce4bd9837cdab6a096235922865f95467d3dDouglas Gregor = TemplateSpecializationType::PrintTemplateArgumentList( 252f3e7ce4bd9837cdab6a096235922865f95467d3dDouglas Gregor TemplateArgs.getFlatArgumentList(), 253d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor TemplateArgs.flat_size(), 2543a082d81006e7a2e01a6e431a22e21c78490ff8fAnders Carlsson P); 255f3e7ce4bd9837cdab6a096235922865f95467d3dDouglas Gregor Names.push_back(Spec->getIdentifier()->getName() + TemplateArgsStr); 256f3e7ce4bd9837cdab6a096235922865f95467d3dDouglas Gregor } else if (const NamedDecl *ND = dyn_cast<NamedDecl>(Ctx)) 25747b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor Names.push_back(ND->getNameAsString()); 25847b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor else 25947b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor break; 26047b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor 26147b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor Ctx = Ctx->getParent(); 26247b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor } 26347b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor 26447b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor std::vector<std::string>::reverse_iterator 26547b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor I = Names.rbegin(), 26647b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor End = Names.rend(); 26747b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor 26847b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor for (; I!=End; ++I) 26947b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor QualName += *I + "::"; 27047b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor 27147b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor QualName += getNameAsString(); 27247b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor 27347b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor return QualName; 27447b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor} 27547b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor 2764afa39deaa245592977136d367251ee2c173dd8dDouglas Gregorbool NamedDecl::declarationReplaces(NamedDecl *OldD) const { 2776ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor assert(getDeclName() == OldD->getDeclName() && "Declaration name mismatch"); 2786ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor 2792a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor // UsingDirectiveDecl's are not really NamedDecl's, and all have same name. 2802a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor // We want to keep it, unless it nominates same namespace. 2812a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor if (getKind() == Decl::UsingDirective) { 2822a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor return cast<UsingDirectiveDecl>(this)->getNominatedNamespace() == 2832a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor cast<UsingDirectiveDecl>(OldD)->getNominatedNamespace(); 2842a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor } 2851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2866ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(this)) 2876ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor // For function declarations, we keep track of redeclarations. 2886ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor return FD->getPreviousDeclaration() == OldD; 2896ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor 290e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor // For function templates, the underlying function declarations are linked. 291e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor if (const FunctionTemplateDecl *FunctionTemplate 292e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor = dyn_cast<FunctionTemplateDecl>(this)) 293e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor if (const FunctionTemplateDecl *OldFunctionTemplate 294e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor = dyn_cast<FunctionTemplateDecl>(OldD)) 295e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor return FunctionTemplate->getTemplatedDecl() 296e53060fa78ad7e98352049f72787bdb7543e2a48Douglas Gregor ->declarationReplaces(OldFunctionTemplate->getTemplatedDecl()); 2971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2980de21fd85d79bccd32f04256f5b3328ab5ed7c95Steve Naroff // For method declarations, we keep track of redeclarations. 2990de21fd85d79bccd32f04256f5b3328ab5ed7c95Steve Naroff if (isa<ObjCMethodDecl>(this)) 3000de21fd85d79bccd32f04256f5b3328ab5ed7c95Steve Naroff return false; 3011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3026ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor // For non-function declarations, if the declarations are of the 3036ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor // same kind then this must be a redeclaration, or semantic analysis 3046ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor // would not have given us the new declaration. 3056ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor return this->getKind() == OldD->getKind(); 3066ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor} 3076ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor 308d6f7e9dccd0fa8a5a15d7478324c0ae229fc5e1eDouglas Gregorbool NamedDecl::hasLinkage() const { 309d6f7e9dccd0fa8a5a15d7478324c0ae229fc5e1eDouglas Gregor if (const VarDecl *VD = dyn_cast<VarDecl>(this)) 310d6f7e9dccd0fa8a5a15d7478324c0ae229fc5e1eDouglas Gregor return VD->hasExternalStorage() || VD->isFileVarDecl(); 311d6f7e9dccd0fa8a5a15d7478324c0ae229fc5e1eDouglas Gregor 312d6f7e9dccd0fa8a5a15d7478324c0ae229fc5e1eDouglas Gregor if (isa<FunctionDecl>(this) && !isa<CXXMethodDecl>(this)) 313d6f7e9dccd0fa8a5a15d7478324c0ae229fc5e1eDouglas Gregor return true; 314d6f7e9dccd0fa8a5a15d7478324c0ae229fc5e1eDouglas Gregor 315d6f7e9dccd0fa8a5a15d7478324c0ae229fc5e1eDouglas Gregor return false; 316d6f7e9dccd0fa8a5a15d7478324c0ae229fc5e1eDouglas Gregor} 3174afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor 318e136e0e1b74760d7ec3ede38e0e739d5c52a3c0aAnders CarlssonNamedDecl *NamedDecl::getUnderlyingDecl() { 319e136e0e1b74760d7ec3ede38e0e739d5c52a3c0aAnders Carlsson NamedDecl *ND = this; 320e136e0e1b74760d7ec3ede38e0e739d5c52a3c0aAnders Carlsson while (true) { 321e136e0e1b74760d7ec3ede38e0e739d5c52a3c0aAnders Carlsson if (UsingDecl *UD = dyn_cast<UsingDecl>(ND)) 322e136e0e1b74760d7ec3ede38e0e739d5c52a3c0aAnders Carlsson ND = UD->getTargetDecl(); 323e136e0e1b74760d7ec3ede38e0e739d5c52a3c0aAnders Carlsson else if (ObjCCompatibleAliasDecl *AD 324e136e0e1b74760d7ec3ede38e0e739d5c52a3c0aAnders Carlsson = dyn_cast<ObjCCompatibleAliasDecl>(ND)) 325e136e0e1b74760d7ec3ede38e0e739d5c52a3c0aAnders Carlsson return AD->getClassInterface(); 326e136e0e1b74760d7ec3ede38e0e739d5c52a3c0aAnders Carlsson else 327e136e0e1b74760d7ec3ede38e0e739d5c52a3c0aAnders Carlsson return ND; 328e136e0e1b74760d7ec3ede38e0e739d5c52a3c0aAnders Carlsson } 329e136e0e1b74760d7ec3ede38e0e739d5c52a3c0aAnders Carlsson} 330e136e0e1b74760d7ec3ede38e0e739d5c52a3c0aAnders Carlsson 3315239304ff761b8b03eefb772bd5d830a9b9f1aeaArgyrios Kyrtzidis//===----------------------------------------------------------------------===// 332a5d82000f7b173a0a5ce34dc8c09a03f98d9e439Argyrios Kyrtzidis// DeclaratorDecl Implementation 333a5d82000f7b173a0a5ce34dc8c09a03f98d9e439Argyrios Kyrtzidis//===----------------------------------------------------------------------===// 334a5d82000f7b173a0a5ce34dc8c09a03f98d9e439Argyrios Kyrtzidis 335a5d82000f7b173a0a5ce34dc8c09a03f98d9e439Argyrios KyrtzidisSourceLocation DeclaratorDecl::getTypeSpecStartLoc() const { 336a5d82000f7b173a0a5ce34dc8c09a03f98d9e439Argyrios Kyrtzidis if (DeclInfo) 337a5d82000f7b173a0a5ce34dc8c09a03f98d9e439Argyrios Kyrtzidis return DeclInfo->getTypeLoc().getTypeSpecRange().getBegin(); 338a5d82000f7b173a0a5ce34dc8c09a03f98d9e439Argyrios Kyrtzidis return SourceLocation(); 339a5d82000f7b173a0a5ce34dc8c09a03f98d9e439Argyrios Kyrtzidis} 340a5d82000f7b173a0a5ce34dc8c09a03f98d9e439Argyrios Kyrtzidis 341a5d82000f7b173a0a5ce34dc8c09a03f98d9e439Argyrios Kyrtzidis//===----------------------------------------------------------------------===// 34299f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes// VarDecl Implementation 34399f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes//===----------------------------------------------------------------------===// 34499f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes 3454afa39deaa245592977136d367251ee2c173dd8dDouglas GregorVarDecl *VarDecl::Create(ASTContext &C, DeclContext *DC, SourceLocation L, 346a1d5662d96465f0fddf8819d245da4d19b892effArgyrios Kyrtzidis IdentifierInfo *Id, QualType T, DeclaratorInfo *DInfo, 347a5d82000f7b173a0a5ce34dc8c09a03f98d9e439Argyrios Kyrtzidis StorageClass S) { 348a5d82000f7b173a0a5ce34dc8c09a03f98d9e439Argyrios Kyrtzidis return new (C) VarDecl(Var, DC, L, Id, T, DInfo, S); 34999f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes} 35099f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes 35199f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopesvoid VarDecl::Destroy(ASTContext& C) { 352df2d3cf2be8b91e1e21234ff5a3aa4f820e7001aSebastian Redl Expr *Init = getInit(); 35378d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor if (Init) { 354df2d3cf2be8b91e1e21234ff5a3aa4f820e7001aSebastian Redl Init->Destroy(C); 35578d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor if (EvaluatedStmt *Eval = this->Init.dyn_cast<EvaluatedStmt *>()) { 35678d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor Eval->~EvaluatedStmt(); 35778d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor C.Deallocate(Eval); 35878d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor } 35978d1583d0b36b7d6d8d10234cdc19ab94adf765aDouglas Gregor } 36099f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes this->~VarDecl(); 3613e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff C.Deallocate((void *)this); 36299f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes} 36399f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes 36499f06ba988922ea721035a89e6d3c66ba100ba8aNuno LopesVarDecl::~VarDecl() { 36599f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes} 36699f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes 36755d608cbadf1e9c05064f9287c057d50b7df65b4Argyrios KyrtzidisSourceRange VarDecl::getSourceRange() const { 36855d608cbadf1e9c05064f9287c057d50b7df65b4Argyrios Kyrtzidis if (getInit()) 36955d608cbadf1e9c05064f9287c057d50b7df65b4Argyrios Kyrtzidis return SourceRange(getLocation(), getInit()->getLocEnd()); 37055d608cbadf1e9c05064f9287c057d50b7df65b4Argyrios Kyrtzidis return SourceRange(getLocation(), getLocation()); 37155d608cbadf1e9c05064f9287c057d50b7df65b4Argyrios Kyrtzidis} 37255d608cbadf1e9c05064f9287c057d50b7df65b4Argyrios Kyrtzidis 3737caa6825f42a0f7e97d6fc06233133c42b218e46Douglas GregorVarDecl *VarDecl::getInstantiatedFromStaticDataMember() { 3747caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor return getASTContext().getInstantiatedFromStaticDataMember(this); 3757caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor} 3767caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor 377275a369f003f25bd22c00c1c0fc0251c7208caf4Douglas Gregorbool VarDecl::isTentativeDefinition(ASTContext &Context) const { 378275a369f003f25bd22c00c1c0fc0251c7208caf4Douglas Gregor if (!isFileVarDecl() || Context.getLangOptions().CPlusPlus) 379275a369f003f25bd22c00c1c0fc0251c7208caf4Douglas Gregor return false; 380275a369f003f25bd22c00c1c0fc0251c7208caf4Douglas Gregor 381b6c8c8bd8d362c8a6cdb767415b0d21e62b77eb2Douglas Gregor const VarDecl *Def = 0; 382b6c8c8bd8d362c8a6cdb767415b0d21e62b77eb2Douglas Gregor return (!getDefinition(Def) && 383275a369f003f25bd22c00c1c0fc0251c7208caf4Douglas Gregor (getStorageClass() == None || getStorageClass() == Static)); 384275a369f003f25bd22c00c1c0fc0251c7208caf4Douglas Gregor} 385275a369f003f25bd22c00c1c0fc0251c7208caf4Douglas Gregor 386082d936a5b8323ac2c04558d8bca277a647831a3Ted Kremenekconst Expr *VarDecl::getDefinition(const VarDecl *&Def) const { 387c37929c9e0dba89770dc5f0fbcfa0c9046da0b06Argyrios Kyrtzidis redecl_iterator I = redecls_begin(), E = redecls_end(); 388c37929c9e0dba89770dc5f0fbcfa0c9046da0b06Argyrios Kyrtzidis while (I != E && !I->getInit()) 389c37929c9e0dba89770dc5f0fbcfa0c9046da0b06Argyrios Kyrtzidis ++I; 390275a369f003f25bd22c00c1c0fc0251c7208caf4Douglas Gregor 391c37929c9e0dba89770dc5f0fbcfa0c9046da0b06Argyrios Kyrtzidis if (I != E) { 392c37929c9e0dba89770dc5f0fbcfa0c9046da0b06Argyrios Kyrtzidis Def = *I; 393c37929c9e0dba89770dc5f0fbcfa0c9046da0b06Argyrios Kyrtzidis return I->getInit(); 394c37929c9e0dba89770dc5f0fbcfa0c9046da0b06Argyrios Kyrtzidis } 395c37929c9e0dba89770dc5f0fbcfa0c9046da0b06Argyrios Kyrtzidis return 0; 396275a369f003f25bd22c00c1c0fc0251c7208caf4Douglas Gregor} 397275a369f003f25bd22c00c1c0fc0251c7208caf4Douglas Gregor 398b57a4fe73b8227c0dba651818b8495dfca61e530Argyrios KyrtzidisVarDecl *VarDecl::getCanonicalDecl() { 399f23e839e9ddea324c743d26da43fb767f90ca223Argyrios Kyrtzidis return getFirstDeclaration(); 400fc7e2a8fbb08f0f496ac6cea0721fe72db8ce240Argyrios Kyrtzidis} 401fc7e2a8fbb08f0f496ac6cea0721fe72db8ce240Argyrios Kyrtzidis 40299f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes//===----------------------------------------------------------------------===// 4038a934233d1582b5bde9d270bc0705aa81e471a79Chris Lattner// FunctionDecl Implementation 4048a934233d1582b5bde9d270bc0705aa81e471a79Chris Lattner//===----------------------------------------------------------------------===// 4058a934233d1582b5bde9d270bc0705aa81e471a79Chris Lattner 40627f8a28bee33bb0e857cfe1a61c281bbc234b338Ted Kremenekvoid FunctionDecl::Destroy(ASTContext& C) { 407250fc9c859fdeed3f200ae911a7e7ea338f38436Douglas Gregor if (Body && Body.isOffset()) 408250fc9c859fdeed3f200ae911a7e7ea338f38436Douglas Gregor Body.get(C.getExternalSource())->Destroy(C); 409b65cf41707d190d5ce3d48b9e5bd2dc9d7b4a4c0Ted Kremenek 410b65cf41707d190d5ce3d48b9e5bd2dc9d7b4a4c0Ted Kremenek for (param_iterator I=param_begin(), E=param_end(); I!=E; ++I) 411b65cf41707d190d5ce3d48b9e5bd2dc9d7b4a4c0Ted Kremenek (*I)->Destroy(C); 412460b0ac80382fa73337d21dd052c1f18b27435d8Nuno Lopes 4133e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff C.Deallocate(ParamInfo); 414460b0ac80382fa73337d21dd052c1f18b27435d8Nuno Lopes 41527f8a28bee33bb0e857cfe1a61c281bbc234b338Ted Kremenek Decl::Destroy(C); 41627f8a28bee33bb0e857cfe1a61c281bbc234b338Ted Kremenek} 41727f8a28bee33bb0e857cfe1a61c281bbc234b338Ted Kremenek 418136a6988960ac3aeb96f298da7a1a182db7217cdJohn McCallvoid FunctionDecl::getNameForDiagnostic(std::string &S, 419136a6988960ac3aeb96f298da7a1a182db7217cdJohn McCall const PrintingPolicy &Policy, 420136a6988960ac3aeb96f298da7a1a182db7217cdJohn McCall bool Qualified) const { 421136a6988960ac3aeb96f298da7a1a182db7217cdJohn McCall NamedDecl::getNameForDiagnostic(S, Policy, Qualified); 422136a6988960ac3aeb96f298da7a1a182db7217cdJohn McCall const TemplateArgumentList *TemplateArgs = getTemplateSpecializationArgs(); 423136a6988960ac3aeb96f298da7a1a182db7217cdJohn McCall if (TemplateArgs) 424136a6988960ac3aeb96f298da7a1a182db7217cdJohn McCall S += TemplateSpecializationType::PrintTemplateArgumentList( 425136a6988960ac3aeb96f298da7a1a182db7217cdJohn McCall TemplateArgs->getFlatArgumentList(), 426136a6988960ac3aeb96f298da7a1a182db7217cdJohn McCall TemplateArgs->flat_size(), 427136a6988960ac3aeb96f298da7a1a182db7217cdJohn McCall Policy); 428136a6988960ac3aeb96f298da7a1a182db7217cdJohn McCall 429136a6988960ac3aeb96f298da7a1a182db7217cdJohn McCall} 43027f8a28bee33bb0e857cfe1a61c281bbc234b338Ted Kremenek 4316fb0aee4f9dc261bbec72e1283ad8dc0557a6d96Argyrios KyrtzidisStmt *FunctionDecl::getBody(const FunctionDecl *&Definition) const { 432c37929c9e0dba89770dc5f0fbcfa0c9046da0b06Argyrios Kyrtzidis for (redecl_iterator I = redecls_begin(), E = redecls_end(); I != E; ++I) { 433c37929c9e0dba89770dc5f0fbcfa0c9046da0b06Argyrios Kyrtzidis if (I->Body) { 434c37929c9e0dba89770dc5f0fbcfa0c9046da0b06Argyrios Kyrtzidis Definition = *I; 435c37929c9e0dba89770dc5f0fbcfa0c9046da0b06Argyrios Kyrtzidis return I->Body.get(getASTContext().getExternalSource()); 436f009795057dc8ca254f5618c80a0a90f07cd44b4Douglas Gregor } 437f009795057dc8ca254f5618c80a0a90f07cd44b4Douglas Gregor } 438f009795057dc8ca254f5618c80a0a90f07cd44b4Douglas Gregor 439f009795057dc8ca254f5618c80a0a90f07cd44b4Douglas Gregor return 0; 4405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 4415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 44255d608cbadf1e9c05064f9287c057d50b7df65b4Argyrios Kyrtzidisvoid FunctionDecl::setBody(Stmt *B) { 44355d608cbadf1e9c05064f9287c057d50b7df65b4Argyrios Kyrtzidis Body = B; 4441a5364e0fa0482d8d477d6f136d52e503bbe13f4Argyrios Kyrtzidis if (B) 44555d608cbadf1e9c05064f9287c057d50b7df65b4Argyrios Kyrtzidis EndRangeLoc = B->getLocEnd(); 44655d608cbadf1e9c05064f9287c057d50b7df65b4Argyrios Kyrtzidis} 44755d608cbadf1e9c05064f9287c057d50b7df65b4Argyrios Kyrtzidis 44848a83b5e7ae4051c7c11680ac00c1fa02d610a62Douglas Gregorbool FunctionDecl::isMain() const { 44948a83b5e7ae4051c7c11680ac00c1fa02d610a62Douglas Gregor ASTContext &Context = getASTContext(); 45007a5c22bb6fb0674c95205ae189365bf8e1b695eJohn McCall return !Context.getLangOptions().Freestanding && 45107a5c22bb6fb0674c95205ae189365bf8e1b695eJohn McCall getDeclContext()->getLookupContext()->isTranslationUnit() && 45204495c859f81e440748a9b86baa2913461652bb0Douglas Gregor getIdentifier() && getIdentifier()->isStr("main"); 45304495c859f81e440748a9b86baa2913461652bb0Douglas Gregor} 45404495c859f81e440748a9b86baa2913461652bb0Douglas Gregor 45548a83b5e7ae4051c7c11680ac00c1fa02d610a62Douglas Gregorbool FunctionDecl::isExternC() const { 45648a83b5e7ae4051c7c11680ac00c1fa02d610a62Douglas Gregor ASTContext &Context = getASTContext(); 4576393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor // In C, any non-static, non-overloadable function has external 4586393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor // linkage. 4596393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor if (!Context.getLangOptions().CPlusPlus) 46040b598eea1310ec9ed554d56ce3e25b34c585458Argyrios Kyrtzidis return getStorageClass() != Static && !getAttr<OverloadableAttr>(); 4616393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor 4621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump for (const DeclContext *DC = getDeclContext(); !DC->isTranslationUnit(); 4636393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor DC = DC->getParent()) { 4646393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor if (const LinkageSpecDecl *Linkage = dyn_cast<LinkageSpecDecl>(DC)) { 4656393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor if (Linkage->getLanguage() == LinkageSpecDecl::lang_c) 4661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getStorageClass() != Static && 46740b598eea1310ec9ed554d56ce3e25b34c585458Argyrios Kyrtzidis !getAttr<OverloadableAttr>(); 4686393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor 4696393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor break; 4706393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor } 4716393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor } 4726393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor 4736393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor return false; 4746393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor} 4756393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor 4768499f3f5ff8d5f95ece8047780030a3daad1b6faDouglas Gregorbool FunctionDecl::isGlobal() const { 4778499f3f5ff8d5f95ece8047780030a3daad1b6faDouglas Gregor if (const CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(this)) 4788499f3f5ff8d5f95ece8047780030a3daad1b6faDouglas Gregor return Method->isStatic(); 4798499f3f5ff8d5f95ece8047780030a3daad1b6faDouglas Gregor 4808499f3f5ff8d5f95ece8047780030a3daad1b6faDouglas Gregor if (getStorageClass() == Static) 4818499f3f5ff8d5f95ece8047780030a3daad1b6faDouglas Gregor return false; 4828499f3f5ff8d5f95ece8047780030a3daad1b6faDouglas Gregor 4831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump for (const DeclContext *DC = getDeclContext(); 4848499f3f5ff8d5f95ece8047780030a3daad1b6faDouglas Gregor DC->isNamespace(); 4858499f3f5ff8d5f95ece8047780030a3daad1b6faDouglas Gregor DC = DC->getParent()) { 4868499f3f5ff8d5f95ece8047780030a3daad1b6faDouglas Gregor if (const NamespaceDecl *Namespace = cast<NamespaceDecl>(DC)) { 4878499f3f5ff8d5f95ece8047780030a3daad1b6faDouglas Gregor if (!Namespace->getDeclName()) 4888499f3f5ff8d5f95ece8047780030a3daad1b6faDouglas Gregor return false; 4898499f3f5ff8d5f95ece8047780030a3daad1b6faDouglas Gregor break; 4908499f3f5ff8d5f95ece8047780030a3daad1b6faDouglas Gregor } 4918499f3f5ff8d5f95ece8047780030a3daad1b6faDouglas Gregor } 4928499f3f5ff8d5f95ece8047780030a3daad1b6faDouglas Gregor 4938499f3f5ff8d5f95ece8047780030a3daad1b6faDouglas Gregor return true; 4948499f3f5ff8d5f95ece8047780030a3daad1b6faDouglas Gregor} 4958499f3f5ff8d5f95ece8047780030a3daad1b6faDouglas Gregor 4963e41d60eb627dc227c770f1c1c87d06909cf05fdDouglas Gregor/// \brief Returns a value indicating whether this function 4973e41d60eb627dc227c770f1c1c87d06909cf05fdDouglas Gregor/// corresponds to a builtin function. 4983e41d60eb627dc227c770f1c1c87d06909cf05fdDouglas Gregor/// 4993e41d60eb627dc227c770f1c1c87d06909cf05fdDouglas Gregor/// The function corresponds to a built-in function if it is 5003e41d60eb627dc227c770f1c1c87d06909cf05fdDouglas Gregor/// declared at translation scope or within an extern "C" block and 5013e41d60eb627dc227c770f1c1c87d06909cf05fdDouglas Gregor/// its name matches with the name of a builtin. The returned value 5023e41d60eb627dc227c770f1c1c87d06909cf05fdDouglas Gregor/// will be 0 for functions that do not correspond to a builtin, a 5031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// value of type \c Builtin::ID if in the target-independent range 5043e41d60eb627dc227c770f1c1c87d06909cf05fdDouglas Gregor/// \c [1,Builtin::First), or a target-specific builtin value. 5057814e6d6645d587891293d59ecf6576defcfac92Douglas Gregorunsigned FunctionDecl::getBuiltinID() const { 5067814e6d6645d587891293d59ecf6576defcfac92Douglas Gregor ASTContext &Context = getASTContext(); 5073c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor if (!getIdentifier() || !getIdentifier()->getBuiltinID()) 5083c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor return 0; 5093c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor 5103c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor unsigned BuiltinID = getIdentifier()->getBuiltinID(); 5113c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor if (!Context.BuiltinInfo.isPredefinedLibFunction(BuiltinID)) 5123c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor return BuiltinID; 5133c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor 5143c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor // This function has the name of a known C library 5153c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor // function. Determine whether it actually refers to the C library 5163c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor // function or whether it just has the same name. 5173c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor 5189add31798f621f843233dbff8bba103fca64447bDouglas Gregor // If this is a static function, it's not a builtin. 5199add31798f621f843233dbff8bba103fca64447bDouglas Gregor if (getStorageClass() == Static) 5209add31798f621f843233dbff8bba103fca64447bDouglas Gregor return 0; 5219add31798f621f843233dbff8bba103fca64447bDouglas Gregor 5223c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor // If this function is at translation-unit scope and we're not in 5233c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor // C++, it refers to the C library function. 5243c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor if (!Context.getLangOptions().CPlusPlus && 5253c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor getDeclContext()->isTranslationUnit()) 5263c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor return BuiltinID; 5273c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor 5283c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor // If the function is in an extern "C" linkage specification and is 5293c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor // not marked "overloadable", it's the real function. 5303c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor if (isa<LinkageSpecDecl>(getDeclContext()) && 5311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump cast<LinkageSpecDecl>(getDeclContext())->getLanguage() 5323c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor == LinkageSpecDecl::lang_c && 53340b598eea1310ec9ed554d56ce3e25b34c585458Argyrios Kyrtzidis !getAttr<OverloadableAttr>()) 5343c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor return BuiltinID; 5353c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor 5363c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor // Not a builtin 5373e41d60eb627dc227c770f1c1c87d06909cf05fdDouglas Gregor return 0; 5383e41d60eb627dc227c770f1c1c87d06909cf05fdDouglas Gregor} 5393e41d60eb627dc227c770f1c1c87d06909cf05fdDouglas Gregor 5403e41d60eb627dc227c770f1c1c87d06909cf05fdDouglas Gregor 5411ad9b28e3217c2349a04f3d3bf14f9c73a99afa7Chris Lattner/// getNumParams - Return the number of parameters this function must have 5422dbd285f5033ca6dea25babfd1c43d9fec35e7e5Chris Lattner/// based on its FunctionType. This is the length of the PararmInfo array 5431ad9b28e3217c2349a04f3d3bf14f9c73a99afa7Chris Lattner/// after it has been created. 5441ad9b28e3217c2349a04f3d3bf14f9c73a99afa7Chris Lattnerunsigned FunctionDecl::getNumParams() const { 54511ddb7dc22bb398a6727318729680630bfcefaaeChris Lattner const FunctionType *FT = getType()->getAsFunctionType(); 54672564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor if (isa<FunctionNoProtoType>(FT)) 547d3b9065ec7052ec4741783d2fb4130d13c766933Chris Lattner return 0; 54872564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor return cast<FunctionProtoType>(FT)->getNumArgs(); 5491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 5515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 552fc767615bc67d3a7587b1fb2e0494c32c9dbd7a5Ted Kremenekvoid FunctionDecl::setParams(ASTContext& C, ParmVarDecl **NewParamInfo, 553fc767615bc67d3a7587b1fb2e0494c32c9dbd7a5Ted Kremenek unsigned NumParams) { 5545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer assert(ParamInfo == 0 && "Already has param info!"); 5552dbd285f5033ca6dea25babfd1c43d9fec35e7e5Chris Lattner assert(NumParams == getNumParams() && "Parameter count mismatch!"); 5561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Zero params -> null pointer. 5585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (NumParams) { 559c0ac4923f08b25ae973a8ee7942cf3eb89da57b7Steve Naroff void *Mem = C.Allocate(sizeof(ParmVarDecl*)*NumParams); 560fc767615bc67d3a7587b1fb2e0494c32c9dbd7a5Ted Kremenek ParamInfo = new (Mem) ParmVarDecl*[NumParams]; 5615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer memcpy(ParamInfo, NewParamInfo, sizeof(ParmVarDecl*)*NumParams); 56255d608cbadf1e9c05064f9287c057d50b7df65b4Argyrios Kyrtzidis 56396888cc2515e55c9b5dd6798063bf4be2c22983aArgyrios Kyrtzidis // Update source range. The check below allows us to set EndRangeLoc before 56496888cc2515e55c9b5dd6798063bf4be2c22983aArgyrios Kyrtzidis // setting the parameters. 565cb5f8f59322c352f51714c3de5d8047e70895165Argyrios Kyrtzidis if (EndRangeLoc.isInvalid() || EndRangeLoc == getLocation()) 56655d608cbadf1e9c05064f9287c057d50b7df65b4Argyrios Kyrtzidis EndRangeLoc = NewParamInfo[NumParams-1]->getLocEnd(); 5675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 5685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 5695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 5708123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner/// getMinRequiredArguments - Returns the minimum number of arguments 5718123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner/// needed to call this function. This may be fewer than the number of 5728123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner/// function parameters, if some of the parameters have default 5739e979557eea3875c9e3d100c68188233dd7f46c0Chris Lattner/// arguments (in C++). 5748123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattnerunsigned FunctionDecl::getMinRequiredArguments() const { 5758123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner unsigned NumRequiredArgs = getNumParams(); 5768123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner while (NumRequiredArgs > 0 577ae0b4e7be78cf0dc2a6a333e865c2be9265774f9Anders Carlsson && getParamDecl(NumRequiredArgs-1)->hasDefaultArg()) 5788123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner --NumRequiredArgs; 5798123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner 5808123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner return NumRequiredArgs; 5818123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner} 5828123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner 5831fc09a92d0bffda20e06fa882388c01e192e2069Douglas Gregor/// \brief For an inline function definition in C, determine whether the 5841fc09a92d0bffda20e06fa882388c01e192e2069Douglas Gregor/// definition will be externally visible. 5851fc09a92d0bffda20e06fa882388c01e192e2069Douglas Gregor/// 5861fc09a92d0bffda20e06fa882388c01e192e2069Douglas Gregor/// Inline function definitions are always available for inlining optimizations. 5871fc09a92d0bffda20e06fa882388c01e192e2069Douglas Gregor/// However, depending on the language dialect, declaration specifiers, and 5881fc09a92d0bffda20e06fa882388c01e192e2069Douglas Gregor/// attributes, the definition of an inline function may or may not be 5891fc09a92d0bffda20e06fa882388c01e192e2069Douglas Gregor/// "externally" visible to other translation units in the program. 5901fc09a92d0bffda20e06fa882388c01e192e2069Douglas Gregor/// 5911fc09a92d0bffda20e06fa882388c01e192e2069Douglas Gregor/// In C99, inline definitions are not externally visible by default. However, 5921fc09a92d0bffda20e06fa882388c01e192e2069Douglas Gregor/// if even one of the globa-scope declarations is marked "extern inline", the 5931fc09a92d0bffda20e06fa882388c01e192e2069Douglas Gregor/// inline definition becomes externally visible (C99 6.7.4p6). 5941fc09a92d0bffda20e06fa882388c01e192e2069Douglas Gregor/// 5951fc09a92d0bffda20e06fa882388c01e192e2069Douglas Gregor/// In GNU89 mode, or if the gnu_inline attribute is attached to the function 5961fc09a92d0bffda20e06fa882388c01e192e2069Douglas Gregor/// definition, we use the GNU semantics for inline, which are nearly the 5971fc09a92d0bffda20e06fa882388c01e192e2069Douglas Gregor/// opposite of C99 semantics. In particular, "inline" by itself will create 5981fc09a92d0bffda20e06fa882388c01e192e2069Douglas Gregor/// an externally visible symbol, but "extern inline" will not create an 5991fc09a92d0bffda20e06fa882388c01e192e2069Douglas Gregor/// externally visible symbol. 6001fc09a92d0bffda20e06fa882388c01e192e2069Douglas Gregorbool FunctionDecl::isInlineDefinitionExternallyVisible() const { 6011fc09a92d0bffda20e06fa882388c01e192e2069Douglas Gregor assert(isThisDeclarationADefinition() && "Must have the function definition"); 6021fc09a92d0bffda20e06fa882388c01e192e2069Douglas Gregor assert(isInline() && "Function must be inline"); 6031fc09a92d0bffda20e06fa882388c01e192e2069Douglas Gregor 6041fc09a92d0bffda20e06fa882388c01e192e2069Douglas Gregor if (!getASTContext().getLangOptions().C99 || hasAttr<GNUInlineAttr>()) { 6051fc09a92d0bffda20e06fa882388c01e192e2069Douglas Gregor // GNU inline semantics. Based on a number of examples, we came up with the 6061fc09a92d0bffda20e06fa882388c01e192e2069Douglas Gregor // following heuristic: if the "inline" keyword is present on a 6071fc09a92d0bffda20e06fa882388c01e192e2069Douglas Gregor // declaration of the function but "extern" is not present on that 6081fc09a92d0bffda20e06fa882388c01e192e2069Douglas Gregor // declaration, then the symbol is externally visible. Otherwise, the GNU 6091fc09a92d0bffda20e06fa882388c01e192e2069Douglas Gregor // "extern inline" semantics applies and the symbol is not externally 6101fc09a92d0bffda20e06fa882388c01e192e2069Douglas Gregor // visible. 6111fc09a92d0bffda20e06fa882388c01e192e2069Douglas Gregor for (redecl_iterator Redecl = redecls_begin(), RedeclEnd = redecls_end(); 6121fc09a92d0bffda20e06fa882388c01e192e2069Douglas Gregor Redecl != RedeclEnd; 6131fc09a92d0bffda20e06fa882388c01e192e2069Douglas Gregor ++Redecl) { 6141fc09a92d0bffda20e06fa882388c01e192e2069Douglas Gregor if (Redecl->isInline() && Redecl->getStorageClass() != Extern) 6151fc09a92d0bffda20e06fa882388c01e192e2069Douglas Gregor return true; 6161fc09a92d0bffda20e06fa882388c01e192e2069Douglas Gregor } 6171fc09a92d0bffda20e06fa882388c01e192e2069Douglas Gregor 6181fc09a92d0bffda20e06fa882388c01e192e2069Douglas Gregor // GNU "extern inline" semantics; no externally visible symbol. 6199f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor return false; 6201fc09a92d0bffda20e06fa882388c01e192e2069Douglas Gregor } 6211fc09a92d0bffda20e06fa882388c01e192e2069Douglas Gregor 6221fc09a92d0bffda20e06fa882388c01e192e2069Douglas Gregor // C99 6.7.4p6: 6231fc09a92d0bffda20e06fa882388c01e192e2069Douglas Gregor // [...] If all of the file scope declarations for a function in a 6241fc09a92d0bffda20e06fa882388c01e192e2069Douglas Gregor // translation unit include the inline function specifier without extern, 6251fc09a92d0bffda20e06fa882388c01e192e2069Douglas Gregor // then the definition in that translation unit is an inline definition. 6261fc09a92d0bffda20e06fa882388c01e192e2069Douglas Gregor for (redecl_iterator Redecl = redecls_begin(), RedeclEnd = redecls_end(); 6271fc09a92d0bffda20e06fa882388c01e192e2069Douglas Gregor Redecl != RedeclEnd; 6281fc09a92d0bffda20e06fa882388c01e192e2069Douglas Gregor ++Redecl) { 6291fc09a92d0bffda20e06fa882388c01e192e2069Douglas Gregor // Only consider file-scope declarations in this test. 6301fc09a92d0bffda20e06fa882388c01e192e2069Douglas Gregor if (!Redecl->getLexicalDeclContext()->isTranslationUnit()) 6311fc09a92d0bffda20e06fa882388c01e192e2069Douglas Gregor continue; 6321fc09a92d0bffda20e06fa882388c01e192e2069Douglas Gregor 6331fc09a92d0bffda20e06fa882388c01e192e2069Douglas Gregor if (!Redecl->isInline() || Redecl->getStorageClass() == Extern) 6341fc09a92d0bffda20e06fa882388c01e192e2069Douglas Gregor return true; // Not an inline definition 6351fc09a92d0bffda20e06fa882388c01e192e2069Douglas Gregor } 6361fc09a92d0bffda20e06fa882388c01e192e2069Douglas Gregor 6371fc09a92d0bffda20e06fa882388c01e192e2069Douglas Gregor // C99 6.7.4p6: 6381fc09a92d0bffda20e06fa882388c01e192e2069Douglas Gregor // An inline definition does not provide an external definition for the 6391fc09a92d0bffda20e06fa882388c01e192e2069Douglas Gregor // function, and does not forbid an external definition in another 6401fc09a92d0bffda20e06fa882388c01e192e2069Douglas Gregor // translation unit. 6419f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor return false; 6429f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor} 6439f9bf258f8ebae30bfb70feb9d797d6eb67b0460Douglas Gregor 6441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpvoid 645127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas GregorFunctionDecl::setPreviousDeclaration(FunctionDecl *PrevDecl) { 6461e4bc099882626059f14d687ed7a1a5518b7f3c2Argyrios Kyrtzidis redeclarable_base::setPreviousDeclaration(PrevDecl); 647f23e839e9ddea324c743d26da43fb767f90ca223Argyrios Kyrtzidis 648127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor if (FunctionTemplateDecl *FunTmpl = getDescribedFunctionTemplate()) { 6491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump FunctionTemplateDecl *PrevFunTmpl 650127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor = PrevDecl? PrevDecl->getDescribedFunctionTemplate() : 0; 651127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor assert((!PrevDecl || PrevFunTmpl) && "Function/function template mismatch"); 652127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor FunTmpl->setPreviousDeclaration(PrevFunTmpl); 653127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor } 654127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor} 655127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor 656b57a4fe73b8227c0dba651818b8495dfca61e530Argyrios KyrtzidisFunctionDecl *FunctionDecl::getCanonicalDecl() { 657f23e839e9ddea324c743d26da43fb767f90ca223Argyrios Kyrtzidis return getFirstDeclaration(); 658fc7e2a8fbb08f0f496ac6cea0721fe72db8ce240Argyrios Kyrtzidis} 659fc7e2a8fbb08f0f496ac6cea0721fe72db8ce240Argyrios Kyrtzidis 6601cd1b1e987f5e2f060d7972b13d83239b36d77d6Douglas Gregor/// getOverloadedOperator - Which C++ overloaded operator this 6611cd1b1e987f5e2f060d7972b13d83239b36d77d6Douglas Gregor/// function represents, if any. 6621cd1b1e987f5e2f060d7972b13d83239b36d77d6Douglas GregorOverloadedOperatorKind FunctionDecl::getOverloadedOperator() const { 663e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor if (getDeclName().getNameKind() == DeclarationName::CXXOperatorName) 664e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor return getDeclName().getCXXOverloadedOperator(); 6651cd1b1e987f5e2f060d7972b13d83239b36d77d6Douglas Gregor else 6661cd1b1e987f5e2f060d7972b13d83239b36d77d6Douglas Gregor return OO_None; 6671cd1b1e987f5e2f060d7972b13d83239b36d77d6Douglas Gregor} 6681cd1b1e987f5e2f060d7972b13d83239b36d77d6Douglas Gregor 66916e8be2ac532358d4e413fdfa2643b1876edda78Douglas GregorFunctionTemplateDecl *FunctionDecl::getPrimaryTemplate() const { 6701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (FunctionTemplateSpecializationInfo *Info 67116e8be2ac532358d4e413fdfa2643b1876edda78Douglas Gregor = TemplateOrSpecialization 67216e8be2ac532358d4e413fdfa2643b1876edda78Douglas Gregor .dyn_cast<FunctionTemplateSpecializationInfo*>()) { 6731fd2dd145d9bcdf0b8d60a88e1795b6ae83656f5Douglas Gregor return Info->Template.getPointer(); 67416e8be2ac532358d4e413fdfa2643b1876edda78Douglas Gregor } 67516e8be2ac532358d4e413fdfa2643b1876edda78Douglas Gregor return 0; 67616e8be2ac532358d4e413fdfa2643b1876edda78Douglas Gregor} 67716e8be2ac532358d4e413fdfa2643b1876edda78Douglas Gregor 67816e8be2ac532358d4e413fdfa2643b1876edda78Douglas Gregorconst TemplateArgumentList * 67916e8be2ac532358d4e413fdfa2643b1876edda78Douglas GregorFunctionDecl::getTemplateSpecializationArgs() const { 6801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (FunctionTemplateSpecializationInfo *Info 68116e8be2ac532358d4e413fdfa2643b1876edda78Douglas Gregor = TemplateOrSpecialization 68216e8be2ac532358d4e413fdfa2643b1876edda78Douglas Gregor .dyn_cast<FunctionTemplateSpecializationInfo*>()) { 68316e8be2ac532358d4e413fdfa2643b1876edda78Douglas Gregor return Info->TemplateArguments; 68416e8be2ac532358d4e413fdfa2643b1876edda78Douglas Gregor } 68516e8be2ac532358d4e413fdfa2643b1876edda78Douglas Gregor return 0; 68616e8be2ac532358d4e413fdfa2643b1876edda78Douglas Gregor} 68716e8be2ac532358d4e413fdfa2643b1876edda78Douglas Gregor 6881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpvoid 6891637be727f2a0434c1ed7aa385ea1c18328b0ccdDouglas GregorFunctionDecl::setFunctionTemplateSpecialization(ASTContext &Context, 6901637be727f2a0434c1ed7aa385ea1c18328b0ccdDouglas Gregor FunctionTemplateDecl *Template, 691127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor const TemplateArgumentList *TemplateArgs, 692127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor void *InsertPos) { 6931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump FunctionTemplateSpecializationInfo *Info 69416e8be2ac532358d4e413fdfa2643b1876edda78Douglas Gregor = TemplateOrSpecialization.dyn_cast<FunctionTemplateSpecializationInfo*>(); 6951637be727f2a0434c1ed7aa385ea1c18328b0ccdDouglas Gregor if (!Info) 69616e8be2ac532358d4e413fdfa2643b1876edda78Douglas Gregor Info = new (Context) FunctionTemplateSpecializationInfo; 6971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 698127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor Info->Function = this; 6991fd2dd145d9bcdf0b8d60a88e1795b6ae83656f5Douglas Gregor Info->Template.setPointer(Template); 700d0e3daf2b980b505e535d35b432c938c6d0208efDouglas Gregor Info->Template.setInt(TSK_ImplicitInstantiation - 1); 7011637be727f2a0434c1ed7aa385ea1c18328b0ccdDouglas Gregor Info->TemplateArguments = TemplateArgs; 7021637be727f2a0434c1ed7aa385ea1c18328b0ccdDouglas Gregor TemplateOrSpecialization = Info; 7031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 704127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor // Insert this function template specialization into the set of known 705127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor // function template specialiations. 706127102b5196ffe04bdb70fd553fe62c265ab10a9Douglas Gregor Template->getSpecializations().InsertNode(Info, InsertPos); 7071637be727f2a0434c1ed7aa385ea1c18328b0ccdDouglas Gregor} 7081637be727f2a0434c1ed7aa385ea1c18328b0ccdDouglas Gregor 709d0e3daf2b980b505e535d35b432c938c6d0208efDouglas GregorTemplateSpecializationKind FunctionDecl::getTemplateSpecializationKind() const { 7101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // For a function template specialization, query the specialization 711d0e3daf2b980b505e535d35b432c938c6d0208efDouglas Gregor // information object. 7121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump FunctionTemplateSpecializationInfo *Info 7131fd2dd145d9bcdf0b8d60a88e1795b6ae83656f5Douglas Gregor = TemplateOrSpecialization.dyn_cast<FunctionTemplateSpecializationInfo*>(); 714d0e3daf2b980b505e535d35b432c938c6d0208efDouglas Gregor if (Info) 715d0e3daf2b980b505e535d35b432c938c6d0208efDouglas Gregor return Info->getTemplateSpecializationKind(); 7161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 717d0e3daf2b980b505e535d35b432c938c6d0208efDouglas Gregor if (!getInstantiatedFromMemberFunction()) 718d0e3daf2b980b505e535d35b432c938c6d0208efDouglas Gregor return TSK_Undeclared; 7191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 720d0e3daf2b980b505e535d35b432c938c6d0208efDouglas Gregor // Find the class template specialization corresponding to this instantiation 721d0e3daf2b980b505e535d35b432c938c6d0208efDouglas Gregor // of a member function. 722d0e3daf2b980b505e535d35b432c938c6d0208efDouglas Gregor const DeclContext *Parent = getDeclContext(); 723d0e3daf2b980b505e535d35b432c938c6d0208efDouglas Gregor while (Parent && !isa<ClassTemplateSpecializationDecl>(Parent)) 724d0e3daf2b980b505e535d35b432c938c6d0208efDouglas Gregor Parent = Parent->getParent(); 7251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 726d0e3daf2b980b505e535d35b432c938c6d0208efDouglas Gregor if (!Parent) 727d0e3daf2b980b505e535d35b432c938c6d0208efDouglas Gregor return TSK_Undeclared; 728d0e3daf2b980b505e535d35b432c938c6d0208efDouglas Gregor 729d0e3daf2b980b505e535d35b432c938c6d0208efDouglas Gregor return cast<ClassTemplateSpecializationDecl>(Parent)->getSpecializationKind(); 7301fd2dd145d9bcdf0b8d60a88e1795b6ae83656f5Douglas Gregor} 7311fd2dd145d9bcdf0b8d60a88e1795b6ae83656f5Douglas Gregor 7321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpvoid 733d0e3daf2b980b505e535d35b432c938c6d0208efDouglas GregorFunctionDecl::setTemplateSpecializationKind(TemplateSpecializationKind TSK) { 7341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump FunctionTemplateSpecializationInfo *Info 7351fd2dd145d9bcdf0b8d60a88e1795b6ae83656f5Douglas Gregor = TemplateOrSpecialization.dyn_cast<FunctionTemplateSpecializationInfo*>(); 736d0e3daf2b980b505e535d35b432c938c6d0208efDouglas Gregor assert(Info && "Not a function template specialization"); 737d0e3daf2b980b505e535d35b432c938c6d0208efDouglas Gregor Info->setTemplateSpecializationKind(TSK); 7381fd2dd145d9bcdf0b8d60a88e1795b6ae83656f5Douglas Gregor} 7391fd2dd145d9bcdf0b8d60a88e1795b6ae83656f5Douglas Gregor 7409f185076dc8b79c8240b20a8746da96beb3f147bDouglas Gregorbool FunctionDecl::isOutOfLine() const { 7419f185076dc8b79c8240b20a8746da96beb3f147bDouglas Gregor // FIXME: Should we restrict this to member functions? 7429f185076dc8b79c8240b20a8746da96beb3f147bDouglas Gregor if (Decl::isOutOfLine()) 7439f185076dc8b79c8240b20a8746da96beb3f147bDouglas Gregor return true; 7449f185076dc8b79c8240b20a8746da96beb3f147bDouglas Gregor 7459f185076dc8b79c8240b20a8746da96beb3f147bDouglas Gregor // If this function was instantiated from a member function of a 7469f185076dc8b79c8240b20a8746da96beb3f147bDouglas Gregor // class template, check whether that member function was defined out-of-line. 7479f185076dc8b79c8240b20a8746da96beb3f147bDouglas Gregor if (FunctionDecl *FD = getInstantiatedFromMemberFunction()) { 7489f185076dc8b79c8240b20a8746da96beb3f147bDouglas Gregor const FunctionDecl *Definition; 7499f185076dc8b79c8240b20a8746da96beb3f147bDouglas Gregor if (FD->getBody(Definition)) 7509f185076dc8b79c8240b20a8746da96beb3f147bDouglas Gregor return Definition->isOutOfLine(); 7519f185076dc8b79c8240b20a8746da96beb3f147bDouglas Gregor } 7529f185076dc8b79c8240b20a8746da96beb3f147bDouglas Gregor 7539f185076dc8b79c8240b20a8746da96beb3f147bDouglas Gregor // If this function was instantiated from a function template, 7549f185076dc8b79c8240b20a8746da96beb3f147bDouglas Gregor // check whether that function template was defined out-of-line. 7559f185076dc8b79c8240b20a8746da96beb3f147bDouglas Gregor if (FunctionTemplateDecl *FunTmpl = getPrimaryTemplate()) { 7569f185076dc8b79c8240b20a8746da96beb3f147bDouglas Gregor const FunctionDecl *Definition; 7579f185076dc8b79c8240b20a8746da96beb3f147bDouglas Gregor if (FunTmpl->getTemplatedDecl()->getBody(Definition)) 7589f185076dc8b79c8240b20a8746da96beb3f147bDouglas Gregor return Definition->isOutOfLine(); 7599f185076dc8b79c8240b20a8746da96beb3f147bDouglas Gregor } 7609f185076dc8b79c8240b20a8746da96beb3f147bDouglas Gregor 7619f185076dc8b79c8240b20a8746da96beb3f147bDouglas Gregor return false; 7629f185076dc8b79c8240b20a8746da96beb3f147bDouglas Gregor} 7639f185076dc8b79c8240b20a8746da96beb3f147bDouglas Gregor 7648a934233d1582b5bde9d270bc0705aa81e471a79Chris Lattner//===----------------------------------------------------------------------===// 765bcbffc46f1ad3796c4582fa1e3a9113b5aa26061Douglas Gregor// TagDecl Implementation 7664b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek//===----------------------------------------------------------------------===// 7674b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek 768f602c8b6ce1a269c0bf8b3f049e923f4ea5c18e2Argyrios KyrtzidisSourceRange TagDecl::getSourceRange() const { 769f602c8b6ce1a269c0bf8b3f049e923f4ea5c18e2Argyrios Kyrtzidis SourceLocation E = RBraceLoc.isValid() ? RBraceLoc : getLocation(); 770741dd9a7e1d63e4e385b657e4ce11c5d96d44f72Douglas Gregor return SourceRange(TagKeywordLoc, E); 771f602c8b6ce1a269c0bf8b3f049e923f4ea5c18e2Argyrios Kyrtzidis} 772f602c8b6ce1a269c0bf8b3f049e923f4ea5c18e2Argyrios Kyrtzidis 773b57a4fe73b8227c0dba651818b8495dfca61e530Argyrios KyrtzidisTagDecl* TagDecl::getCanonicalDecl() { 7748e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor return getFirstDeclaration(); 775b57a4fe73b8227c0dba651818b8495dfca61e530Argyrios Kyrtzidis} 776b57a4fe73b8227c0dba651818b8495dfca61e530Argyrios Kyrtzidis 7770b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregorvoid TagDecl::startDefinition() { 7788e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor if (TagType *TagT = const_cast<TagType *>(TypeForDecl->getAs<TagType>())) { 7798e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor TagT->decl.setPointer(this); 7808e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor TagT->decl.setInt(1); 7818e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor } 7820b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregor} 7830b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregor 7840b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregorvoid TagDecl::completeDefinition() { 7850b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregor IsDefinition = true; 7868e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor if (TagType *TagT = const_cast<TagType *>(TypeForDecl->getAs<TagType>())) { 7878e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor assert(TagT->decl.getPointer() == this && 7888e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor "Attempt to redefine a tag definition?"); 7898e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor TagT->decl.setInt(0); 7908e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor } 7910b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregor} 7920b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregor 7934b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed KremenekTagDecl* TagDecl::getDefinition(ASTContext& C) const { 7948e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor if (isDefinition()) 7958e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor return const_cast<TagDecl *>(this); 7961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump for (redecl_iterator R = redecls_begin(), REnd = redecls_end(); 7988e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor R != REnd; ++R) 7998e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor if (R->isDefinition()) 8008e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor return *R; 8011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 8028e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor return 0; 8034b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek} 8044b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek 805f1bbbb49f06a7462476cd88166fccda5feb15cabJohn McCallTagDecl::TagKind TagDecl::getTagKindForTypeSpec(unsigned TypeSpec) { 806f1bbbb49f06a7462476cd88166fccda5feb15cabJohn McCall switch (TypeSpec) { 807f1bbbb49f06a7462476cd88166fccda5feb15cabJohn McCall default: llvm::llvm_unreachable("unexpected type specifier"); 808f1bbbb49f06a7462476cd88166fccda5feb15cabJohn McCall case DeclSpec::TST_struct: return TK_struct; 809f1bbbb49f06a7462476cd88166fccda5feb15cabJohn McCall case DeclSpec::TST_class: return TK_class; 810f1bbbb49f06a7462476cd88166fccda5feb15cabJohn McCall case DeclSpec::TST_union: return TK_union; 811f1bbbb49f06a7462476cd88166fccda5feb15cabJohn McCall case DeclSpec::TST_enum: return TK_enum; 812f1bbbb49f06a7462476cd88166fccda5feb15cabJohn McCall } 813f1bbbb49f06a7462476cd88166fccda5feb15cabJohn McCall} 814f1bbbb49f06a7462476cd88166fccda5feb15cabJohn McCall 8154b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek//===----------------------------------------------------------------------===// 8168a934233d1582b5bde9d270bc0705aa81e471a79Chris Lattner// RecordDecl Implementation 8178a934233d1582b5bde9d270bc0705aa81e471a79Chris Lattner//===----------------------------------------------------------------------===// 8185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 81935bc0821c4f80041724cd4c5c4889b2581546a41Argyrios KyrtzidisRecordDecl::RecordDecl(Kind DK, TagKind TK, DeclContext *DC, SourceLocation L, 8208e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor IdentifierInfo *Id, RecordDecl *PrevDecl, 8218e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor SourceLocation TKL) 8228e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor : TagDecl(DK, TK, DC, L, Id, PrevDecl, TKL) { 8236359792ca92e7ca2f416cb804c6604358174e994Ted Kremenek HasFlexibleArrayMember = false; 824bcbffc46f1ad3796c4582fa1e3a9113b5aa26061Douglas Gregor AnonymousStructOrUnion = false; 825082b02e8403d3ee9d2ded969fbe0e5d472f04cd8Fariborz Jahanian HasObjectMember = false; 8266359792ca92e7ca2f416cb804c6604358174e994Ted Kremenek assert(classof(static_cast<Decl*>(this)) && "Invalid Kind!"); 8276359792ca92e7ca2f416cb804c6604358174e994Ted Kremenek} 8286359792ca92e7ca2f416cb804c6604358174e994Ted Kremenek 8296359792ca92e7ca2f416cb804c6604358174e994Ted KremenekRecordDecl *RecordDecl::Create(ASTContext &C, TagKind TK, DeclContext *DC, 8304b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek SourceLocation L, IdentifierInfo *Id, 831741dd9a7e1d63e4e385b657e4ce11c5d96d44f72Douglas Gregor SourceLocation TKL, RecordDecl* PrevDecl) { 8321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 8338e9e9ef5348bce1a8f0741a5684fac3de9701c28Douglas Gregor RecordDecl* R = new (C) RecordDecl(Record, TK, DC, L, Id, PrevDecl, TKL); 8344b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek C.getTypeDeclType(R, PrevDecl); 8354b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek return R; 8366359792ca92e7ca2f416cb804c6604358174e994Ted Kremenek} 8376359792ca92e7ca2f416cb804c6604358174e994Ted Kremenek 838997b6c6d73541f010afc81e28191c8eae7b24f77Argyrios KyrtzidisRecordDecl::~RecordDecl() { 839997b6c6d73541f010afc81e28191c8eae7b24f77Argyrios Kyrtzidis} 840997b6c6d73541f010afc81e28191c8eae7b24f77Argyrios Kyrtzidis 841997b6c6d73541f010afc81e28191c8eae7b24f77Argyrios Kyrtzidisvoid RecordDecl::Destroy(ASTContext& C) { 842997b6c6d73541f010afc81e28191c8eae7b24f77Argyrios Kyrtzidis TagDecl::Destroy(C); 843997b6c6d73541f010afc81e28191c8eae7b24f77Argyrios Kyrtzidis} 844997b6c6d73541f010afc81e28191c8eae7b24f77Argyrios Kyrtzidis 845c9b5b4074bd73d4af76e69cccf8ecd365fdd1008Douglas Gregorbool RecordDecl::isInjectedClassName() const { 8461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return isImplicit() && getDeclName() && getDeclContext()->isRecord() && 847c9b5b4074bd73d4af76e69cccf8ecd365fdd1008Douglas Gregor cast<RecordDecl>(getDeclContext())->getDeclName() == getDeclName(); 848c9b5b4074bd73d4af76e69cccf8ecd365fdd1008Douglas Gregor} 849c9b5b4074bd73d4af76e69cccf8ecd365fdd1008Douglas Gregor 85044b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor/// completeDefinition - Notes that the definition of this type is now 85144b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor/// complete. 85244b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregorvoid RecordDecl::completeDefinition(ASTContext& C) { 8535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer assert(!isDefinition() && "Cannot redefine record!"); 8540b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregor TagDecl::completeDefinition(); 8555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 8565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 85756ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff//===----------------------------------------------------------------------===// 85856ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff// BlockDecl Implementation 85956ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff//===----------------------------------------------------------------------===// 86056ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff 86156ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve NaroffBlockDecl::~BlockDecl() { 86256ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff} 86356ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff 86456ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroffvoid BlockDecl::Destroy(ASTContext& C) { 86556ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff if (Body) 86656ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff Body->Destroy(C); 86756ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff 86856ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff for (param_iterator I=param_begin(), E=param_end(); I!=E; ++I) 86956ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff (*I)->Destroy(C); 8701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 8711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump C.Deallocate(ParamInfo); 87256ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff Decl::Destroy(C); 87356ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff} 874e78b809bbcd92928a63da81f2cd843faad3e4dfdSteve Naroff 875e78b809bbcd92928a63da81f2cd843faad3e4dfdSteve Naroffvoid BlockDecl::setParams(ASTContext& C, ParmVarDecl **NewParamInfo, 876e78b809bbcd92928a63da81f2cd843faad3e4dfdSteve Naroff unsigned NParms) { 877e78b809bbcd92928a63da81f2cd843faad3e4dfdSteve Naroff assert(ParamInfo == 0 && "Already has param info!"); 8781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 879e78b809bbcd92928a63da81f2cd843faad3e4dfdSteve Naroff // Zero params -> null pointer. 880e78b809bbcd92928a63da81f2cd843faad3e4dfdSteve Naroff if (NParms) { 881e78b809bbcd92928a63da81f2cd843faad3e4dfdSteve Naroff NumParams = NParms; 882e78b809bbcd92928a63da81f2cd843faad3e4dfdSteve Naroff void *Mem = C.Allocate(sizeof(ParmVarDecl*)*NumParams); 883e78b809bbcd92928a63da81f2cd843faad3e4dfdSteve Naroff ParamInfo = new (Mem) ParmVarDecl*[NumParams]; 884e78b809bbcd92928a63da81f2cd843faad3e4dfdSteve Naroff memcpy(ParamInfo, NewParamInfo, sizeof(ParmVarDecl*)*NumParams); 885e78b809bbcd92928a63da81f2cd843faad3e4dfdSteve Naroff } 886e78b809bbcd92928a63da81f2cd843faad3e4dfdSteve Naroff} 887e78b809bbcd92928a63da81f2cd843faad3e4dfdSteve Naroff 888e78b809bbcd92928a63da81f2cd843faad3e4dfdSteve Naroffunsigned BlockDecl::getNumParams() const { 889e78b809bbcd92928a63da81f2cd843faad3e4dfdSteve Naroff return NumParams; 890e78b809bbcd92928a63da81f2cd843faad3e4dfdSteve Naroff} 891