Decl.cpp revision 460b0ac80382fa73337d21dd052c1f18b27435d8
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) {
27ef177820100ab583b08fd3056e2a5a52ee4b1629Argyrios Kyrtzidis  void *Mem = C.getAllocator().Allocate<TranslationUnitDecl>();
28ef177820100ab583b08fd3056e2a5a52ee4b1629Argyrios Kyrtzidis  return new (Mem) TranslationUnitDecl();
29ef177820100ab583b08fd3056e2a5a52ee4b1629Argyrios Kyrtzidis}
30ef177820100ab583b08fd3056e2a5a52ee4b1629Argyrios Kyrtzidis
312d1c5d313cd0c229cc614e74baa4c5756a4b46f4Argyrios KyrtzidisNamespaceDecl *NamespaceDecl::Create(ASTContext &C, DeclContext *DC,
322d1c5d313cd0c229cc614e74baa4c5756a4b46f4Argyrios Kyrtzidis                                     SourceLocation L, IdentifierInfo *Id) {
332d1c5d313cd0c229cc614e74baa4c5756a4b46f4Argyrios Kyrtzidis  void *Mem = C.getAllocator().Allocate<NamespaceDecl>();
342d1c5d313cd0c229cc614e74baa4c5756a4b46f4Argyrios Kyrtzidis  return new (Mem) 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();
42d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenek  C.getAllocator().Deallocate((void *)this);
43d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenek}
44d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenek
45d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenek
464111024be81e7c0525e42dadcc126d27e5bf2425Chris LattnerImplicitParamDecl *ImplicitParamDecl::Create(ASTContext &C, DeclContext *DC,
474111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner    SourceLocation L, IdentifierInfo *Id, QualType T, ScopedDecl *PrevDecl) {
484111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner  void *Mem = C.getAllocator().Allocate<ImplicitParamDecl>();
494111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner  return new (Mem) ImplicitParamDecl(ImplicitParam, DC, L, Id, T, PrevDecl);
504111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner}
514111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner
529fdf9c6d3530bb85f3166e6460d841e2ff8e1a2cChris LattnerParmVarDecl *ParmVarDecl::Create(ASTContext &C, DeclContext *DC,
530ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner                                 SourceLocation L, IdentifierInfo *Id,
540ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner                                 QualType T, StorageClass S,
5504421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner                                 Expr *DefArg, ScopedDecl *PrevDecl) {
569e151e154780e9cd443336143af1e996d1f387e5Chris Lattner  void *Mem = C.getAllocator().Allocate<ParmVarDecl>();
574306d3cb9116605728252e2738df24b9f6ab53c3Fariborz Jahanian  return new (Mem) ParmVarDecl(ParmVar, DC, L, Id, T, S, DefArg, PrevDecl);
584306d3cb9116605728252e2738df24b9f6ab53c3Fariborz Jahanian}
594306d3cb9116605728252e2738df24b9f6ab53c3Fariborz Jahanian
604306d3cb9116605728252e2738df24b9f6ab53c3Fariborz JahanianQualType ParmVarDecl::getOriginalType() const {
614306d3cb9116605728252e2738df24b9f6ab53c3Fariborz Jahanian  if (const ParmVarWithOriginalTypeDecl *PVD =
624306d3cb9116605728252e2738df24b9f6ab53c3Fariborz Jahanian      dyn_cast<ParmVarWithOriginalTypeDecl>(this))
634306d3cb9116605728252e2738df24b9f6ab53c3Fariborz Jahanian    return PVD->OriginalType;
644306d3cb9116605728252e2738df24b9f6ab53c3Fariborz Jahanian  return getType();
659e151e154780e9cd443336143af1e996d1f387e5Chris Lattner}
669e151e154780e9cd443336143af1e996d1f387e5Chris Lattner
6773da9e462576faedc2cdf96b37a1c072b404b73dFariborz JahanianParmVarWithOriginalTypeDecl *ParmVarWithOriginalTypeDecl::Create(
6873da9e462576faedc2cdf96b37a1c072b404b73dFariborz Jahanian                                 ASTContext &C, DeclContext *DC,
6973da9e462576faedc2cdf96b37a1c072b404b73dFariborz Jahanian                                 SourceLocation L, IdentifierInfo *Id,
7073da9e462576faedc2cdf96b37a1c072b404b73dFariborz Jahanian                                 QualType T, QualType OT, StorageClass S,
7173da9e462576faedc2cdf96b37a1c072b404b73dFariborz Jahanian                                 Expr *DefArg, ScopedDecl *PrevDecl) {
7273da9e462576faedc2cdf96b37a1c072b404b73dFariborz Jahanian  void *Mem = C.getAllocator().Allocate<ParmVarWithOriginalTypeDecl>();
7373da9e462576faedc2cdf96b37a1c072b404b73dFariborz Jahanian  return new (Mem) ParmVarWithOriginalTypeDecl(DC, L, Id, T, OT, S,
7473da9e462576faedc2cdf96b37a1c072b404b73dFariborz Jahanian                                               DefArg, PrevDecl);
7573da9e462576faedc2cdf96b37a1c072b404b73dFariborz Jahanian}
7673da9e462576faedc2cdf96b37a1c072b404b73dFariborz Jahanian
779fdf9c6d3530bb85f3166e6460d841e2ff8e1a2cChris LattnerFunctionDecl *FunctionDecl::Create(ASTContext &C, DeclContext *DC,
780ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner                                   SourceLocation L,
7910bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor                                   DeclarationName N, QualType T,
80a98e58ddb4696a0020fe97439d5295413f9e90b1Chris Lattner                                   StorageClass S, bool isInline,
810eb07bfde0deedcb35cf3d118b3488f5d8db32ecSteve Naroff                                   ScopedDecl *PrevDecl,
820eb07bfde0deedcb35cf3d118b3488f5d8db32ecSteve Naroff                                   SourceLocation TypeSpecStartLoc) {
83a98e58ddb4696a0020fe97439d5295413f9e90b1Chris Lattner  void *Mem = C.getAllocator().Allocate<FunctionDecl>();
8410bd36882406cdf4805e35add1ce2f11ab9ae152Douglas Gregor  return new (Mem) FunctionDecl(Function, DC, L, N, T, S, isInline, PrevDecl,
850eb07bfde0deedcb35cf3d118b3488f5d8db32ecSteve Naroff                                TypeSpecStartLoc);
86a98e58ddb4696a0020fe97439d5295413f9e90b1Chris Lattner}
87a98e58ddb4696a0020fe97439d5295413f9e90b1Chris Lattner
88090276f5e164d491a1bb3f541bafdb394f5e6f04Steve NaroffBlockDecl *BlockDecl::Create(ASTContext &C, DeclContext *DC, SourceLocation L) {
8956ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff  void *Mem = C.getAllocator().Allocate<BlockDecl>();
90090276f5e164d491a1bb3f541bafdb394f5e6f04Steve Naroff  return new (Mem) BlockDecl(DC, L);
9156ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff}
9256ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff
9344b4321feab46299d3f5cfd404680884752a0fcfDouglas GregorFieldDecl *FieldDecl::Create(ASTContext &C, DeclContext *DC, SourceLocation L,
9444b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor                             IdentifierInfo *Id, QualType T, Expr *BW,
9544b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor                             bool Mutable, ScopedDecl *PrevDecl) {
968e25d8681822d8094bfeb97b2239363552548171Chris Lattner  void *Mem = C.getAllocator().Allocate<FieldDecl>();
9744b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor  return new (Mem) FieldDecl(Decl::Field, DC, L, Id, T, BW, Mutable, PrevDecl);
988e25d8681822d8094bfeb97b2239363552548171Chris Lattner}
998e25d8681822d8094bfeb97b2239363552548171Chris Lattner
1006b3945f4bc757bdadd3e443180cf32c2cccb52a0Douglas Gregorbool FieldDecl::isAnonymousStructOrUnion() const {
1016b3945f4bc757bdadd3e443180cf32c2cccb52a0Douglas Gregor  if (!isImplicit() || getDeclName())
1026b3945f4bc757bdadd3e443180cf32c2cccb52a0Douglas Gregor    return false;
1036b3945f4bc757bdadd3e443180cf32c2cccb52a0Douglas Gregor
1046b3945f4bc757bdadd3e443180cf32c2cccb52a0Douglas Gregor  if (const RecordType *Record = getType()->getAsRecordType())
1056b3945f4bc757bdadd3e443180cf32c2cccb52a0Douglas Gregor    return Record->getDecl()->isAnonymousStructOrUnion();
1066b3945f4bc757bdadd3e443180cf32c2cccb52a0Douglas Gregor
1076b3945f4bc757bdadd3e443180cf32c2cccb52a0Douglas Gregor  return false;
1086b3945f4bc757bdadd3e443180cf32c2cccb52a0Douglas Gregor}
109a98e58ddb4696a0020fe97439d5295413f9e90b1Chris Lattner
1100ed844b04ea4387caa4e1cf3dc375d269657536bChris LattnerEnumConstantDecl *EnumConstantDecl::Create(ASTContext &C, EnumDecl *CD,
1110ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner                                           SourceLocation L,
112c63e660882ff93841fa234d70ef6757038302b92Chris Lattner                                           IdentifierInfo *Id, QualType T,
113c63e660882ff93841fa234d70ef6757038302b92Chris Lattner                                           Expr *E, const llvm::APSInt &V,
114c63e660882ff93841fa234d70ef6757038302b92Chris Lattner                                           ScopedDecl *PrevDecl){
1156c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner  void *Mem = C.getAllocator().Allocate<EnumConstantDecl>();
1160ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner  return new (Mem) EnumConstantDecl(CD, L, Id, T, E, V, PrevDecl);
1176c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner}
1186c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner
119d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenekvoid EnumConstantDecl::Destroy(ASTContext& C) {
120d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenek  if (Init) Init->Destroy(C);
121d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenek  Decl::Destroy(C);
122d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenek}
123d1ac17ae7d61a9244ee5e658d6f63b8fa3da3127Ted Kremenek
1249fdf9c6d3530bb85f3166e6460d841e2ff8e1a2cChris LattnerTypedefDecl *TypedefDecl::Create(ASTContext &C, DeclContext *DC,
1250ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner                                 SourceLocation L,
126c63e660882ff93841fa234d70ef6757038302b92Chris Lattner                                 IdentifierInfo *Id, QualType T,
127c63e660882ff93841fa234d70ef6757038302b92Chris Lattner                                 ScopedDecl *PD) {
1286c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner  void *Mem = C.getAllocator().Allocate<TypedefDecl>();
1299fdf9c6d3530bb85f3166e6460d841e2ff8e1a2cChris Lattner  return new (Mem) TypedefDecl(DC, L, Id, T, PD);
1306c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner}
1316c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner
1329fdf9c6d3530bb85f3166e6460d841e2ff8e1a2cChris LattnerEnumDecl *EnumDecl::Create(ASTContext &C, DeclContext *DC, SourceLocation L,
1330ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner                           IdentifierInfo *Id,
1347df7b6bb800e1987951285ea192e4f347e1b603aDouglas Gregor                           EnumDecl *PrevDecl) {
1356c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner  void *Mem = C.getAllocator().Allocate<EnumDecl>();
1367df7b6bb800e1987951285ea192e4f347e1b603aDouglas Gregor  EnumDecl *Enum = new (Mem) EnumDecl(DC, L, Id, 0);
1377df7b6bb800e1987951285ea192e4f347e1b603aDouglas Gregor  C.getTypeDeclType(Enum, PrevDecl);
1387df7b6bb800e1987951285ea192e4f347e1b603aDouglas Gregor  return Enum;
1396c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner}
1406c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner
141df91eca19bd9738abd9a3b84791f39750e27ad36Ted Kremenekvoid EnumDecl::Destroy(ASTContext& C) {
142df91eca19bd9738abd9a3b84791f39750e27ad36Ted Kremenek  Decl::Destroy(C);
143df91eca19bd9738abd9a3b84791f39750e27ad36Ted Kremenek}
144df91eca19bd9738abd9a3b84791f39750e27ad36Ted Kremenek
14544b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregorvoid EnumDecl::completeDefinition(ASTContext &C, QualType NewType) {
14644b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor  assert(!isDefinition() && "Cannot redefine enums!");
14744b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor  IntegerType = NewType;
1480b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregor  TagDecl::completeDefinition();
14944b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor}
15044b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor
1510ed844b04ea4387caa4e1cf3dc375d269657536bChris LattnerFileScopeAsmDecl *FileScopeAsmDecl::Create(ASTContext &C,
1520ed844b04ea4387caa4e1cf3dc375d269657536bChris Lattner                                           SourceLocation L,
1538e25d8681822d8094bfeb97b2239363552548171Chris Lattner                                           StringLiteral *Str) {
1548e25d8681822d8094bfeb97b2239363552548171Chris Lattner  void *Mem = C.getAllocator().Allocate<FileScopeAsmDecl>();
1558e25d8681822d8094bfeb97b2239363552548171Chris Lattner  return new (Mem) FileScopeAsmDecl(L, Str);
1568e25d8681822d8094bfeb97b2239363552548171Chris Lattner}
1578e25d8681822d8094bfeb97b2239363552548171Chris Lattner
1586c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner//===----------------------------------------------------------------------===//
1595239304ff761b8b03eefb772bd5d830a9b9f1aeaArgyrios Kyrtzidis// ScopedDecl Implementation
1605239304ff761b8b03eefb772bd5d830a9b9f1aeaArgyrios Kyrtzidis//===----------------------------------------------------------------------===//
1615239304ff761b8b03eefb772bd5d830a9b9f1aeaArgyrios Kyrtzidis
162a8cc8ce044e5d2589128f0c1a84e586cce743b27Douglas Gregorvoid ScopedDecl::setDeclContext(DeclContext *DC) {
163a8cc8ce044e5d2589128f0c1a84e586cce743b27Douglas Gregor  if (isOutOfSemaDC())
164a8cc8ce044e5d2589128f0c1a84e586cce743b27Douglas Gregor    delete getMultipleDC();
165a8cc8ce044e5d2589128f0c1a84e586cce743b27Douglas Gregor
166a8cc8ce044e5d2589128f0c1a84e586cce743b27Douglas Gregor  DeclCtx = reinterpret_cast<uintptr_t>(DC);
167a8cc8ce044e5d2589128f0c1a84e586cce743b27Douglas Gregor}
168a8cc8ce044e5d2589128f0c1a84e586cce743b27Douglas Gregor
1695239304ff761b8b03eefb772bd5d830a9b9f1aeaArgyrios Kyrtzidisvoid ScopedDecl::setLexicalDeclContext(DeclContext *DC) {
1705239304ff761b8b03eefb772bd5d830a9b9f1aeaArgyrios Kyrtzidis  if (DC == getLexicalDeclContext())
1715239304ff761b8b03eefb772bd5d830a9b9f1aeaArgyrios Kyrtzidis    return;
1725239304ff761b8b03eefb772bd5d830a9b9f1aeaArgyrios Kyrtzidis
1735239304ff761b8b03eefb772bd5d830a9b9f1aeaArgyrios Kyrtzidis  if (isInSemaDC()) {
1745239304ff761b8b03eefb772bd5d830a9b9f1aeaArgyrios Kyrtzidis    MultipleDC *MDC = new MultipleDC();
1755239304ff761b8b03eefb772bd5d830a9b9f1aeaArgyrios Kyrtzidis    MDC->SemanticDC = getDeclContext();
1765239304ff761b8b03eefb772bd5d830a9b9f1aeaArgyrios Kyrtzidis    MDC->LexicalDC = DC;
1775239304ff761b8b03eefb772bd5d830a9b9f1aeaArgyrios Kyrtzidis    DeclCtx = reinterpret_cast<uintptr_t>(MDC) | 0x1;
1785239304ff761b8b03eefb772bd5d830a9b9f1aeaArgyrios Kyrtzidis  } else {
1795239304ff761b8b03eefb772bd5d830a9b9f1aeaArgyrios Kyrtzidis    getMultipleDC()->LexicalDC = DC;
1805239304ff761b8b03eefb772bd5d830a9b9f1aeaArgyrios Kyrtzidis  }
1815239304ff761b8b03eefb772bd5d830a9b9f1aeaArgyrios Kyrtzidis}
1825239304ff761b8b03eefb772bd5d830a9b9f1aeaArgyrios Kyrtzidis
1835239304ff761b8b03eefb772bd5d830a9b9f1aeaArgyrios KyrtzidisScopedDecl::~ScopedDecl() {
1845239304ff761b8b03eefb772bd5d830a9b9f1aeaArgyrios Kyrtzidis  if (isOutOfSemaDC())
1855239304ff761b8b03eefb772bd5d830a9b9f1aeaArgyrios Kyrtzidis    delete getMultipleDC();
1865239304ff761b8b03eefb772bd5d830a9b9f1aeaArgyrios Kyrtzidis}
1875239304ff761b8b03eefb772bd5d830a9b9f1aeaArgyrios Kyrtzidis
1886ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregorbool ScopedDecl::declarationReplaces(NamedDecl *OldD) const {
1896ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor  assert(getDeclName() == OldD->getDeclName() && "Declaration name mismatch");
1906ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor
1916ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor  if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(this))
1926ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor    // For function declarations, we keep track of redeclarations.
1936ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor    return FD->getPreviousDeclaration() == OldD;
1946ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor
1956ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor  // For non-function declarations, if the declarations are of the
1966ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor  // same kind then this must be a redeclaration, or semantic analysis
1976ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor  // would not have given us the new declaration.
1986ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor  return this->getKind() == OldD->getKind();
1996ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor}
2006ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor
2015239304ff761b8b03eefb772bd5d830a9b9f1aeaArgyrios Kyrtzidis//===----------------------------------------------------------------------===//
20299f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes// VarDecl Implementation
20399f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes//===----------------------------------------------------------------------===//
20499f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes
20599f06ba988922ea721035a89e6d3c66ba100ba8aNuno LopesVarDecl *VarDecl::Create(ASTContext &C, DeclContext *DC,
20699f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes                         SourceLocation L,
20799f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes                         IdentifierInfo *Id, QualType T,
20899f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes                         StorageClass S, ScopedDecl *PrevDecl,
20999f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes                         SourceLocation TypeSpecStartLoc) {
21099f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes  void *Mem = C.getAllocator().Allocate<VarDecl>();
21199f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes  return new (Mem) VarDecl(Var, DC, L, Id, T, S, PrevDecl, TypeSpecStartLoc);
21299f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes}
21399f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes
21499f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopesvoid VarDecl::Destroy(ASTContext& C) {
21599f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes  this->~VarDecl();
21699f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes  C.getAllocator().Deallocate((void *)this);
21799f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes}
21899f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes
21999f06ba988922ea721035a89e6d3c66ba100ba8aNuno LopesVarDecl::~VarDecl() {
22099f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes  delete getInit();
22199f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes}
22299f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes
22399f06ba988922ea721035a89e6d3c66ba100ba8aNuno Lopes//===----------------------------------------------------------------------===//
2248a934233d1582b5bde9d270bc0705aa81e471a79Chris Lattner// FunctionDecl Implementation
2258a934233d1582b5bde9d270bc0705aa81e471a79Chris Lattner//===----------------------------------------------------------------------===//
2268a934233d1582b5bde9d270bc0705aa81e471a79Chris Lattner
22727f8a28bee33bb0e857cfe1a61c281bbc234b338Ted Kremenekvoid FunctionDecl::Destroy(ASTContext& C) {
228b65cf41707d190d5ce3d48b9e5bd2dc9d7b4a4c0Ted Kremenek  if (Body)
229b65cf41707d190d5ce3d48b9e5bd2dc9d7b4a4c0Ted Kremenek    Body->Destroy(C);
230b65cf41707d190d5ce3d48b9e5bd2dc9d7b4a4c0Ted Kremenek
231b65cf41707d190d5ce3d48b9e5bd2dc9d7b4a4c0Ted Kremenek  for (param_iterator I=param_begin(), E=param_end(); I!=E; ++I)
232b65cf41707d190d5ce3d48b9e5bd2dc9d7b4a4c0Ted Kremenek    (*I)->Destroy(C);
233460b0ac80382fa73337d21dd052c1f18b27435d8Nuno Lopes
234460b0ac80382fa73337d21dd052c1f18b27435d8Nuno Lopes  C.getAllocator().Deallocate(ParamInfo);
235460b0ac80382fa73337d21dd052c1f18b27435d8Nuno Lopes
23627f8a28bee33bb0e857cfe1a61c281bbc234b338Ted Kremenek  Decl::Destroy(C);
23727f8a28bee33bb0e857cfe1a61c281bbc234b338Ted Kremenek}
23827f8a28bee33bb0e857cfe1a61c281bbc234b338Ted Kremenek
23927f8a28bee33bb0e857cfe1a61c281bbc234b338Ted Kremenek
240f009795057dc8ca254f5618c80a0a90f07cd44b4Douglas GregorStmt *FunctionDecl::getBody(const FunctionDecl *&Definition) const {
241f009795057dc8ca254f5618c80a0a90f07cd44b4Douglas Gregor  for (const FunctionDecl *FD = this; FD != 0; FD = FD->PreviousDeclaration) {
242f009795057dc8ca254f5618c80a0a90f07cd44b4Douglas Gregor    if (FD->Body) {
243f009795057dc8ca254f5618c80a0a90f07cd44b4Douglas Gregor      Definition = FD;
244f009795057dc8ca254f5618c80a0a90f07cd44b4Douglas Gregor      return FD->Body;
245f009795057dc8ca254f5618c80a0a90f07cd44b4Douglas Gregor    }
246f009795057dc8ca254f5618c80a0a90f07cd44b4Douglas Gregor  }
247f009795057dc8ca254f5618c80a0a90f07cd44b4Douglas Gregor
248f009795057dc8ca254f5618c80a0a90f07cd44b4Douglas Gregor  return 0;
2495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
2505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2514f03fd61ee45245dd3a1552a023e730d56c2e697Ted Kremenek// Helper function for FunctionDecl::getNumParams and FunctionDecl::setParams()
2524f03fd61ee45245dd3a1552a023e730d56c2e697Ted Kremenekstatic unsigned getNumTypeParams(QualType T) {
2534f03fd61ee45245dd3a1552a023e730d56c2e697Ted Kremenek  const FunctionType *FT = T->getAsFunctionType();
254d8bdba5d3534b87cae606d559933bc62752e8828Chris Lattner  if (isa<FunctionTypeNoProto>(FT))
255d3b9065ec7052ec4741783d2fb4130d13c766933Chris Lattner    return 0;
256d8bdba5d3534b87cae606d559933bc62752e8828Chris Lattner  return cast<FunctionTypeProto>(FT)->getNumArgs();
2575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
2585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2594f03fd61ee45245dd3a1552a023e730d56c2e697Ted Kremenekunsigned FunctionDecl::getNumParams() const {
2604f03fd61ee45245dd3a1552a023e730d56c2e697Ted Kremenek  // Can happen if a FunctionDecl is declared using typeof(some_other_func) bar;
2614f03fd61ee45245dd3a1552a023e730d56c2e697Ted Kremenek  if (!ParamInfo)
2624f03fd61ee45245dd3a1552a023e730d56c2e697Ted Kremenek    return 0;
2634f03fd61ee45245dd3a1552a023e730d56c2e697Ted Kremenek
2644f03fd61ee45245dd3a1552a023e730d56c2e697Ted Kremenek  return getNumTypeParams(getType());
2654f03fd61ee45245dd3a1552a023e730d56c2e697Ted Kremenek}
2664f03fd61ee45245dd3a1552a023e730d56c2e697Ted Kremenek
267fc767615bc67d3a7587b1fb2e0494c32c9dbd7a5Ted Kremenekvoid FunctionDecl::setParams(ASTContext& C, ParmVarDecl **NewParamInfo,
268fc767615bc67d3a7587b1fb2e0494c32c9dbd7a5Ted Kremenek                             unsigned NumParams) {
2695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  assert(ParamInfo == 0 && "Already has param info!");
2704f03fd61ee45245dd3a1552a023e730d56c2e697Ted Kremenek  assert(NumParams == getNumTypeParams(getType()) &&
2714f03fd61ee45245dd3a1552a023e730d56c2e697Ted Kremenek         "Parameter count mismatch!");
2725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Zero params -> null pointer.
2745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (NumParams) {
275fc767615bc67d3a7587b1fb2e0494c32c9dbd7a5Ted Kremenek    void *Mem = C.getAllocator().Allocate<ParmVarDecl*>(NumParams);
276fc767615bc67d3a7587b1fb2e0494c32c9dbd7a5Ted Kremenek    ParamInfo = new (Mem) ParmVarDecl*[NumParams];
2775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    memcpy(ParamInfo, NewParamInfo, sizeof(ParmVarDecl*)*NumParams);
2785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
2795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
2805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2818123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner/// getMinRequiredArguments - Returns the minimum number of arguments
2828123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner/// needed to call this function. This may be fewer than the number of
2838123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner/// function parameters, if some of the parameters have default
2849e979557eea3875c9e3d100c68188233dd7f46c0Chris Lattner/// arguments (in C++).
2858123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattnerunsigned FunctionDecl::getMinRequiredArguments() const {
2868123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner  unsigned NumRequiredArgs = getNumParams();
2878123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner  while (NumRequiredArgs > 0
2888123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner         && getParamDecl(NumRequiredArgs-1)->getDefaultArg())
2898123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner    --NumRequiredArgs;
2908123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner
2918123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner  return NumRequiredArgs;
2928123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner}
2938123a95c33b792d35c2e4992ba6e27882748fb0dChris Lattner
2941cd1b1e987f5e2f060d7972b13d83239b36d77d6Douglas Gregor/// getOverloadedOperator - Which C++ overloaded operator this
2951cd1b1e987f5e2f060d7972b13d83239b36d77d6Douglas Gregor/// function represents, if any.
2961cd1b1e987f5e2f060d7972b13d83239b36d77d6Douglas GregorOverloadedOperatorKind FunctionDecl::getOverloadedOperator() const {
297e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor  if (getDeclName().getNameKind() == DeclarationName::CXXOperatorName)
298e94ca9e4371c022329270436b3dd77adc4ddfa8fDouglas Gregor    return getDeclName().getCXXOverloadedOperator();
2991cd1b1e987f5e2f060d7972b13d83239b36d77d6Douglas Gregor  else
3001cd1b1e987f5e2f060d7972b13d83239b36d77d6Douglas Gregor    return OO_None;
3011cd1b1e987f5e2f060d7972b13d83239b36d77d6Douglas Gregor}
3021cd1b1e987f5e2f060d7972b13d83239b36d77d6Douglas Gregor
3038a934233d1582b5bde9d270bc0705aa81e471a79Chris Lattner//===----------------------------------------------------------------------===//
304bcbffc46f1ad3796c4582fa1e3a9113b5aa26061Douglas Gregor// TagDecl Implementation
3054b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek//===----------------------------------------------------------------------===//
3064b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek
3070b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregorvoid TagDecl::startDefinition() {
3080b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregor  cast<TagType>(TypeForDecl)->decl.setPointer(this);
3090b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregor  cast<TagType>(TypeForDecl)->decl.setInt(1);
3100b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregor}
3110b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregor
3120b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregorvoid TagDecl::completeDefinition() {
3130b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregor  assert((!TypeForDecl ||
3140b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregor          cast<TagType>(TypeForDecl)->decl.getPointer() == this) &&
3150b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregor         "Attempt to redefine a tag definition?");
3160b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregor  IsDefinition = true;
3170b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregor  cast<TagType>(TypeForDecl)->decl.setPointer(this);
3180b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregor  cast<TagType>(TypeForDecl)->decl.setInt(0);
3190b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregor}
3200b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregor
3214b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed KremenekTagDecl* TagDecl::getDefinition(ASTContext& C) const {
3224b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek  QualType T = C.getTypeDeclType(const_cast<TagDecl*>(this));
3234b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek  TagDecl* D = cast<TagDecl>(cast<TagType>(T)->getDecl());
3244b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek  return D->isDefinition() ? D : 0;
3254b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek}
3264b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek
3274b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek//===----------------------------------------------------------------------===//
3288a934233d1582b5bde9d270bc0705aa81e471a79Chris Lattner// RecordDecl Implementation
3298a934233d1582b5bde9d270bc0705aa81e471a79Chris Lattner//===----------------------------------------------------------------------===//
3305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
33135bc0821c4f80041724cd4c5c4889b2581546a41Argyrios KyrtzidisRecordDecl::RecordDecl(Kind DK, TagKind TK, DeclContext *DC, SourceLocation L,
332df042e6c2bf06b2d9ed53c52469599ac1bd93a3fTed Kremenek                       IdentifierInfo *Id)
33372de6676bd30f9081ee4166bbe07b4c270258ce6Douglas Gregor  : TagDecl(DK, TK, DC, L, Id, 0) {
3346359792ca92e7ca2f416cb804c6604358174e994Ted Kremenek  HasFlexibleArrayMember = false;
335bcbffc46f1ad3796c4582fa1e3a9113b5aa26061Douglas Gregor  AnonymousStructOrUnion = false;
3366359792ca92e7ca2f416cb804c6604358174e994Ted Kremenek  assert(classof(static_cast<Decl*>(this)) && "Invalid Kind!");
3376359792ca92e7ca2f416cb804c6604358174e994Ted Kremenek}
3386359792ca92e7ca2f416cb804c6604358174e994Ted Kremenek
3396359792ca92e7ca2f416cb804c6604358174e994Ted KremenekRecordDecl *RecordDecl::Create(ASTContext &C, TagKind TK, DeclContext *DC,
3404b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek                               SourceLocation L, IdentifierInfo *Id,
3414b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek                               RecordDecl* PrevDecl) {
342df042e6c2bf06b2d9ed53c52469599ac1bd93a3fTed Kremenek
3436359792ca92e7ca2f416cb804c6604358174e994Ted Kremenek  void *Mem = C.getAllocator().Allocate<RecordDecl>();
34435bc0821c4f80041724cd4c5c4889b2581546a41Argyrios Kyrtzidis  RecordDecl* R = new (Mem) RecordDecl(Record, TK, DC, L, Id);
3454b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek  C.getTypeDeclType(R, PrevDecl);
3464b7c98378ae0c1a3635f0b7756848b4a9923f8bcTed Kremenek  return R;
3476359792ca92e7ca2f416cb804c6604358174e994Ted Kremenek}
3486359792ca92e7ca2f416cb804c6604358174e994Ted Kremenek
349997b6c6d73541f010afc81e28191c8eae7b24f77Argyrios KyrtzidisRecordDecl::~RecordDecl() {
350997b6c6d73541f010afc81e28191c8eae7b24f77Argyrios Kyrtzidis}
351997b6c6d73541f010afc81e28191c8eae7b24f77Argyrios Kyrtzidis
352997b6c6d73541f010afc81e28191c8eae7b24f77Argyrios Kyrtzidisvoid RecordDecl::Destroy(ASTContext& C) {
35344b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor  DeclContext::DestroyDecls(C);
354997b6c6d73541f010afc81e28191c8eae7b24f77Argyrios Kyrtzidis  TagDecl::Destroy(C);
355997b6c6d73541f010afc81e28191c8eae7b24f77Argyrios Kyrtzidis}
356997b6c6d73541f010afc81e28191c8eae7b24f77Argyrios Kyrtzidis
35744b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor/// completeDefinition - Notes that the definition of this type is now
35844b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor/// complete.
35944b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregorvoid RecordDecl::completeDefinition(ASTContext& C) {
3605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  assert(!isDefinition() && "Cannot redefine record!");
3610b7a158d120ac8d78c114a823e17eedfec6b6658Douglas Gregor  TagDecl::completeDefinition();
3625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
3635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
36456ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff//===----------------------------------------------------------------------===//
36556ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff// BlockDecl Implementation
36656ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff//===----------------------------------------------------------------------===//
36756ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff
36856ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve NaroffBlockDecl::~BlockDecl() {
36956ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff}
37056ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff
37156ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroffvoid BlockDecl::Destroy(ASTContext& C) {
37256ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff  if (Body)
37356ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff    Body->Destroy(C);
37456ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff
37556ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff  for (param_iterator I=param_begin(), E=param_end(); I!=E; ++I)
37656ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff    (*I)->Destroy(C);
37756ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff
37856ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff  Decl::Destroy(C);
37956ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff}
380