Decl.cpp revision 082d936a5b8323ac2c04558d8bca277a647831a3
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"
176c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner#include "clang/AST/ASTContext.h"
18e91593ef084479340582b2ba177b44be50a717b7Daniel Dunbar#include "clang/AST/Stmt.h"
1999f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes#include "clang/AST/Expr.h"
20e91593ef084479340582b2ba177b44be50a717b7Daniel Dunbar#include "clang/Basic/IdentifierTable.h"
2147b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor#include <vector>
2227f8a28bee33bb0e857cfe1a61c281bbc234b338Ted Kremenek
235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerusing namespace clang;
245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
250b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattnervoid Attr::Destroy(ASTContext &C) {
260b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner  if (Next) {
270b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner    Next->Destroy(C);
280b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner    Next = 0;
290b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner  }
300b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner  this->~Attr();
310b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner  C.Deallocate((void*)this);
320b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner}
330b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner
340b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner
35d3b9065ec7052ec4741783d2fb4130d13c766933Chris Lattner//===----------------------------------------------------------------------===//
366c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner// Decl Allocation/Deallocation Method Implementations
376c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner//===----------------------------------------------------------------------===//
382d1c5d313cd0c229cc614e74baa4c5756a4b46f4Argyrios Kyrtzidis
390b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner
40ef177820100ab583b08fd3056e2a5a52ee4b1629Argyrios KyrtzidisTranslationUnitDecl *TranslationUnitDecl::Create(ASTContext &C) {
413e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff  return new (C) TranslationUnitDecl();
42ef177820100ab583b08fd3056e2a5a52ee4b1629Argyrios Kyrtzidis}
43ef177820100ab583b08fd3056e2a5a52ee4b1629Argyrios Kyrtzidis
442d1c5d313cd0c229cc614e74baa4c5756a4b46f4Argyrios KyrtzidisNamespaceDecl *NamespaceDecl::Create(ASTContext &C, DeclContext *DC,
452d1c5d313cd0c229cc614e74baa4c5756a4b46f4Argyrios Kyrtzidis                                     SourceLocation L, IdentifierInfo *Id) {
463e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff  return new (C) NamespaceDecl(DC, L, Id);
472d1c5d313cd0c229cc614e74baa4c5756a4b46f4Argyrios Kyrtzidis}
482d1c5d313cd0c229cc614e74baa4c5756a4b46f4Argyrios Kyrtzidis
49d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenekvoid NamespaceDecl::Destroy(ASTContext& C) {
50d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenek  // NamespaceDecl uses "NextDeclarator" to chain namespace declarations
51d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenek  // together. They are all top-level Decls.
52d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenek
53ebf27b1831e6c4d7f4bc30e111a4d6340ff690d1Ted Kremenek  this->~NamespaceDecl();
543e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff  C.Deallocate((void *)this);
55d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenek}
56d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenek
57d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenek
584111024be81e7c0525e42dadcc126d27e5bf2425Chris LattnerImplicitParamDecl *ImplicitParamDecl::Create(ASTContext &C, DeclContext *DC,
594afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor    SourceLocation L, IdentifierInfo *Id, QualType T) {
603e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff  return new (C) ImplicitParamDecl(ImplicitParam, DC, L, Id, T);
614111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner}
624111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner
639fdf9c6d3530bb85f3166e6460d841e2ff8e1a2cChris LattnerParmVarDecl *ParmVarDecl::Create(ASTContext &C, DeclContext *DC,
640ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner                                 SourceLocation L, IdentifierInfo *Id,
650ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner                                 QualType T, StorageClass S,
664afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor                                 Expr *DefArg) {
673e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff  return new (C) ParmVarDecl(ParmVar, DC, L, Id, T, S, DefArg);
684306d3cb9116605728252e2738df24b9f6ab53c3Fariborz Jahanian}
694306d3cb9116605728252e2738df24b9f6ab53c3Fariborz Jahanian
704306d3cb9116605728252e2738df24b9f6ab53c3Fariborz JahanianQualType ParmVarDecl::getOriginalType() const {
7164650af7cc4352c6c67b9bd1bf8ef3ce7471b910Douglas Gregor  if (const OriginalParmVarDecl *PVD =
7264650af7cc4352c6c67b9bd1bf8ef3ce7471b910Douglas Gregor      dyn_cast<OriginalParmVarDecl>(this))
734306d3cb9116605728252e2738df24b9f6ab53c3Fariborz Jahanian    return PVD->OriginalType;
744306d3cb9116605728252e2738df24b9f6ab53c3Fariborz Jahanian  return getType();
759e151e154780e9cd443336143af1e996d1f387e5Chris Lattner}
769e151e154780e9cd443336143af1e996d1f387e5Chris Lattner
776393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregorbool VarDecl::isExternC(ASTContext &Context) const {
786393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor  if (!Context.getLangOptions().CPlusPlus)
796393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor    return (getDeclContext()->isTranslationUnit() &&
806393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor            getStorageClass() != Static) ||
816393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor      (getDeclContext()->isFunctionOrMethod() && hasExternalStorage());
826393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor
836393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor  for (const DeclContext *DC = getDeclContext(); !DC->isTranslationUnit();
846393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor       DC = DC->getParent()) {
856393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor    if (const LinkageSpecDecl *Linkage = dyn_cast<LinkageSpecDecl>(DC))  {
866393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor      if (Linkage->getLanguage() == LinkageSpecDecl::lang_c)
876393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor        return getStorageClass() != Static;
886393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor
896393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor      break;
906393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor    }
916393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor
926393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor    if (DC->isFunctionOrMethod())
936393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor      return false;
946393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor  }
956393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor
966393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor  return false;
976393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor}
986393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor
9964650af7cc4352c6c67b9bd1bf8ef3ce7471b910Douglas GregorOriginalParmVarDecl *OriginalParmVarDecl::Create(
10073da9e462576faedc2cdf96b37a1c072b404b73dFariborz Jahanian                                 ASTContext &C, DeclContext *DC,
10173da9e462576faedc2cdf96b37a1c072b404b73dFariborz Jahanian                                 SourceLocation L, IdentifierInfo *Id,
10273da9e462576faedc2cdf96b37a1c072b404b73dFariborz Jahanian                                 QualType T, QualType OT, StorageClass S,
1034afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor                                 Expr *DefArg) {
10464650af7cc4352c6c67b9bd1bf8ef3ce7471b910Douglas Gregor  return new (C) OriginalParmVarDecl(DC, L, Id, T, OT, S, DefArg);
10573da9e462576faedc2cdf96b37a1c072b404b73dFariborz Jahanian}
10673da9e462576faedc2cdf96b37a1c072b404b73dFariborz Jahanian
1079fdf9c6d3530bb85f3166e6460d841e2ff8e1a2cChris LattnerFunctionDecl *FunctionDecl::Create(ASTContext &C, DeclContext *DC,
1080ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner                                   SourceLocation L,
10910bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor                                   DeclarationName N, QualType T,
110a98e58ddb4696a0020fe97439d5295413f9e90b1Chris Lattner                                   StorageClass S, bool isInline,
1112224f84658fb9b3725a31f2680edb64ae73bf705Douglas Gregor                                   bool hasPrototype,
1120eb07bfde0deedcb35cf3d118b3488f5d8db32ecSteve Naroff                                   SourceLocation TypeSpecStartLoc) {
1132224f84658fb9b3725a31f2680edb64ae73bf705Douglas Gregor  FunctionDecl *New
1142224f84658fb9b3725a31f2680edb64ae73bf705Douglas Gregor    = new (C) FunctionDecl(Function, DC, L, N, T, S, isInline,
1152224f84658fb9b3725a31f2680edb64ae73bf705Douglas Gregor                           TypeSpecStartLoc);
1162224f84658fb9b3725a31f2680edb64ae73bf705Douglas Gregor  New->HasPrototype = hasPrototype;
1172224f84658fb9b3725a31f2680edb64ae73bf705Douglas Gregor  return New;
118a98e58ddb4696a0020fe97439d5295413f9e90b1Chris Lattner}
119a98e58ddb4696a0020fe97439d5295413f9e90b1Chris Lattner
120090276f5e164d491a1bb3f541bafdb394f5e6f04Steve NaroffBlockDecl *BlockDecl::Create(ASTContext &C, DeclContext *DC, SourceLocation L) {
1213e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff  return new (C) BlockDecl(DC, L);
12256ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff}
12356ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff
12444b4321feab46299d3f5cfd404680884752a0fcfDouglas GregorFieldDecl *FieldDecl::Create(ASTContext &C, DeclContext *DC, SourceLocation L,
12544b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor                             IdentifierInfo *Id, QualType T, Expr *BW,
1264afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor                             bool Mutable) {
1273e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff  return new (C) FieldDecl(Decl::Field, DC, L, Id, T, BW, Mutable);
1288e25d8681822d8094bfeb97b2239363552548171Chris Lattner}
1298e25d8681822d8094bfeb97b2239363552548171Chris Lattner
1306b3945f4bc757bdadd3e443180cf32c2cccb52a0Douglas Gregorbool FieldDecl::isAnonymousStructOrUnion() const {
1316b3945f4bc757bdadd3e443180cf32c2cccb52a0Douglas Gregor  if (!isImplicit() || getDeclName())
1326b3945f4bc757bdadd3e443180cf32c2cccb52a0Douglas Gregor    return false;
1336b3945f4bc757bdadd3e443180cf32c2cccb52a0Douglas Gregor
1346b3945f4bc757bdadd3e443180cf32c2cccb52a0Douglas Gregor  if (const RecordType *Record = getType()->getAsRecordType())
1356b3945f4bc757bdadd3e443180cf32c2cccb52a0Douglas Gregor    return Record->getDecl()->isAnonymousStructOrUnion();
1366b3945f4bc757bdadd3e443180cf32c2cccb52a0Douglas Gregor
1376b3945f4bc757bdadd3e443180cf32c2cccb52a0Douglas Gregor  return false;
1386b3945f4bc757bdadd3e443180cf32c2cccb52a0Douglas Gregor}
139a98e58ddb4696a0020fe97439d5295413f9e90b1Chris Lattner
1400ed844b04ea4387caa4e1cf3dc375d269657536bChris LattnerEnumConstantDecl *EnumConstantDecl::Create(ASTContext &C, EnumDecl *CD,
1410ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner                                           SourceLocation L,
142c63e660882ff93841fa234d70ef6757038302b92Chris Lattner                                           IdentifierInfo *Id, QualType T,
1434afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor                                           Expr *E, const llvm::APSInt &V) {
1443e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff  return new (C) EnumConstantDecl(CD, L, Id, T, E, V);
1456c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner}
1466c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner
147d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenekvoid EnumConstantDecl::Destroy(ASTContext& C) {
148d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenek  if (Init) Init->Destroy(C);
149d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenek  Decl::Destroy(C);
150d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenek}
151d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenek
1529fdf9c6d3530bb85f3166e6460d841e2ff8e1a2cChris LattnerTypedefDecl *TypedefDecl::Create(ASTContext &C, DeclContext *DC,
1530ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner                                 SourceLocation L,
1544afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor                                 IdentifierInfo *Id, QualType T) {
1553e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff  return new (C) TypedefDecl(DC, L, Id, T);
1566c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner}
1576c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner
1589fdf9c6d3530bb85f3166e6460d841e2ff8e1a2cChris LattnerEnumDecl *EnumDecl::Create(ASTContext &C, DeclContext *DC, SourceLocation L,
1590ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner                           IdentifierInfo *Id,
1607df7b6bb800e1987951285ea192e4f347e1b603aDouglas Gregor                           EnumDecl *PrevDecl) {
161c0ac4923f08b25ae973a8ee7942cf3eb89da57b7Steve Naroff  EnumDecl *Enum = new (C) EnumDecl(DC, L, Id);
1627df7b6bb800e1987951285ea192e4f347e1b603aDouglas Gregor  C.getTypeDeclType(Enum, PrevDecl);
1637df7b6bb800e1987951285ea192e4f347e1b603aDouglas Gregor  return Enum;
1646c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner}
1656c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner
166df91eca19bd9738abd9a3b84791f39750e27ad36Ted Kremenekvoid EnumDecl::Destroy(ASTContext& C) {
167df91eca19bd9738abd9a3b84791f39750e27ad36Ted Kremenek  Decl::Destroy(C);
168df91eca19bd9738abd9a3b84791f39750e27ad36Ted Kremenek}
169df91eca19bd9738abd9a3b84791f39750e27ad36Ted Kremenek
17044b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregorvoid EnumDecl::completeDefinition(ASTContext &C, QualType NewType) {
17144b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor  assert(!isDefinition() && "Cannot redefine enums!");
17244b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor  IntegerType = NewType;
1730b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregor  TagDecl::completeDefinition();
17444b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor}
17544b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor
1764afa39deaa245592977136d367251ee2c173dd8dDouglas GregorFileScopeAsmDecl *FileScopeAsmDecl::Create(ASTContext &C, DeclContext *DC,
1770ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner                                           SourceLocation L,
1788e25d8681822d8094bfeb97b2239363552548171Chris Lattner                                           StringLiteral *Str) {
1793e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff  return new (C) FileScopeAsmDecl(DC, L, Str);
1808e25d8681822d8094bfeb97b2239363552548171Chris Lattner}
1818e25d8681822d8094bfeb97b2239363552548171Chris Lattner
1826c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner//===----------------------------------------------------------------------===//
1834afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor// NamedDecl Implementation
1845239304ff761b8b03eefb772bd5d830a9b9f1aeaArgyrios Kyrtzidis//===----------------------------------------------------------------------===//
1855239304ff761b8b03eefb772bd5d830a9b9f1aeaArgyrios Kyrtzidis
18647b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregorstd::string NamedDecl::getQualifiedNameAsString() const {
18747b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor  std::vector<std::string> Names;
18847b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor  std::string QualName;
18947b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor  const DeclContext *Ctx = getDeclContext();
19047b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor
19147b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor  if (Ctx->isFunctionOrMethod())
19247b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor    return getNameAsString();
19347b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor
19447b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor  while (Ctx) {
19547b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor    if (Ctx->isFunctionOrMethod())
19647b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor      // FIXME: That probably will happen, when D was member of local
19747b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor      // scope class/struct/union. How do we handle this case?
19847b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor      break;
19947b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor
20047b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor    if (const NamedDecl *ND = dyn_cast<NamedDecl>(Ctx))
20147b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor      Names.push_back(ND->getNameAsString());
20247b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor    else
20347b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor      break;
20447b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor
20547b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor    Ctx = Ctx->getParent();
20647b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor  }
20747b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor
20847b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor  std::vector<std::string>::reverse_iterator
20947b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor    I = Names.rbegin(),
21047b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor    End = Names.rend();
21147b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor
21247b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor  for (; I!=End; ++I)
21347b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor    QualName += *I + "::";
21447b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor
21547b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor  QualName += getNameAsString();
21647b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor
21747b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor  return QualName;
21847b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor}
21947b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor
22047b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor
2214afa39deaa245592977136d367251ee2c173dd8dDouglas Gregorbool NamedDecl::declarationReplaces(NamedDecl *OldD) const {
2226ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor  assert(getDeclName() == OldD->getDeclName() && "Declaration name mismatch");
2236ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor
2242a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor  // UsingDirectiveDecl's are not really NamedDecl's, and all have same name.
2252a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor  // We want to keep it, unless it nominates same namespace.
2262a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor  if (getKind() == Decl::UsingDirective) {
2272a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor    return cast<UsingDirectiveDecl>(this)->getNominatedNamespace() ==
2282a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor           cast<UsingDirectiveDecl>(OldD)->getNominatedNamespace();
2292a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor  }
2302a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor
2316ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor  if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(this))
2326ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor    // For function declarations, we keep track of redeclarations.
2336ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor    return FD->getPreviousDeclaration() == OldD;
2346ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor
2350de21fd85d79bccd32f04256f5b3328ab5ed7c95Steve Naroff  // For method declarations, we keep track of redeclarations.
2360de21fd85d79bccd32f04256f5b3328ab5ed7c95Steve Naroff  if (isa<ObjCMethodDecl>(this))
2370de21fd85d79bccd32f04256f5b3328ab5ed7c95Steve Naroff    return false;
2380de21fd85d79bccd32f04256f5b3328ab5ed7c95Steve Naroff
2396ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor  // For non-function declarations, if the declarations are of the
2406ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor  // same kind then this must be a redeclaration, or semantic analysis
2416ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor  // would not have given us the new declaration.
2426ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor  return this->getKind() == OldD->getKind();
2436ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor}
2446ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor
245d6f7e9dccd0fa8a5a15d7478324c0ae229fc5e1eDouglas Gregorbool NamedDecl::hasLinkage() const {
246d6f7e9dccd0fa8a5a15d7478324c0ae229fc5e1eDouglas Gregor  if (const VarDecl *VD = dyn_cast<VarDecl>(this))
247d6f7e9dccd0fa8a5a15d7478324c0ae229fc5e1eDouglas Gregor    return VD->hasExternalStorage() || VD->isFileVarDecl();
248d6f7e9dccd0fa8a5a15d7478324c0ae229fc5e1eDouglas Gregor
249d6f7e9dccd0fa8a5a15d7478324c0ae229fc5e1eDouglas Gregor  if (isa<FunctionDecl>(this) && !isa<CXXMethodDecl>(this))
250d6f7e9dccd0fa8a5a15d7478324c0ae229fc5e1eDouglas Gregor    return true;
251d6f7e9dccd0fa8a5a15d7478324c0ae229fc5e1eDouglas Gregor
252d6f7e9dccd0fa8a5a15d7478324c0ae229fc5e1eDouglas Gregor  return false;
253d6f7e9dccd0fa8a5a15d7478324c0ae229fc5e1eDouglas Gregor}
2544afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor
2555239304ff761b8b03eefb772bd5d830a9b9f1aeaArgyrios Kyrtzidis//===----------------------------------------------------------------------===//
25699f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes// VarDecl Implementation
25799f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes//===----------------------------------------------------------------------===//
25899f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes
2594afa39deaa245592977136d367251ee2c173dd8dDouglas GregorVarDecl *VarDecl::Create(ASTContext &C, DeclContext *DC, SourceLocation L,
2604afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor                         IdentifierInfo *Id, QualType T, StorageClass S,
26199f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes                         SourceLocation TypeSpecStartLoc) {
2623e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff  return new (C) VarDecl(Var, DC, L, Id, T, S, TypeSpecStartLoc);
26399f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes}
26499f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes
26599f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopesvoid VarDecl::Destroy(ASTContext& C) {
266df2d3cf2be8b91e1e21234ff5a3aa4f820e7001aSebastian Redl  Expr *Init = getInit();
267df2d3cf2be8b91e1e21234ff5a3aa4f820e7001aSebastian Redl  if (Init)
268df2d3cf2be8b91e1e21234ff5a3aa4f820e7001aSebastian Redl    Init->Destroy(C);
26999f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes  this->~VarDecl();
2703e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff  C.Deallocate((void *)this);
27199f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes}
27299f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes
27399f06ba988922ea721035a89e6d3c66ba100ba8aNuno LopesVarDecl::~VarDecl() {
27499f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes}
27599f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes
276275a369f003f25bd22c00c1c0fc0251c7208caf4Douglas Gregorbool VarDecl::isTentativeDefinition(ASTContext &Context) const {
277275a369f003f25bd22c00c1c0fc0251c7208caf4Douglas Gregor  if (!isFileVarDecl() || Context.getLangOptions().CPlusPlus)
278275a369f003f25bd22c00c1c0fc0251c7208caf4Douglas Gregor    return false;
279275a369f003f25bd22c00c1c0fc0251c7208caf4Douglas Gregor
280275a369f003f25bd22c00c1c0fc0251c7208caf4Douglas Gregor  return (!getInit() &&
281275a369f003f25bd22c00c1c0fc0251c7208caf4Douglas Gregor          (getStorageClass() == None || getStorageClass() == Static));
282275a369f003f25bd22c00c1c0fc0251c7208caf4Douglas Gregor}
283275a369f003f25bd22c00c1c0fc0251c7208caf4Douglas Gregor
284082d936a5b8323ac2c04558d8bca277a647831a3Ted Kremenekconst Expr *VarDecl::getDefinition(const VarDecl *&Def) const {
285275a369f003f25bd22c00c1c0fc0251c7208caf4Douglas Gregor  Def = this;
286275a369f003f25bd22c00c1c0fc0251c7208caf4Douglas Gregor  while (Def && !Def->getInit())
287275a369f003f25bd22c00c1c0fc0251c7208caf4Douglas Gregor    Def = Def->getPreviousDeclaration();
288275a369f003f25bd22c00c1c0fc0251c7208caf4Douglas Gregor
289275a369f003f25bd22c00c1c0fc0251c7208caf4Douglas Gregor  return Def? Def->getInit() : 0;
290275a369f003f25bd22c00c1c0fc0251c7208caf4Douglas Gregor}
291275a369f003f25bd22c00c1c0fc0251c7208caf4Douglas Gregor
29299f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes//===----------------------------------------------------------------------===//
2938a934233d1582b5bde9d270bc0705aa81e471a79Chris Lattner// FunctionDecl Implementation
2948a934233d1582b5bde9d270bc0705aa81e471a79Chris Lattner//===----------------------------------------------------------------------===//
2958a934233d1582b5bde9d270bc0705aa81e471a79Chris Lattner
29627f8a28bee33bb0e857cfe1a61c281bbc234b338Ted Kremenekvoid FunctionDecl::Destroy(ASTContext& C) {
297b65cf41707d190d5ce3d48b9e5bd2dc9d7b4a4c0Ted Kremenek  if (Body)
298b65cf41707d190d5ce3d48b9e5bd2dc9d7b4a4c0Ted Kremenek    Body->Destroy(C);
299b65cf41707d190d5ce3d48b9e5bd2dc9d7b4a4c0Ted Kremenek
300b65cf41707d190d5ce3d48b9e5bd2dc9d7b4a4c0Ted Kremenek  for (param_iterator I=param_begin(), E=param_end(); I!=E; ++I)
301b65cf41707d190d5ce3d48b9e5bd2dc9d7b4a4c0Ted Kremenek    (*I)->Destroy(C);
302460b0ac80382fa73337d21dd052c1f18b27435d8Nuno Lopes
3033e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff  C.Deallocate(ParamInfo);
304460b0ac80382fa73337d21dd052c1f18b27435d8Nuno Lopes
30527f8a28bee33bb0e857cfe1a61c281bbc234b338Ted Kremenek  Decl::Destroy(C);
30627f8a28bee33bb0e857cfe1a61c281bbc234b338Ted Kremenek}
30727f8a28bee33bb0e857cfe1a61c281bbc234b338Ted Kremenek
30827f8a28bee33bb0e857cfe1a61c281bbc234b338Ted Kremenek
309eaab20669b6a9910a5deb0110fdd8f7581d86a36Ted KremenekCompoundStmt *FunctionDecl::getBody(const FunctionDecl *&Definition) const {
310f009795057dc8ca254f5618c80a0a90f07cd44b4Douglas Gregor  for (const FunctionDecl *FD = this; FD != 0; FD = FD->PreviousDeclaration) {
311f009795057dc8ca254f5618c80a0a90f07cd44b4Douglas Gregor    if (FD->Body) {
312f009795057dc8ca254f5618c80a0a90f07cd44b4Douglas Gregor      Definition = FD;
313eaab20669b6a9910a5deb0110fdd8f7581d86a36Ted Kremenek      return cast<CompoundStmt>(FD->Body);
314f009795057dc8ca254f5618c80a0a90f07cd44b4Douglas Gregor    }
315f009795057dc8ca254f5618c80a0a90f07cd44b4Douglas Gregor  }
316f009795057dc8ca254f5618c80a0a90f07cd44b4Douglas Gregor
317f009795057dc8ca254f5618c80a0a90f07cd44b4Douglas Gregor  return 0;
3185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
3195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
32004495c859f81e440748a9b86baa2913461652bb0Douglas Gregorbool FunctionDecl::isMain() const {
32104495c859f81e440748a9b86baa2913461652bb0Douglas Gregor  return getDeclContext()->getLookupContext()->isTranslationUnit() &&
32204495c859f81e440748a9b86baa2913461652bb0Douglas Gregor    getIdentifier() && getIdentifier()->isStr("main");
32304495c859f81e440748a9b86baa2913461652bb0Douglas Gregor}
32404495c859f81e440748a9b86baa2913461652bb0Douglas Gregor
3256393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregorbool FunctionDecl::isExternC(ASTContext &Context) const {
3266393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor  // In C, any non-static, non-overloadable function has external
3276393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor  // linkage.
3286393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor  if (!Context.getLangOptions().CPlusPlus)
3296393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor    return getStorageClass() != Static && !getAttr<OverloadableAttr>();
3306393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor
3316393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor  for (const DeclContext *DC = getDeclContext(); !DC->isTranslationUnit();
3326393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor       DC = DC->getParent()) {
3336393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor    if (const LinkageSpecDecl *Linkage = dyn_cast<LinkageSpecDecl>(DC))  {
3346393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor      if (Linkage->getLanguage() == LinkageSpecDecl::lang_c)
3356393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor        return getStorageClass() != Static && !getAttr<OverloadableAttr>();
3366393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor
3376393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor      break;
3386393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor    }
3396393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor  }
3406393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor
3416393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor  return false;
3426393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor}
3436393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor
3443e41d60eb627dc227c770f1c1c87d06909cf05fdDouglas Gregor/// \brief Returns a value indicating whether this function
3453e41d60eb627dc227c770f1c1c87d06909cf05fdDouglas Gregor/// corresponds to a builtin function.
3463e41d60eb627dc227c770f1c1c87d06909cf05fdDouglas Gregor///
3473e41d60eb627dc227c770f1c1c87d06909cf05fdDouglas Gregor/// The function corresponds to a built-in function if it is
3483e41d60eb627dc227c770f1c1c87d06909cf05fdDouglas Gregor/// declared at translation scope or within an extern "C" block and
3493e41d60eb627dc227c770f1c1c87d06909cf05fdDouglas Gregor/// its name matches with the name of a builtin. The returned value
3503e41d60eb627dc227c770f1c1c87d06909cf05fdDouglas Gregor/// will be 0 for functions that do not correspond to a builtin, a
3513e41d60eb627dc227c770f1c1c87d06909cf05fdDouglas Gregor/// value of type \c Builtin::ID if in the target-independent range
3523e41d60eb627dc227c770f1c1c87d06909cf05fdDouglas Gregor/// \c [1,Builtin::First), or a target-specific builtin value.
3533c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregorunsigned FunctionDecl::getBuiltinID(ASTContext &Context) const {
3543c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor  if (!getIdentifier() || !getIdentifier()->getBuiltinID())
3553c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor    return 0;
3563c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor
3573c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor  unsigned BuiltinID = getIdentifier()->getBuiltinID();
3583c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor  if (!Context.BuiltinInfo.isPredefinedLibFunction(BuiltinID))
3593c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor    return BuiltinID;
3603c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor
3613c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor  // This function has the name of a known C library
3623c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor  // function. Determine whether it actually refers to the C library
3633c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor  // function or whether it just has the same name.
3643c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor
3659add31798f621f843233dbff8bba103fca64447bDouglas Gregor  // If this is a static function, it's not a builtin.
3669add31798f621f843233dbff8bba103fca64447bDouglas Gregor  if (getStorageClass() == Static)
3679add31798f621f843233dbff8bba103fca64447bDouglas Gregor    return 0;
3689add31798f621f843233dbff8bba103fca64447bDouglas Gregor
3693c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor  // If this function is at translation-unit scope and we're not in
3703c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor  // C++, it refers to the C library function.
3713c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor  if (!Context.getLangOptions().CPlusPlus &&
3723c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor      getDeclContext()->isTranslationUnit())
3733c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor    return BuiltinID;
3743c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor
3753c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor  // If the function is in an extern "C" linkage specification and is
3763c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor  // not marked "overloadable", it's the real function.
3773c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor  if (isa<LinkageSpecDecl>(getDeclContext()) &&
3783c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor      cast<LinkageSpecDecl>(getDeclContext())->getLanguage()
3793c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor        == LinkageSpecDecl::lang_c &&
3803c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor      !getAttr<OverloadableAttr>())
3813c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor    return BuiltinID;
3823c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor
3833c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor  // Not a builtin
3843e41d60eb627dc227c770f1c1c87d06909cf05fdDouglas Gregor  return 0;
3853e41d60eb627dc227c770f1c1c87d06909cf05fdDouglas Gregor}
3863e41d60eb627dc227c770f1c1c87d06909cf05fdDouglas Gregor
3873e41d60eb627dc227c770f1c1c87d06909cf05fdDouglas Gregor
3884f03fd61ee45245dd3a1552a023e730d56c2e697Ted Kremenek// Helper function for FunctionDecl::getNumParams and FunctionDecl::setParams()
3894f03fd61ee45245dd3a1552a023e730d56c2e697Ted Kremenekstatic unsigned getNumTypeParams(QualType T) {
3904f03fd61ee45245dd3a1552a023e730d56c2e697Ted Kremenek  const FunctionType *FT = T->getAsFunctionType();
39172564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor  if (isa<FunctionNoProtoType>(FT))
392d3b9065ec7052ec4741783d2fb4130d13c766933Chris Lattner    return 0;
39372564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor  return cast<FunctionProtoType>(FT)->getNumArgs();
3945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
3955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3964f03fd61ee45245dd3a1552a023e730d56c2e697Ted Kremenekunsigned FunctionDecl::getNumParams() const {
3974f03fd61ee45245dd3a1552a023e730d56c2e697Ted Kremenek  // Can happen if a FunctionDecl is declared using typeof(some_other_func) bar;
3984f03fd61ee45245dd3a1552a023e730d56c2e697Ted Kremenek  if (!ParamInfo)
3994f03fd61ee45245dd3a1552a023e730d56c2e697Ted Kremenek    return 0;
4004f03fd61ee45245dd3a1552a023e730d56c2e697Ted Kremenek
4014f03fd61ee45245dd3a1552a023e730d56c2e697Ted Kremenek  return getNumTypeParams(getType());
4024f03fd61ee45245dd3a1552a023e730d56c2e697Ted Kremenek}
4034f03fd61ee45245dd3a1552a023e730d56c2e697Ted Kremenek
404fc767615bc67d3a7587b1fb2e0494c32c9dbd7a5Ted Kremenekvoid FunctionDecl::setParams(ASTContext& C, ParmVarDecl **NewParamInfo,
405fc767615bc67d3a7587b1fb2e0494c32c9dbd7a5Ted Kremenek                             unsigned NumParams) {
4065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  assert(ParamInfo == 0 && "Already has param info!");
4074f03fd61ee45245dd3a1552a023e730d56c2e697Ted Kremenek  assert(NumParams == getNumTypeParams(getType()) &&
4084f03fd61ee45245dd3a1552a023e730d56c2e697Ted Kremenek         "Parameter count mismatch!");
4095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
4105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Zero params -> null pointer.
4115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (NumParams) {
412c0ac4923f08b25ae973a8ee7942cf3eb89da57b7Steve Naroff    void *Mem = C.Allocate(sizeof(ParmVarDecl*)*NumParams);
413fc767615bc67d3a7587b1fb2e0494c32c9dbd7a5Ted Kremenek    ParamInfo = new (Mem) ParmVarDecl*[NumParams];
4145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    memcpy(ParamInfo, NewParamInfo, sizeof(ParmVarDecl*)*NumParams);
4155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
4165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
4175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
4188123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner/// getMinRequiredArguments - Returns the minimum number of arguments
4198123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner/// needed to call this function. This may be fewer than the number of
4208123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner/// function parameters, if some of the parameters have default
4219e979557eea3875c9e3d100c68188233dd7f46c0Chris Lattner/// arguments (in C++).
4228123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattnerunsigned FunctionDecl::getMinRequiredArguments() const {
4238123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner  unsigned NumRequiredArgs = getNumParams();
4248123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner  while (NumRequiredArgs > 0
4258123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner         && getParamDecl(NumRequiredArgs-1)->getDefaultArg())
4268123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner    --NumRequiredArgs;
4278123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner
4288123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner  return NumRequiredArgs;
4298123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner}
4308123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner
4311cd1b1e987f5e2f060d7972b13d83239b36d77d6Douglas Gregor/// getOverloadedOperator - Which C++ overloaded operator this
4321cd1b1e987f5e2f060d7972b13d83239b36d77d6Douglas Gregor/// function represents, if any.
4331cd1b1e987f5e2f060d7972b13d83239b36d77d6Douglas GregorOverloadedOperatorKind FunctionDecl::getOverloadedOperator() const {
434e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  if (getDeclName().getNameKind() == DeclarationName::CXXOperatorName)
435e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor    return getDeclName().getCXXOverloadedOperator();
4361cd1b1e987f5e2f060d7972b13d83239b36d77d6Douglas Gregor  else
4371cd1b1e987f5e2f060d7972b13d83239b36d77d6Douglas Gregor    return OO_None;
4381cd1b1e987f5e2f060d7972b13d83239b36d77d6Douglas Gregor}
4391cd1b1e987f5e2f060d7972b13d83239b36d77d6Douglas Gregor
4408a934233d1582b5bde9d270bc0705aa81e471a79Chris Lattner//===----------------------------------------------------------------------===//
441bcbffc46f1ad3796c4582fa1e3a9113b5aa26061Douglas Gregor// TagDecl Implementation
4424b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek//===----------------------------------------------------------------------===//
4434b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek
4440b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregorvoid TagDecl::startDefinition() {
445fc705b84347e6fb4746a1a7e26949f64c2f2f358Douglas Gregor  TagType *TagT = const_cast<TagType *>(TypeForDecl->getAsTagType());
446fc705b84347e6fb4746a1a7e26949f64c2f2f358Douglas Gregor  TagT->decl.setPointer(this);
447fc705b84347e6fb4746a1a7e26949f64c2f2f358Douglas Gregor  TagT->getAsTagType()->decl.setInt(1);
4480b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregor}
4490b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregor
4500b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregorvoid TagDecl::completeDefinition() {
4510b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregor  assert((!TypeForDecl ||
452fc705b84347e6fb4746a1a7e26949f64c2f2f358Douglas Gregor          TypeForDecl->getAsTagType()->decl.getPointer() == this) &&
4530b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregor         "Attempt to redefine a tag definition?");
4540b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregor  IsDefinition = true;
455fc705b84347e6fb4746a1a7e26949f64c2f2f358Douglas Gregor  TagType *TagT = const_cast<TagType *>(TypeForDecl->getAsTagType());
456fc705b84347e6fb4746a1a7e26949f64c2f2f358Douglas Gregor  TagT->decl.setPointer(this);
457fc705b84347e6fb4746a1a7e26949f64c2f2f358Douglas Gregor  TagT->decl.setInt(0);
4580b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregor}
4590b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregor
4604b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed KremenekTagDecl* TagDecl::getDefinition(ASTContext& C) const {
4614b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek  QualType T = C.getTypeDeclType(const_cast<TagDecl*>(this));
462fc705b84347e6fb4746a1a7e26949f64c2f2f358Douglas Gregor  TagDecl* D = cast<TagDecl>(T->getAsTagType()->getDecl());
4634b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek  return D->isDefinition() ? D : 0;
4644b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek}
4654b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek
4664b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek//===----------------------------------------------------------------------===//
4678a934233d1582b5bde9d270bc0705aa81e471a79Chris Lattner// RecordDecl Implementation
4688a934233d1582b5bde9d270bc0705aa81e471a79Chris Lattner//===----------------------------------------------------------------------===//
4695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
47035bc0821c4f80041724cd4c5c4889b2581546a41Argyrios KyrtzidisRecordDecl::RecordDecl(Kind DK, TagKind TK, DeclContext *DC, SourceLocation L,
471df042e6c2bf06b2d9ed53c52469599ac1bd93a3fTed Kremenek                       IdentifierInfo *Id)
4724afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor  : TagDecl(DK, TK, DC, L, Id) {
4736359792ca92e7ca2f416cb804c6604358174e994Ted Kremenek  HasFlexibleArrayMember = false;
474bcbffc46f1ad3796c4582fa1e3a9113b5aa26061Douglas Gregor  AnonymousStructOrUnion = false;
4756359792ca92e7ca2f416cb804c6604358174e994Ted Kremenek  assert(classof(static_cast<Decl*>(this)) && "Invalid Kind!");
4766359792ca92e7ca2f416cb804c6604358174e994Ted Kremenek}
4776359792ca92e7ca2f416cb804c6604358174e994Ted Kremenek
4786359792ca92e7ca2f416cb804c6604358174e994Ted KremenekRecordDecl *RecordDecl::Create(ASTContext &C, TagKind TK, DeclContext *DC,
4794b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek                               SourceLocation L, IdentifierInfo *Id,
4804b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek                               RecordDecl* PrevDecl) {
481df042e6c2bf06b2d9ed53c52469599ac1bd93a3fTed Kremenek
4823e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff  RecordDecl* R = new (C) RecordDecl(Record, TK, DC, L, Id);
4834b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek  C.getTypeDeclType(R, PrevDecl);
4844b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek  return R;
4856359792ca92e7ca2f416cb804c6604358174e994Ted Kremenek}
4866359792ca92e7ca2f416cb804c6604358174e994Ted Kremenek
487997b6c6d73541f010afc81e28191c8eae7b24f77Argyrios KyrtzidisRecordDecl::~RecordDecl() {
488997b6c6d73541f010afc81e28191c8eae7b24f77Argyrios Kyrtzidis}
489997b6c6d73541f010afc81e28191c8eae7b24f77Argyrios Kyrtzidis
490997b6c6d73541f010afc81e28191c8eae7b24f77Argyrios Kyrtzidisvoid RecordDecl::Destroy(ASTContext& C) {
491997b6c6d73541f010afc81e28191c8eae7b24f77Argyrios Kyrtzidis  TagDecl::Destroy(C);
492997b6c6d73541f010afc81e28191c8eae7b24f77Argyrios Kyrtzidis}
493997b6c6d73541f010afc81e28191c8eae7b24f77Argyrios Kyrtzidis
49444b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor/// completeDefinition - Notes that the definition of this type is now
49544b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor/// complete.
49644b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregorvoid RecordDecl::completeDefinition(ASTContext& C) {
4975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  assert(!isDefinition() && "Cannot redefine record!");
4980b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregor  TagDecl::completeDefinition();
4995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
5005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
50156ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff//===----------------------------------------------------------------------===//
50256ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff// BlockDecl Implementation
50356ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff//===----------------------------------------------------------------------===//
50456ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff
50556ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve NaroffBlockDecl::~BlockDecl() {
50656ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff}
50756ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff
50856ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroffvoid BlockDecl::Destroy(ASTContext& C) {
50956ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff  if (Body)
51056ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff    Body->Destroy(C);
51156ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff
51256ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff  for (param_iterator I=param_begin(), E=param_end(); I!=E; ++I)
51356ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff    (*I)->Destroy(C);
514879d27ad4670716c7cea7f86274f6096f6868fe1Ted Kremenek
515879d27ad4670716c7cea7f86274f6096f6868fe1Ted Kremenek  C.Deallocate(ParamInfo);
51656ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff  Decl::Destroy(C);
51756ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff}
518e78b809bbcd92928a63da81f2cd843faad3e4dfdSteve Naroff
519e78b809bbcd92928a63da81f2cd843faad3e4dfdSteve Naroffvoid BlockDecl::setParams(ASTContext& C, ParmVarDecl **NewParamInfo,
520e78b809bbcd92928a63da81f2cd843faad3e4dfdSteve Naroff                          unsigned NParms) {
521e78b809bbcd92928a63da81f2cd843faad3e4dfdSteve Naroff  assert(ParamInfo == 0 && "Already has param info!");
522e78b809bbcd92928a63da81f2cd843faad3e4dfdSteve Naroff
523e78b809bbcd92928a63da81f2cd843faad3e4dfdSteve Naroff  // Zero params -> null pointer.
524e78b809bbcd92928a63da81f2cd843faad3e4dfdSteve Naroff  if (NParms) {
525e78b809bbcd92928a63da81f2cd843faad3e4dfdSteve Naroff    NumParams = NParms;
526e78b809bbcd92928a63da81f2cd843faad3e4dfdSteve Naroff    void *Mem = C.Allocate(sizeof(ParmVarDecl*)*NumParams);
527e78b809bbcd92928a63da81f2cd843faad3e4dfdSteve Naroff    ParamInfo = new (Mem) ParmVarDecl*[NumParams];
528e78b809bbcd92928a63da81f2cd843faad3e4dfdSteve Naroff    memcpy(ParamInfo, NewParamInfo, sizeof(ParmVarDecl*)*NumParams);
529e78b809bbcd92928a63da81f2cd843faad3e4dfdSteve Naroff  }
530e78b809bbcd92928a63da81f2cd843faad3e4dfdSteve Naroff}
531e78b809bbcd92928a63da81f2cd843faad3e4dfdSteve Naroff
532e78b809bbcd92928a63da81f2cd843faad3e4dfdSteve Naroffunsigned BlockDecl::getNumParams() const {
533e78b809bbcd92928a63da81f2cd843faad3e4dfdSteve Naroff  return NumParams;
534e78b809bbcd92928a63da81f2cd843faad3e4dfdSteve Naroff}
535