Decl.cpp revision 9add31798f621f843233dbff8bba103fca64447b
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"
166c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner#include "clang/AST/ASTContext.h"
17e91593ef084479340582b2ba177b44be50a717b7Daniel Dunbar#include "clang/AST/Stmt.h"
1899f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes#include "clang/AST/Expr.h"
19e91593ef084479340582b2ba177b44be50a717b7Daniel Dunbar#include "clang/Basic/IdentifierTable.h"
2047b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor#include <vector>
2127f8a28bee33bb0e857cfe1a61c281bbc234b338Ted Kremenek
225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerusing namespace clang;
235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
24d3b9065ec7052ec4741783d2fb4130d13c766933Chris Lattner//===----------------------------------------------------------------------===//
256c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner// Decl Allocation/Deallocation Method Implementations
266c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner//===----------------------------------------------------------------------===//
272d1c5d313cd0c229cc614e74baa4c5756a4b46f4Argyrios Kyrtzidis
28ef177820100ab583b08fd3056e2a5a52ee4b1629Argyrios KyrtzidisTranslationUnitDecl *TranslationUnitDecl::Create(ASTContext &C) {
293e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff  return new (C) TranslationUnitDecl();
30ef177820100ab583b08fd3056e2a5a52ee4b1629Argyrios Kyrtzidis}
31ef177820100ab583b08fd3056e2a5a52ee4b1629Argyrios Kyrtzidis
322d1c5d313cd0c229cc614e74baa4c5756a4b46f4Argyrios KyrtzidisNamespaceDecl *NamespaceDecl::Create(ASTContext &C, DeclContext *DC,
332d1c5d313cd0c229cc614e74baa4c5756a4b46f4Argyrios Kyrtzidis                                     SourceLocation L, IdentifierInfo *Id) {
343e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff  return new (C) NamespaceDecl(DC, L, Id);
352d1c5d313cd0c229cc614e74baa4c5756a4b46f4Argyrios Kyrtzidis}
362d1c5d313cd0c229cc614e74baa4c5756a4b46f4Argyrios Kyrtzidis
37d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenekvoid NamespaceDecl::Destroy(ASTContext& C) {
38d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenek  // NamespaceDecl uses "NextDeclarator" to chain namespace declarations
39d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenek  // together. They are all top-level Decls.
40d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenek
41ebf27b1831e6c4d7f4bc30e111a4d6340ff690d1Ted Kremenek  this->~NamespaceDecl();
423e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff  C.Deallocate((void *)this);
43d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenek}
44d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenek
45d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenek
464111024be81e7c0525e42dadcc126d27e5bf2425Chris LattnerImplicitParamDecl *ImplicitParamDecl::Create(ASTContext &C, DeclContext *DC,
474afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor    SourceLocation L, IdentifierInfo *Id, QualType T) {
483e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff  return new (C) ImplicitParamDecl(ImplicitParam, DC, L, Id, T);
494111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner}
504111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner
519fdf9c6d3530bb85f3166e6460d841e2ff8e1a2cChris LattnerParmVarDecl *ParmVarDecl::Create(ASTContext &C, DeclContext *DC,
520ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner                                 SourceLocation L, IdentifierInfo *Id,
530ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner                                 QualType T, StorageClass S,
544afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor                                 Expr *DefArg) {
553e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff  return new (C) ParmVarDecl(ParmVar, DC, L, Id, T, S, DefArg);
564306d3cb9116605728252e2738df24b9f6ab53c3Fariborz Jahanian}
574306d3cb9116605728252e2738df24b9f6ab53c3Fariborz Jahanian
584306d3cb9116605728252e2738df24b9f6ab53c3Fariborz JahanianQualType ParmVarDecl::getOriginalType() const {
5964650af7cc4352c6c67b9bd1bf8ef3ce7471b910Douglas Gregor  if (const OriginalParmVarDecl *PVD =
6064650af7cc4352c6c67b9bd1bf8ef3ce7471b910Douglas Gregor      dyn_cast<OriginalParmVarDecl>(this))
614306d3cb9116605728252e2738df24b9f6ab53c3Fariborz Jahanian    return PVD->OriginalType;
624306d3cb9116605728252e2738df24b9f6ab53c3Fariborz Jahanian  return getType();
639e151e154780e9cd443336143af1e996d1f387e5Chris Lattner}
649e151e154780e9cd443336143af1e996d1f387e5Chris Lattner
6564650af7cc4352c6c67b9bd1bf8ef3ce7471b910Douglas GregorOriginalParmVarDecl *OriginalParmVarDecl::Create(
6673da9e462576faedc2cdf96b37a1c072b404b73dFariborz Jahanian                                 ASTContext &C, DeclContext *DC,
6773da9e462576faedc2cdf96b37a1c072b404b73dFariborz Jahanian                                 SourceLocation L, IdentifierInfo *Id,
6873da9e462576faedc2cdf96b37a1c072b404b73dFariborz Jahanian                                 QualType T, QualType OT, StorageClass S,
694afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor                                 Expr *DefArg) {
7064650af7cc4352c6c67b9bd1bf8ef3ce7471b910Douglas Gregor  return new (C) OriginalParmVarDecl(DC, L, Id, T, OT, S, DefArg);
7173da9e462576faedc2cdf96b37a1c072b404b73dFariborz Jahanian}
7273da9e462576faedc2cdf96b37a1c072b404b73dFariborz Jahanian
739fdf9c6d3530bb85f3166e6460d841e2ff8e1a2cChris LattnerFunctionDecl *FunctionDecl::Create(ASTContext &C, DeclContext *DC,
740ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner                                   SourceLocation L,
7510bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor                                   DeclarationName N, QualType T,
76a98e58ddb4696a0020fe97439d5295413f9e90b1Chris Lattner                                   StorageClass S, bool isInline,
770eb07bfde0deedcb35cf3d118b3488f5d8db32ecSteve Naroff                                   SourceLocation TypeSpecStartLoc) {
783e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff  return new (C) FunctionDecl(Function, DC, L, N, T, S, isInline,
790eb07bfde0deedcb35cf3d118b3488f5d8db32ecSteve Naroff                                TypeSpecStartLoc);
80a98e58ddb4696a0020fe97439d5295413f9e90b1Chris Lattner}
81a98e58ddb4696a0020fe97439d5295413f9e90b1Chris Lattner
82090276f5e164d491a1bb3f541bafdb394f5e6f04Steve NaroffBlockDecl *BlockDecl::Create(ASTContext &C, DeclContext *DC, SourceLocation L) {
833e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff  return new (C) BlockDecl(DC, L);
8456ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff}
8556ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff
8644b4321feab46299d3f5cfd404680884752a0fcfDouglas GregorFieldDecl *FieldDecl::Create(ASTContext &C, DeclContext *DC, SourceLocation L,
8744b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor                             IdentifierInfo *Id, QualType T, Expr *BW,
884afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor                             bool Mutable) {
893e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff  return new (C) FieldDecl(Decl::Field, DC, L, Id, T, BW, Mutable);
908e25d8681822d8094bfeb97b2239363552548171Chris Lattner}
918e25d8681822d8094bfeb97b2239363552548171Chris Lattner
926b3945f4bc757bdadd3e443180cf32c2cccb52a0Douglas Gregorbool FieldDecl::isAnonymousStructOrUnion() const {
936b3945f4bc757bdadd3e443180cf32c2cccb52a0Douglas Gregor  if (!isImplicit() || getDeclName())
946b3945f4bc757bdadd3e443180cf32c2cccb52a0Douglas Gregor    return false;
956b3945f4bc757bdadd3e443180cf32c2cccb52a0Douglas Gregor
966b3945f4bc757bdadd3e443180cf32c2cccb52a0Douglas Gregor  if (const RecordType *Record = getType()->getAsRecordType())
976b3945f4bc757bdadd3e443180cf32c2cccb52a0Douglas Gregor    return Record->getDecl()->isAnonymousStructOrUnion();
986b3945f4bc757bdadd3e443180cf32c2cccb52a0Douglas Gregor
996b3945f4bc757bdadd3e443180cf32c2cccb52a0Douglas Gregor  return false;
1006b3945f4bc757bdadd3e443180cf32c2cccb52a0Douglas Gregor}
101a98e58ddb4696a0020fe97439d5295413f9e90b1Chris Lattner
1020ed844b04ea4387caa4e1cf3dc375d269657536bChris LattnerEnumConstantDecl *EnumConstantDecl::Create(ASTContext &C, EnumDecl *CD,
1030ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner                                           SourceLocation L,
104c63e660882ff93841fa234d70ef6757038302b92Chris Lattner                                           IdentifierInfo *Id, QualType T,
1054afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor                                           Expr *E, const llvm::APSInt &V) {
1063e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff  return new (C) EnumConstantDecl(CD, L, Id, T, E, V);
1076c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner}
1086c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner
109d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenekvoid EnumConstantDecl::Destroy(ASTContext& C) {
110d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenek  if (Init) Init->Destroy(C);
111d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenek  Decl::Destroy(C);
112d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenek}
113d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenek
1149fdf9c6d3530bb85f3166e6460d841e2ff8e1a2cChris LattnerTypedefDecl *TypedefDecl::Create(ASTContext &C, DeclContext *DC,
1150ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner                                 SourceLocation L,
1164afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor                                 IdentifierInfo *Id, QualType T) {
1173e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff  return new (C) TypedefDecl(DC, L, Id, T);
1186c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner}
1196c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner
1209fdf9c6d3530bb85f3166e6460d841e2ff8e1a2cChris LattnerEnumDecl *EnumDecl::Create(ASTContext &C, DeclContext *DC, SourceLocation L,
1210ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner                           IdentifierInfo *Id,
1227df7b6bb800e1987951285ea192e4f347e1b603aDouglas Gregor                           EnumDecl *PrevDecl) {
123c0ac4923f08b25ae973a8ee7942cf3eb89da57b7Steve Naroff  EnumDecl *Enum = new (C) EnumDecl(DC, L, Id);
1247df7b6bb800e1987951285ea192e4f347e1b603aDouglas Gregor  C.getTypeDeclType(Enum, PrevDecl);
1257df7b6bb800e1987951285ea192e4f347e1b603aDouglas Gregor  return Enum;
1266c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner}
1276c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner
128df91eca19bd9738abd9a3b84791f39750e27ad36Ted Kremenekvoid EnumDecl::Destroy(ASTContext& C) {
129df91eca19bd9738abd9a3b84791f39750e27ad36Ted Kremenek  Decl::Destroy(C);
130df91eca19bd9738abd9a3b84791f39750e27ad36Ted Kremenek}
131df91eca19bd9738abd9a3b84791f39750e27ad36Ted Kremenek
13244b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregorvoid EnumDecl::completeDefinition(ASTContext &C, QualType NewType) {
13344b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor  assert(!isDefinition() && "Cannot redefine enums!");
13444b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor  IntegerType = NewType;
1350b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregor  TagDecl::completeDefinition();
13644b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor}
13744b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor
1384afa39deaa245592977136d367251ee2c173dd8dDouglas GregorFileScopeAsmDecl *FileScopeAsmDecl::Create(ASTContext &C, DeclContext *DC,
1390ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner                                           SourceLocation L,
1408e25d8681822d8094bfeb97b2239363552548171Chris Lattner                                           StringLiteral *Str) {
1413e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff  return new (C) FileScopeAsmDecl(DC, L, Str);
1428e25d8681822d8094bfeb97b2239363552548171Chris Lattner}
1438e25d8681822d8094bfeb97b2239363552548171Chris Lattner
1446c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner//===----------------------------------------------------------------------===//
1454afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor// NamedDecl Implementation
1465239304ff761b8b03eefb772bd5d830a9b9f1aeaArgyrios Kyrtzidis//===----------------------------------------------------------------------===//
1475239304ff761b8b03eefb772bd5d830a9b9f1aeaArgyrios Kyrtzidis
14847b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregorstd::string NamedDecl::getQualifiedNameAsString() const {
14947b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor  std::vector<std::string> Names;
15047b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor  std::string QualName;
15147b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor  const DeclContext *Ctx = getDeclContext();
15247b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor
15347b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor  if (Ctx->isFunctionOrMethod())
15447b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor    return getNameAsString();
15547b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor
15647b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor  while (Ctx) {
15747b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor    if (Ctx->isFunctionOrMethod())
15847b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor      // FIXME: That probably will happen, when D was member of local
15947b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor      // scope class/struct/union. How do we handle this case?
16047b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor      break;
16147b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor
16247b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor    if (const NamedDecl *ND = dyn_cast<NamedDecl>(Ctx))
16347b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor      Names.push_back(ND->getNameAsString());
16447b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor    else
16547b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor      break;
16647b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor
16747b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor    Ctx = Ctx->getParent();
16847b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor  }
16947b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor
17047b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor  std::vector<std::string>::reverse_iterator
17147b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor    I = Names.rbegin(),
17247b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor    End = Names.rend();
17347b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor
17447b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor  for (; I!=End; ++I)
17547b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor    QualName += *I + "::";
17647b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor
17747b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor  QualName += getNameAsString();
17847b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor
17947b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor  return QualName;
18047b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor}
18147b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor
18247b9a1ca55e61e37f5a368740e29de190345acc6Douglas Gregor
1834afa39deaa245592977136d367251ee2c173dd8dDouglas Gregorbool NamedDecl::declarationReplaces(NamedDecl *OldD) const {
1846ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor  assert(getDeclName() == OldD->getDeclName() && "Declaration name mismatch");
1856ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor
1862a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor  // UsingDirectiveDecl's are not really NamedDecl's, and all have same name.
1872a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor  // We want to keep it, unless it nominates same namespace.
1882a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor  if (getKind() == Decl::UsingDirective) {
1892a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor    return cast<UsingDirectiveDecl>(this)->getNominatedNamespace() ==
1902a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor           cast<UsingDirectiveDecl>(OldD)->getNominatedNamespace();
1912a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor  }
1922a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor
1936ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor  if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(this))
1946ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor    // For function declarations, we keep track of redeclarations.
1956ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor    return FD->getPreviousDeclaration() == OldD;
1966ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor
1976ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor  // For non-function declarations, if the declarations are of the
1986ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor  // same kind then this must be a redeclaration, or semantic analysis
1996ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor  // would not have given us the new declaration.
2006ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor  return this->getKind() == OldD->getKind();
2016ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor}
2026ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor
2034afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor
2045239304ff761b8b03eefb772bd5d830a9b9f1aeaArgyrios Kyrtzidis//===----------------------------------------------------------------------===//
20599f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes// VarDecl Implementation
20699f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes//===----------------------------------------------------------------------===//
20799f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes
2084afa39deaa245592977136d367251ee2c173dd8dDouglas GregorVarDecl *VarDecl::Create(ASTContext &C, DeclContext *DC, SourceLocation L,
2094afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor                         IdentifierInfo *Id, QualType T, StorageClass S,
21099f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes                         SourceLocation TypeSpecStartLoc) {
2113e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff  return new (C) VarDecl(Var, DC, L, Id, T, S, TypeSpecStartLoc);
21299f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes}
21399f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes
21499f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopesvoid VarDecl::Destroy(ASTContext& C) {
215df2d3cf2be8b91e1e21234ff5a3aa4f820e7001aSebastian Redl  Expr *Init = getInit();
216df2d3cf2be8b91e1e21234ff5a3aa4f820e7001aSebastian Redl  if (Init)
217df2d3cf2be8b91e1e21234ff5a3aa4f820e7001aSebastian Redl    Init->Destroy(C);
21899f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes  this->~VarDecl();
2193e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff  C.Deallocate((void *)this);
22099f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes}
22199f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes
22299f06ba988922ea721035a89e6d3c66ba100ba8aNuno LopesVarDecl::~VarDecl() {
22399f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes}
22499f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes
22599f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes//===----------------------------------------------------------------------===//
2268a934233d1582b5bde9d270bc0705aa81e471a79Chris Lattner// FunctionDecl Implementation
2278a934233d1582b5bde9d270bc0705aa81e471a79Chris Lattner//===----------------------------------------------------------------------===//
2288a934233d1582b5bde9d270bc0705aa81e471a79Chris Lattner
22927f8a28bee33bb0e857cfe1a61c281bbc234b338Ted Kremenekvoid FunctionDecl::Destroy(ASTContext& C) {
230b65cf41707d190d5ce3d48b9e5bd2dc9d7b4a4c0Ted Kremenek  if (Body)
231b65cf41707d190d5ce3d48b9e5bd2dc9d7b4a4c0Ted Kremenek    Body->Destroy(C);
232b65cf41707d190d5ce3d48b9e5bd2dc9d7b4a4c0Ted Kremenek
233b65cf41707d190d5ce3d48b9e5bd2dc9d7b4a4c0Ted Kremenek  for (param_iterator I=param_begin(), E=param_end(); I!=E; ++I)
234b65cf41707d190d5ce3d48b9e5bd2dc9d7b4a4c0Ted Kremenek    (*I)->Destroy(C);
235460b0ac80382fa73337d21dd052c1f18b27435d8Nuno Lopes
2363e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff  C.Deallocate(ParamInfo);
237460b0ac80382fa73337d21dd052c1f18b27435d8Nuno Lopes
23827f8a28bee33bb0e857cfe1a61c281bbc234b338Ted Kremenek  Decl::Destroy(C);
23927f8a28bee33bb0e857cfe1a61c281bbc234b338Ted Kremenek}
24027f8a28bee33bb0e857cfe1a61c281bbc234b338Ted Kremenek
24127f8a28bee33bb0e857cfe1a61c281bbc234b338Ted Kremenek
242f009795057dc8ca254f5618c80a0a90f07cd44b4Douglas GregorStmt *FunctionDecl::getBody(const FunctionDecl *&Definition) const {
243f009795057dc8ca254f5618c80a0a90f07cd44b4Douglas Gregor  for (const FunctionDecl *FD = this; FD != 0; FD = FD->PreviousDeclaration) {
244f009795057dc8ca254f5618c80a0a90f07cd44b4Douglas Gregor    if (FD->Body) {
245f009795057dc8ca254f5618c80a0a90f07cd44b4Douglas Gregor      Definition = FD;
246f009795057dc8ca254f5618c80a0a90f07cd44b4Douglas Gregor      return FD->Body;
247f009795057dc8ca254f5618c80a0a90f07cd44b4Douglas Gregor    }
248f009795057dc8ca254f5618c80a0a90f07cd44b4Douglas Gregor  }
249f009795057dc8ca254f5618c80a0a90f07cd44b4Douglas Gregor
250f009795057dc8ca254f5618c80a0a90f07cd44b4Douglas Gregor  return 0;
2515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
2525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2533e41d60eb627dc227c770f1c1c87d06909cf05fdDouglas Gregor/// \brief Returns a value indicating whether this function
2543e41d60eb627dc227c770f1c1c87d06909cf05fdDouglas Gregor/// corresponds to a builtin function.
2553e41d60eb627dc227c770f1c1c87d06909cf05fdDouglas Gregor///
2563e41d60eb627dc227c770f1c1c87d06909cf05fdDouglas Gregor/// The function corresponds to a built-in function if it is
2573e41d60eb627dc227c770f1c1c87d06909cf05fdDouglas Gregor/// declared at translation scope or within an extern "C" block and
2583e41d60eb627dc227c770f1c1c87d06909cf05fdDouglas Gregor/// its name matches with the name of a builtin. The returned value
2593e41d60eb627dc227c770f1c1c87d06909cf05fdDouglas Gregor/// will be 0 for functions that do not correspond to a builtin, a
2603e41d60eb627dc227c770f1c1c87d06909cf05fdDouglas Gregor/// value of type \c Builtin::ID if in the target-independent range
2613e41d60eb627dc227c770f1c1c87d06909cf05fdDouglas Gregor/// \c [1,Builtin::First), or a target-specific builtin value.
2623c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregorunsigned FunctionDecl::getBuiltinID(ASTContext &Context) const {
2633c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor  if (!getIdentifier() || !getIdentifier()->getBuiltinID())
2643c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor    return 0;
2653c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor
2663c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor  unsigned BuiltinID = getIdentifier()->getBuiltinID();
2673c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor  if (!Context.BuiltinInfo.isPredefinedLibFunction(BuiltinID))
2683c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor    return BuiltinID;
2693c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor
2703c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor  // This function has the name of a known C library
2713c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor  // function. Determine whether it actually refers to the C library
2723c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor  // function or whether it just has the same name.
2733c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor
2749add31798f621f843233dbff8bba103fca64447bDouglas Gregor  // If this is a static function, it's not a builtin.
2759add31798f621f843233dbff8bba103fca64447bDouglas Gregor  if (getStorageClass() == Static)
2769add31798f621f843233dbff8bba103fca64447bDouglas Gregor    return 0;
2779add31798f621f843233dbff8bba103fca64447bDouglas Gregor
2783c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor  // If this function is at translation-unit scope and we're not in
2793c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor  // C++, it refers to the C library function.
2803c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor  if (!Context.getLangOptions().CPlusPlus &&
2813c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor      getDeclContext()->isTranslationUnit())
2823c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor    return BuiltinID;
2833c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor
2843c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor  // If the function is in an extern "C" linkage specification and is
2853c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor  // not marked "overloadable", it's the real function.
2863c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor  if (isa<LinkageSpecDecl>(getDeclContext()) &&
2873c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor      cast<LinkageSpecDecl>(getDeclContext())->getLanguage()
2883c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor        == LinkageSpecDecl::lang_c &&
2893c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor      !getAttr<OverloadableAttr>())
2903c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor    return BuiltinID;
2913c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor
2923c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor  // Not a builtin
2933e41d60eb627dc227c770f1c1c87d06909cf05fdDouglas Gregor  return 0;
2943e41d60eb627dc227c770f1c1c87d06909cf05fdDouglas Gregor}
2953e41d60eb627dc227c770f1c1c87d06909cf05fdDouglas Gregor
2963e41d60eb627dc227c770f1c1c87d06909cf05fdDouglas Gregor
2974f03fd61ee45245dd3a1552a023e730d56c2e697Ted Kremenek// Helper function for FunctionDecl::getNumParams and FunctionDecl::setParams()
2984f03fd61ee45245dd3a1552a023e730d56c2e697Ted Kremenekstatic unsigned getNumTypeParams(QualType T) {
2994f03fd61ee45245dd3a1552a023e730d56c2e697Ted Kremenek  const FunctionType *FT = T->getAsFunctionType();
300d8bdba5d3534b87cae606d559933bc62752e8828Chris Lattner  if (isa<FunctionTypeNoProto>(FT))
301d3b9065ec7052ec4741783d2fb4130d13c766933Chris Lattner    return 0;
302d8bdba5d3534b87cae606d559933bc62752e8828Chris Lattner  return cast<FunctionTypeProto>(FT)->getNumArgs();
3035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
3045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3054f03fd61ee45245dd3a1552a023e730d56c2e697Ted Kremenekunsigned FunctionDecl::getNumParams() const {
3064f03fd61ee45245dd3a1552a023e730d56c2e697Ted Kremenek  // Can happen if a FunctionDecl is declared using typeof(some_other_func) bar;
3074f03fd61ee45245dd3a1552a023e730d56c2e697Ted Kremenek  if (!ParamInfo)
3084f03fd61ee45245dd3a1552a023e730d56c2e697Ted Kremenek    return 0;
3094f03fd61ee45245dd3a1552a023e730d56c2e697Ted Kremenek
3104f03fd61ee45245dd3a1552a023e730d56c2e697Ted Kremenek  return getNumTypeParams(getType());
3114f03fd61ee45245dd3a1552a023e730d56c2e697Ted Kremenek}
3124f03fd61ee45245dd3a1552a023e730d56c2e697Ted Kremenek
313fc767615bc67d3a7587b1fb2e0494c32c9dbd7a5Ted Kremenekvoid FunctionDecl::setParams(ASTContext& C, ParmVarDecl **NewParamInfo,
314fc767615bc67d3a7587b1fb2e0494c32c9dbd7a5Ted Kremenek                             unsigned NumParams) {
3155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  assert(ParamInfo == 0 && "Already has param info!");
3164f03fd61ee45245dd3a1552a023e730d56c2e697Ted Kremenek  assert(NumParams == getNumTypeParams(getType()) &&
3174f03fd61ee45245dd3a1552a023e730d56c2e697Ted Kremenek         "Parameter count mismatch!");
3185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Zero params -> null pointer.
3205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (NumParams) {
321c0ac4923f08b25ae973a8ee7942cf3eb89da57b7Steve Naroff    void *Mem = C.Allocate(sizeof(ParmVarDecl*)*NumParams);
322fc767615bc67d3a7587b1fb2e0494c32c9dbd7a5Ted Kremenek    ParamInfo = new (Mem) ParmVarDecl*[NumParams];
3235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    memcpy(ParamInfo, NewParamInfo, sizeof(ParmVarDecl*)*NumParams);
3245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
3255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
3265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3278123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner/// getMinRequiredArguments - Returns the minimum number of arguments
3288123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner/// needed to call this function. This may be fewer than the number of
3298123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner/// function parameters, if some of the parameters have default
3309e979557eea3875c9e3d100c68188233dd7f46c0Chris Lattner/// arguments (in C++).
3318123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattnerunsigned FunctionDecl::getMinRequiredArguments() const {
3328123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner  unsigned NumRequiredArgs = getNumParams();
3338123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner  while (NumRequiredArgs > 0
3348123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner         && getParamDecl(NumRequiredArgs-1)->getDefaultArg())
3358123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner    --NumRequiredArgs;
3368123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner
3378123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner  return NumRequiredArgs;
3388123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner}
3398123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner
3401cd1b1e987f5e2f060d7972b13d83239b36d77d6Douglas Gregor/// getOverloadedOperator - Which C++ overloaded operator this
3411cd1b1e987f5e2f060d7972b13d83239b36d77d6Douglas Gregor/// function represents, if any.
3421cd1b1e987f5e2f060d7972b13d83239b36d77d6Douglas GregorOverloadedOperatorKind FunctionDecl::getOverloadedOperator() const {
343e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  if (getDeclName().getNameKind() == DeclarationName::CXXOperatorName)
344e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor    return getDeclName().getCXXOverloadedOperator();
3451cd1b1e987f5e2f060d7972b13d83239b36d77d6Douglas Gregor  else
3461cd1b1e987f5e2f060d7972b13d83239b36d77d6Douglas Gregor    return OO_None;
3471cd1b1e987f5e2f060d7972b13d83239b36d77d6Douglas Gregor}
3481cd1b1e987f5e2f060d7972b13d83239b36d77d6Douglas Gregor
3498a934233d1582b5bde9d270bc0705aa81e471a79Chris Lattner//===----------------------------------------------------------------------===//
350bcbffc46f1ad3796c4582fa1e3a9113b5aa26061Douglas Gregor// TagDecl Implementation
3514b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek//===----------------------------------------------------------------------===//
3524b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek
3530b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregorvoid TagDecl::startDefinition() {
3540b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregor  cast<TagType>(TypeForDecl)->decl.setPointer(this);
3550b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregor  cast<TagType>(TypeForDecl)->decl.setInt(1);
3560b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregor}
3570b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregor
3580b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregorvoid TagDecl::completeDefinition() {
3590b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregor  assert((!TypeForDecl ||
3600b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregor          cast<TagType>(TypeForDecl)->decl.getPointer() == this) &&
3610b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregor         "Attempt to redefine a tag definition?");
3620b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregor  IsDefinition = true;
3630b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregor  cast<TagType>(TypeForDecl)->decl.setPointer(this);
3640b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregor  cast<TagType>(TypeForDecl)->decl.setInt(0);
3650b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregor}
3660b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregor
3674b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed KremenekTagDecl* TagDecl::getDefinition(ASTContext& C) const {
3684b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek  QualType T = C.getTypeDeclType(const_cast<TagDecl*>(this));
3694b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek  TagDecl* D = cast<TagDecl>(cast<TagType>(T)->getDecl());
3704b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek  return D->isDefinition() ? D : 0;
3714b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek}
3724b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek
3734b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek//===----------------------------------------------------------------------===//
3748a934233d1582b5bde9d270bc0705aa81e471a79Chris Lattner// RecordDecl Implementation
3758a934233d1582b5bde9d270bc0705aa81e471a79Chris Lattner//===----------------------------------------------------------------------===//
3765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
37735bc0821c4f80041724cd4c5c4889b2581546a41Argyrios KyrtzidisRecordDecl::RecordDecl(Kind DK, TagKind TK, DeclContext *DC, SourceLocation L,
378df042e6c2bf06b2d9ed53c52469599ac1bd93a3fTed Kremenek                       IdentifierInfo *Id)
3794afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor  : TagDecl(DK, TK, DC, L, Id) {
3806359792ca92e7ca2f416cb804c6604358174e994Ted Kremenek  HasFlexibleArrayMember = false;
381bcbffc46f1ad3796c4582fa1e3a9113b5aa26061Douglas Gregor  AnonymousStructOrUnion = false;
3826359792ca92e7ca2f416cb804c6604358174e994Ted Kremenek  assert(classof(static_cast<Decl*>(this)) && "Invalid Kind!");
3836359792ca92e7ca2f416cb804c6604358174e994Ted Kremenek}
3846359792ca92e7ca2f416cb804c6604358174e994Ted Kremenek
3856359792ca92e7ca2f416cb804c6604358174e994Ted KremenekRecordDecl *RecordDecl::Create(ASTContext &C, TagKind TK, DeclContext *DC,
3864b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek                               SourceLocation L, IdentifierInfo *Id,
3874b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek                               RecordDecl* PrevDecl) {
388df042e6c2bf06b2d9ed53c52469599ac1bd93a3fTed Kremenek
3893e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff  RecordDecl* R = new (C) RecordDecl(Record, TK, DC, L, Id);
3904b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek  C.getTypeDeclType(R, PrevDecl);
3914b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek  return R;
3926359792ca92e7ca2f416cb804c6604358174e994Ted Kremenek}
3936359792ca92e7ca2f416cb804c6604358174e994Ted Kremenek
394997b6c6d73541f010afc81e28191c8eae7b24f77Argyrios KyrtzidisRecordDecl::~RecordDecl() {
395997b6c6d73541f010afc81e28191c8eae7b24f77Argyrios Kyrtzidis}
396997b6c6d73541f010afc81e28191c8eae7b24f77Argyrios Kyrtzidis
397997b6c6d73541f010afc81e28191c8eae7b24f77Argyrios Kyrtzidisvoid RecordDecl::Destroy(ASTContext& C) {
398997b6c6d73541f010afc81e28191c8eae7b24f77Argyrios Kyrtzidis  TagDecl::Destroy(C);
399997b6c6d73541f010afc81e28191c8eae7b24f77Argyrios Kyrtzidis}
400997b6c6d73541f010afc81e28191c8eae7b24f77Argyrios Kyrtzidis
40144b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor/// completeDefinition - Notes that the definition of this type is now
40244b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor/// complete.
40344b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregorvoid RecordDecl::completeDefinition(ASTContext& C) {
4045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  assert(!isDefinition() && "Cannot redefine record!");
4050b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregor  TagDecl::completeDefinition();
4065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
4075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
40856ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff//===----------------------------------------------------------------------===//
40956ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff// BlockDecl Implementation
41056ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff//===----------------------------------------------------------------------===//
41156ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff
41256ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve NaroffBlockDecl::~BlockDecl() {
41356ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff}
41456ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff
41556ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroffvoid BlockDecl::Destroy(ASTContext& C) {
41656ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff  if (Body)
41756ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff    Body->Destroy(C);
41856ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff
41956ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff  for (param_iterator I=param_begin(), E=param_end(); I!=E; ++I)
42056ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff    (*I)->Destroy(C);
42156ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff
42256ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff  Decl::Destroy(C);
42356ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff}
424