Decl.cpp revision 3e9704981d7691fdd44913bf1786e8d760d8a627
15f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===--- Decl.cpp - Declaration AST Node Implementation -------------------===// 25f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 35f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// The LLVM Compiler Infrastructure 45f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 50bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// This file is distributed under the University of Illinois Open Source 60bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// License. See LICENSE.TXT for details. 75f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 85f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 95f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 10e184baeaa112ceac32420f8ca127b8d4d152d109Argyrios Kyrtzidis// This file implements the Decl subclasses. 115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/AST/Decl.h" 156c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner#include "clang/AST/ASTContext.h" 16e91593ef084479340582b2ba177b44be50a717b7Daniel Dunbar#include "clang/AST/Stmt.h" 1799f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes#include "clang/AST/Expr.h" 18e91593ef084479340582b2ba177b44be50a717b7Daniel Dunbar#include "clang/Basic/IdentifierTable.h" 1927f8a28bee33bb0e857cfe1a61c281bbc234b338Ted Kremenek 205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerusing namespace clang; 215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 22d3b9065ec7052ec4741783d2fb4130d13c766933Chris Lattner//===----------------------------------------------------------------------===// 236c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner// Decl Allocation/Deallocation Method Implementations 246c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner//===----------------------------------------------------------------------===// 252d1c5d313cd0c229cc614e74baa4c5756a4b46f4Argyrios Kyrtzidis 26ef177820100ab583b08fd3056e2a5a52ee4b1629Argyrios KyrtzidisTranslationUnitDecl *TranslationUnitDecl::Create(ASTContext &C) { 273e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff return new (C) TranslationUnitDecl(); 28ef177820100ab583b08fd3056e2a5a52ee4b1629Argyrios Kyrtzidis} 29ef177820100ab583b08fd3056e2a5a52ee4b1629Argyrios Kyrtzidis 302d1c5d313cd0c229cc614e74baa4c5756a4b46f4Argyrios KyrtzidisNamespaceDecl *NamespaceDecl::Create(ASTContext &C, DeclContext *DC, 312d1c5d313cd0c229cc614e74baa4c5756a4b46f4Argyrios Kyrtzidis SourceLocation L, IdentifierInfo *Id) { 323e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff return new (C) NamespaceDecl(DC, L, Id); 332d1c5d313cd0c229cc614e74baa4c5756a4b46f4Argyrios Kyrtzidis} 342d1c5d313cd0c229cc614e74baa4c5756a4b46f4Argyrios Kyrtzidis 35d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenekvoid NamespaceDecl::Destroy(ASTContext& C) { 36d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenek // NamespaceDecl uses "NextDeclarator" to chain namespace declarations 37d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenek // together. They are all top-level Decls. 38d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenek 39ebf27b1831e6c4d7f4bc30e111a4d6340ff690d1Ted Kremenek this->~NamespaceDecl(); 403e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff C.Deallocate((void *)this); 41d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenek} 42d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenek 43d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenek 444111024be81e7c0525e42dadcc126d27e5bf2425Chris LattnerImplicitParamDecl *ImplicitParamDecl::Create(ASTContext &C, DeclContext *DC, 454afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor SourceLocation L, IdentifierInfo *Id, QualType T) { 463e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff return new (C) ImplicitParamDecl(ImplicitParam, DC, L, Id, T); 474111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner} 484111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner 499fdf9c6d3530bb85f3166e6460d841e2ff8e1a2cChris LattnerParmVarDecl *ParmVarDecl::Create(ASTContext &C, DeclContext *DC, 500ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner SourceLocation L, IdentifierInfo *Id, 510ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner QualType T, StorageClass S, 524afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor Expr *DefArg) { 533e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff return new (C) ParmVarDecl(ParmVar, DC, L, Id, T, S, DefArg); 544306d3cb9116605728252e2738df24b9f6ab53c3Fariborz Jahanian} 554306d3cb9116605728252e2738df24b9f6ab53c3Fariborz Jahanian 564306d3cb9116605728252e2738df24b9f6ab53c3Fariborz JahanianQualType ParmVarDecl::getOriginalType() const { 574306d3cb9116605728252e2738df24b9f6ab53c3Fariborz Jahanian if (const ParmVarWithOriginalTypeDecl *PVD = 584306d3cb9116605728252e2738df24b9f6ab53c3Fariborz Jahanian dyn_cast<ParmVarWithOriginalTypeDecl>(this)) 594306d3cb9116605728252e2738df24b9f6ab53c3Fariborz Jahanian return PVD->OriginalType; 604306d3cb9116605728252e2738df24b9f6ab53c3Fariborz Jahanian return getType(); 619e151e154780e9cd443336143af1e996d1f387e5Chris Lattner} 629e151e154780e9cd443336143af1e996d1f387e5Chris Lattner 6373da9e462576faedc2cdf96b37a1c072b404b73dFariborz JahanianParmVarWithOriginalTypeDecl *ParmVarWithOriginalTypeDecl::Create( 6473da9e462576faedc2cdf96b37a1c072b404b73dFariborz Jahanian ASTContext &C, DeclContext *DC, 6573da9e462576faedc2cdf96b37a1c072b404b73dFariborz Jahanian SourceLocation L, IdentifierInfo *Id, 6673da9e462576faedc2cdf96b37a1c072b404b73dFariborz Jahanian QualType T, QualType OT, StorageClass S, 674afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor Expr *DefArg) { 683e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff return new (C) ParmVarWithOriginalTypeDecl(DC, L, Id, T, OT, S, DefArg); 6973da9e462576faedc2cdf96b37a1c072b404b73dFariborz Jahanian} 7073da9e462576faedc2cdf96b37a1c072b404b73dFariborz Jahanian 719fdf9c6d3530bb85f3166e6460d841e2ff8e1a2cChris LattnerFunctionDecl *FunctionDecl::Create(ASTContext &C, DeclContext *DC, 720ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner SourceLocation L, 7310bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor DeclarationName N, QualType T, 74a98e58ddb4696a0020fe97439d5295413f9e90b1Chris Lattner StorageClass S, bool isInline, 750eb07bfde0deedcb35cf3d118b3488f5d8db32ecSteve Naroff SourceLocation TypeSpecStartLoc) { 763e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff return new (C) FunctionDecl(Function, DC, L, N, T, S, isInline, 770eb07bfde0deedcb35cf3d118b3488f5d8db32ecSteve Naroff TypeSpecStartLoc); 78a98e58ddb4696a0020fe97439d5295413f9e90b1Chris Lattner} 79a98e58ddb4696a0020fe97439d5295413f9e90b1Chris Lattner 80090276f5e164d491a1bb3f541bafdb394f5e6f04Steve NaroffBlockDecl *BlockDecl::Create(ASTContext &C, DeclContext *DC, SourceLocation L) { 813e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff return new (C) BlockDecl(DC, L); 8256ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff} 8356ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff 8444b4321feab46299d3f5cfd404680884752a0fcfDouglas GregorFieldDecl *FieldDecl::Create(ASTContext &C, DeclContext *DC, SourceLocation L, 8544b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor IdentifierInfo *Id, QualType T, Expr *BW, 864afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor bool Mutable) { 873e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff return new (C) FieldDecl(Decl::Field, DC, L, Id, T, BW, Mutable); 888e25d8681822d8094bfeb97b2239363552548171Chris Lattner} 898e25d8681822d8094bfeb97b2239363552548171Chris Lattner 906b3945f4bc757bdadd3e443180cf32c2cccb52a0Douglas Gregorbool FieldDecl::isAnonymousStructOrUnion() const { 916b3945f4bc757bdadd3e443180cf32c2cccb52a0Douglas Gregor if (!isImplicit() || getDeclName()) 926b3945f4bc757bdadd3e443180cf32c2cccb52a0Douglas Gregor return false; 936b3945f4bc757bdadd3e443180cf32c2cccb52a0Douglas Gregor 946b3945f4bc757bdadd3e443180cf32c2cccb52a0Douglas Gregor if (const RecordType *Record = getType()->getAsRecordType()) 956b3945f4bc757bdadd3e443180cf32c2cccb52a0Douglas Gregor return Record->getDecl()->isAnonymousStructOrUnion(); 966b3945f4bc757bdadd3e443180cf32c2cccb52a0Douglas Gregor 976b3945f4bc757bdadd3e443180cf32c2cccb52a0Douglas Gregor return false; 986b3945f4bc757bdadd3e443180cf32c2cccb52a0Douglas Gregor} 99a98e58ddb4696a0020fe97439d5295413f9e90b1Chris Lattner 1000ed844b04ea4387caa4e1cf3dc375d269657536bChris LattnerEnumConstantDecl *EnumConstantDecl::Create(ASTContext &C, EnumDecl *CD, 1010ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner SourceLocation L, 102c63e660882ff93841fa234d70ef6757038302b92Chris Lattner IdentifierInfo *Id, QualType T, 1034afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor Expr *E, const llvm::APSInt &V) { 1043e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff return new (C) EnumConstantDecl(CD, L, Id, T, E, V); 1056c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner} 1066c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner 107d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenekvoid EnumConstantDecl::Destroy(ASTContext& C) { 108d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenek if (Init) Init->Destroy(C); 109d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenek Decl::Destroy(C); 110d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenek} 111d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenek 1129fdf9c6d3530bb85f3166e6460d841e2ff8e1a2cChris LattnerTypedefDecl *TypedefDecl::Create(ASTContext &C, DeclContext *DC, 1130ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner SourceLocation L, 1144afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor IdentifierInfo *Id, QualType T) { 1153e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff return new (C) TypedefDecl(DC, L, Id, T); 1166c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner} 1176c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner 1189fdf9c6d3530bb85f3166e6460d841e2ff8e1a2cChris LattnerEnumDecl *EnumDecl::Create(ASTContext &C, DeclContext *DC, SourceLocation L, 1190ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner IdentifierInfo *Id, 1207df7b6bb800e1987951285ea192e4f347e1b603aDouglas Gregor EnumDecl *PrevDecl) { 1216c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner void *Mem = C.getAllocator().Allocate<EnumDecl>(); 1224afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor EnumDecl *Enum = new (Mem) EnumDecl(DC, L, Id); 1237df7b6bb800e1987951285ea192e4f347e1b603aDouglas Gregor C.getTypeDeclType(Enum, PrevDecl); 1247df7b6bb800e1987951285ea192e4f347e1b603aDouglas Gregor return Enum; 1256c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner} 1266c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner 127df91eca19bd9738abd9a3b84791f39750e27ad36Ted Kremenekvoid EnumDecl::Destroy(ASTContext& C) { 128df91eca19bd9738abd9a3b84791f39750e27ad36Ted Kremenek Decl::Destroy(C); 129df91eca19bd9738abd9a3b84791f39750e27ad36Ted Kremenek} 130df91eca19bd9738abd9a3b84791f39750e27ad36Ted Kremenek 13144b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregorvoid EnumDecl::completeDefinition(ASTContext &C, QualType NewType) { 13244b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor assert(!isDefinition() && "Cannot redefine enums!"); 13344b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor IntegerType = NewType; 1340b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregor TagDecl::completeDefinition(); 13544b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor} 13644b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 1374afa39deaa245592977136d367251ee2c173dd8dDouglas GregorFileScopeAsmDecl *FileScopeAsmDecl::Create(ASTContext &C, DeclContext *DC, 1380ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner SourceLocation L, 1398e25d8681822d8094bfeb97b2239363552548171Chris Lattner StringLiteral *Str) { 1403e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff return new (C) FileScopeAsmDecl(DC, L, Str); 1418e25d8681822d8094bfeb97b2239363552548171Chris Lattner} 1428e25d8681822d8094bfeb97b2239363552548171Chris Lattner 1436c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner//===----------------------------------------------------------------------===// 1444afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor// NamedDecl Implementation 1455239304ff761b8b03eefb772bd5d830a9b9f1aeaArgyrios Kyrtzidis//===----------------------------------------------------------------------===// 1465239304ff761b8b03eefb772bd5d830a9b9f1aeaArgyrios Kyrtzidis 1474afa39deaa245592977136d367251ee2c173dd8dDouglas Gregorbool NamedDecl::declarationReplaces(NamedDecl *OldD) const { 1486ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor assert(getDeclName() == OldD->getDeclName() && "Declaration name mismatch"); 1496ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor 1506ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(this)) 1516ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor // For function declarations, we keep track of redeclarations. 1526ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor return FD->getPreviousDeclaration() == OldD; 1536ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor 1546ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor // For non-function declarations, if the declarations are of the 1556ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor // same kind then this must be a redeclaration, or semantic analysis 1566ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor // would not have given us the new declaration. 1576ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor return this->getKind() == OldD->getKind(); 1586ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor} 1596ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor 1604afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor 1615239304ff761b8b03eefb772bd5d830a9b9f1aeaArgyrios Kyrtzidis//===----------------------------------------------------------------------===// 16299f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes// VarDecl Implementation 16399f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes//===----------------------------------------------------------------------===// 16499f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes 1654afa39deaa245592977136d367251ee2c173dd8dDouglas GregorVarDecl *VarDecl::Create(ASTContext &C, DeclContext *DC, SourceLocation L, 1664afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor IdentifierInfo *Id, QualType T, StorageClass S, 16799f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes SourceLocation TypeSpecStartLoc) { 1683e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff return new (C) VarDecl(Var, DC, L, Id, T, S, TypeSpecStartLoc); 16999f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes} 17099f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes 17199f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopesvoid VarDecl::Destroy(ASTContext& C) { 17299f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes this->~VarDecl(); 1733e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff C.Deallocate((void *)this); 17499f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes} 17599f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes 17699f06ba988922ea721035a89e6d3c66ba100ba8aNuno LopesVarDecl::~VarDecl() { 17799f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes delete getInit(); 17899f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes} 17999f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes 18099f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes//===----------------------------------------------------------------------===// 1818a934233d1582b5bde9d270bc0705aa81e471a79Chris Lattner// FunctionDecl Implementation 1828a934233d1582b5bde9d270bc0705aa81e471a79Chris Lattner//===----------------------------------------------------------------------===// 1838a934233d1582b5bde9d270bc0705aa81e471a79Chris Lattner 18427f8a28bee33bb0e857cfe1a61c281bbc234b338Ted Kremenekvoid FunctionDecl::Destroy(ASTContext& C) { 185b65cf41707d190d5ce3d48b9e5bd2dc9d7b4a4c0Ted Kremenek if (Body) 186b65cf41707d190d5ce3d48b9e5bd2dc9d7b4a4c0Ted Kremenek Body->Destroy(C); 187b65cf41707d190d5ce3d48b9e5bd2dc9d7b4a4c0Ted Kremenek 188b65cf41707d190d5ce3d48b9e5bd2dc9d7b4a4c0Ted Kremenek for (param_iterator I=param_begin(), E=param_end(); I!=E; ++I) 189b65cf41707d190d5ce3d48b9e5bd2dc9d7b4a4c0Ted Kremenek (*I)->Destroy(C); 190460b0ac80382fa73337d21dd052c1f18b27435d8Nuno Lopes 1913e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff C.Deallocate(ParamInfo); 192460b0ac80382fa73337d21dd052c1f18b27435d8Nuno Lopes 19327f8a28bee33bb0e857cfe1a61c281bbc234b338Ted Kremenek Decl::Destroy(C); 19427f8a28bee33bb0e857cfe1a61c281bbc234b338Ted Kremenek} 19527f8a28bee33bb0e857cfe1a61c281bbc234b338Ted Kremenek 19627f8a28bee33bb0e857cfe1a61c281bbc234b338Ted Kremenek 197f009795057dc8ca254f5618c80a0a90f07cd44b4Douglas GregorStmt *FunctionDecl::getBody(const FunctionDecl *&Definition) const { 198f009795057dc8ca254f5618c80a0a90f07cd44b4Douglas Gregor for (const FunctionDecl *FD = this; FD != 0; FD = FD->PreviousDeclaration) { 199f009795057dc8ca254f5618c80a0a90f07cd44b4Douglas Gregor if (FD->Body) { 200f009795057dc8ca254f5618c80a0a90f07cd44b4Douglas Gregor Definition = FD; 201f009795057dc8ca254f5618c80a0a90f07cd44b4Douglas Gregor return FD->Body; 202f009795057dc8ca254f5618c80a0a90f07cd44b4Douglas Gregor } 203f009795057dc8ca254f5618c80a0a90f07cd44b4Douglas Gregor } 204f009795057dc8ca254f5618c80a0a90f07cd44b4Douglas Gregor 205f009795057dc8ca254f5618c80a0a90f07cd44b4Douglas Gregor return 0; 2065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 2075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 2084f03fd61ee45245dd3a1552a023e730d56c2e697Ted Kremenek// Helper function for FunctionDecl::getNumParams and FunctionDecl::setParams() 2094f03fd61ee45245dd3a1552a023e730d56c2e697Ted Kremenekstatic unsigned getNumTypeParams(QualType T) { 2104f03fd61ee45245dd3a1552a023e730d56c2e697Ted Kremenek const FunctionType *FT = T->getAsFunctionType(); 211d8bdba5d3534b87cae606d559933bc62752e8828Chris Lattner if (isa<FunctionTypeNoProto>(FT)) 212d3b9065ec7052ec4741783d2fb4130d13c766933Chris Lattner return 0; 213d8bdba5d3534b87cae606d559933bc62752e8828Chris Lattner return cast<FunctionTypeProto>(FT)->getNumArgs(); 2145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 2155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 2164f03fd61ee45245dd3a1552a023e730d56c2e697Ted Kremenekunsigned FunctionDecl::getNumParams() const { 2174f03fd61ee45245dd3a1552a023e730d56c2e697Ted Kremenek // Can happen if a FunctionDecl is declared using typeof(some_other_func) bar; 2184f03fd61ee45245dd3a1552a023e730d56c2e697Ted Kremenek if (!ParamInfo) 2194f03fd61ee45245dd3a1552a023e730d56c2e697Ted Kremenek return 0; 2204f03fd61ee45245dd3a1552a023e730d56c2e697Ted Kremenek 2214f03fd61ee45245dd3a1552a023e730d56c2e697Ted Kremenek return getNumTypeParams(getType()); 2224f03fd61ee45245dd3a1552a023e730d56c2e697Ted Kremenek} 2234f03fd61ee45245dd3a1552a023e730d56c2e697Ted Kremenek 224fc767615bc67d3a7587b1fb2e0494c32c9dbd7a5Ted Kremenekvoid FunctionDecl::setParams(ASTContext& C, ParmVarDecl **NewParamInfo, 225fc767615bc67d3a7587b1fb2e0494c32c9dbd7a5Ted Kremenek unsigned NumParams) { 2265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer assert(ParamInfo == 0 && "Already has param info!"); 2274f03fd61ee45245dd3a1552a023e730d56c2e697Ted Kremenek assert(NumParams == getNumTypeParams(getType()) && 2284f03fd61ee45245dd3a1552a023e730d56c2e697Ted Kremenek "Parameter count mismatch!"); 2295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 2305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Zero params -> null pointer. 2315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (NumParams) { 232fc767615bc67d3a7587b1fb2e0494c32c9dbd7a5Ted Kremenek void *Mem = C.getAllocator().Allocate<ParmVarDecl*>(NumParams); 233fc767615bc67d3a7587b1fb2e0494c32c9dbd7a5Ted Kremenek ParamInfo = new (Mem) ParmVarDecl*[NumParams]; 2345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer memcpy(ParamInfo, NewParamInfo, sizeof(ParmVarDecl*)*NumParams); 2355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 2365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 2375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 2388123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner/// getMinRequiredArguments - Returns the minimum number of arguments 2398123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner/// needed to call this function. This may be fewer than the number of 2408123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner/// function parameters, if some of the parameters have default 2419e979557eea3875c9e3d100c68188233dd7f46c0Chris Lattner/// arguments (in C++). 2428123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattnerunsigned FunctionDecl::getMinRequiredArguments() const { 2438123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner unsigned NumRequiredArgs = getNumParams(); 2448123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner while (NumRequiredArgs > 0 2458123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner && getParamDecl(NumRequiredArgs-1)->getDefaultArg()) 2468123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner --NumRequiredArgs; 2478123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner 2488123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner return NumRequiredArgs; 2498123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner} 2508123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner 2511cd1b1e987f5e2f060d7972b13d83239b36d77d6Douglas Gregor/// getOverloadedOperator - Which C++ overloaded operator this 2521cd1b1e987f5e2f060d7972b13d83239b36d77d6Douglas Gregor/// function represents, if any. 2531cd1b1e987f5e2f060d7972b13d83239b36d77d6Douglas GregorOverloadedOperatorKind FunctionDecl::getOverloadedOperator() const { 254e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor if (getDeclName().getNameKind() == DeclarationName::CXXOperatorName) 255e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor return getDeclName().getCXXOverloadedOperator(); 2561cd1b1e987f5e2f060d7972b13d83239b36d77d6Douglas Gregor else 2571cd1b1e987f5e2f060d7972b13d83239b36d77d6Douglas Gregor return OO_None; 2581cd1b1e987f5e2f060d7972b13d83239b36d77d6Douglas Gregor} 2591cd1b1e987f5e2f060d7972b13d83239b36d77d6Douglas Gregor 2608a934233d1582b5bde9d270bc0705aa81e471a79Chris Lattner//===----------------------------------------------------------------------===// 261bcbffc46f1ad3796c4582fa1e3a9113b5aa26061Douglas Gregor// TagDecl Implementation 2624b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek//===----------------------------------------------------------------------===// 2634b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek 2640b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregorvoid TagDecl::startDefinition() { 2650b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregor cast<TagType>(TypeForDecl)->decl.setPointer(this); 2660b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregor cast<TagType>(TypeForDecl)->decl.setInt(1); 2670b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregor} 2680b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregor 2690b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregorvoid TagDecl::completeDefinition() { 2700b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregor assert((!TypeForDecl || 2710b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregor cast<TagType>(TypeForDecl)->decl.getPointer() == this) && 2720b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregor "Attempt to redefine a tag definition?"); 2730b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregor IsDefinition = true; 2740b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregor cast<TagType>(TypeForDecl)->decl.setPointer(this); 2750b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregor cast<TagType>(TypeForDecl)->decl.setInt(0); 2760b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregor} 2770b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregor 2784b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed KremenekTagDecl* TagDecl::getDefinition(ASTContext& C) const { 2794b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek QualType T = C.getTypeDeclType(const_cast<TagDecl*>(this)); 2804b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek TagDecl* D = cast<TagDecl>(cast<TagType>(T)->getDecl()); 2814b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek return D->isDefinition() ? D : 0; 2824b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek} 2834b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek 2844b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek//===----------------------------------------------------------------------===// 2858a934233d1582b5bde9d270bc0705aa81e471a79Chris Lattner// RecordDecl Implementation 2868a934233d1582b5bde9d270bc0705aa81e471a79Chris Lattner//===----------------------------------------------------------------------===// 2875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 28835bc0821c4f80041724cd4c5c4889b2581546a41Argyrios KyrtzidisRecordDecl::RecordDecl(Kind DK, TagKind TK, DeclContext *DC, SourceLocation L, 289df042e6c2bf06b2d9ed53c52469599ac1bd93a3fTed Kremenek IdentifierInfo *Id) 2904afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor : TagDecl(DK, TK, DC, L, Id) { 2916359792ca92e7ca2f416cb804c6604358174e994Ted Kremenek HasFlexibleArrayMember = false; 292bcbffc46f1ad3796c4582fa1e3a9113b5aa26061Douglas Gregor AnonymousStructOrUnion = false; 2936359792ca92e7ca2f416cb804c6604358174e994Ted Kremenek assert(classof(static_cast<Decl*>(this)) && "Invalid Kind!"); 2946359792ca92e7ca2f416cb804c6604358174e994Ted Kremenek} 2956359792ca92e7ca2f416cb804c6604358174e994Ted Kremenek 2966359792ca92e7ca2f416cb804c6604358174e994Ted KremenekRecordDecl *RecordDecl::Create(ASTContext &C, TagKind TK, DeclContext *DC, 2974b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek SourceLocation L, IdentifierInfo *Id, 2984b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek RecordDecl* PrevDecl) { 299df042e6c2bf06b2d9ed53c52469599ac1bd93a3fTed Kremenek 3003e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff RecordDecl* R = new (C) RecordDecl(Record, TK, DC, L, Id); 3014b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek C.getTypeDeclType(R, PrevDecl); 3024b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek return R; 3036359792ca92e7ca2f416cb804c6604358174e994Ted Kremenek} 3046359792ca92e7ca2f416cb804c6604358174e994Ted Kremenek 305997b6c6d73541f010afc81e28191c8eae7b24f77Argyrios KyrtzidisRecordDecl::~RecordDecl() { 306997b6c6d73541f010afc81e28191c8eae7b24f77Argyrios Kyrtzidis} 307997b6c6d73541f010afc81e28191c8eae7b24f77Argyrios Kyrtzidis 308997b6c6d73541f010afc81e28191c8eae7b24f77Argyrios Kyrtzidisvoid RecordDecl::Destroy(ASTContext& C) { 309997b6c6d73541f010afc81e28191c8eae7b24f77Argyrios Kyrtzidis TagDecl::Destroy(C); 310997b6c6d73541f010afc81e28191c8eae7b24f77Argyrios Kyrtzidis} 311997b6c6d73541f010afc81e28191c8eae7b24f77Argyrios Kyrtzidis 31244b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor/// completeDefinition - Notes that the definition of this type is now 31344b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor/// complete. 31444b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregorvoid RecordDecl::completeDefinition(ASTContext& C) { 3155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer assert(!isDefinition() && "Cannot redefine record!"); 3160b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregor TagDecl::completeDefinition(); 3175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 3185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 31956ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff//===----------------------------------------------------------------------===// 32056ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff// BlockDecl Implementation 32156ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff//===----------------------------------------------------------------------===// 32256ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff 32356ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve NaroffBlockDecl::~BlockDecl() { 32456ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff} 32556ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff 32656ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroffvoid BlockDecl::Destroy(ASTContext& C) { 32756ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff if (Body) 32856ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff Body->Destroy(C); 32956ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff 33056ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff for (param_iterator I=param_begin(), E=param_end(); I!=E; ++I) 33156ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff (*I)->Destroy(C); 33256ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff 33356ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff Decl::Destroy(C); 33456ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff} 335