DeclBase.cpp revision d40910b581b09c937a8c1fdcde9b8ec724398fb9
156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman//===--- DeclBase.cpp - Declaration AST Node Implementation ---------------===//
256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman//
356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman//                     The LLVM Compiler Infrastructure
456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman//
556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman// This file is distributed under the University of Illinois Open Source
656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman// License. See LICENSE.TXT for details.
756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman//
856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman//===----------------------------------------------------------------------===//
956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman//
1056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman// This file implements the Decl and DeclContext classes.
1156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman//
1256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman//===----------------------------------------------------------------------===//
1356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman
1456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman#include "clang/AST/DeclBase.h"
15e91593ef084479340582b2ba177b44be50a717b7Daniel Dunbar#include "clang/AST/DeclObjC.h"
16d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis#include "clang/AST/DeclCXX.h"
1756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman#include "clang/AST/ASTContext.h"
1856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman#include "llvm/ADT/DenseMap.h"
1956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanusing namespace clang;
2056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman
2156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman//===----------------------------------------------------------------------===//
2256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman//  Statistics
2356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman//===----------------------------------------------------------------------===//
2456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman
2556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman// temporary statistics gathering
2656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanstatic unsigned nFuncs = 0;
2756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanstatic unsigned nVars = 0;
2856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanstatic unsigned nParmVars = 0;
2956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanstatic unsigned nSUC = 0;
3055d71f9f4cf5f123db5d6dcfd20f3a8d5699c226Argyrios Kyrtzidisstatic unsigned nCXXSUC = 0;
3156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanstatic unsigned nEnumConst = 0;
3256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanstatic unsigned nEnumDecls = 0;
3356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanstatic unsigned nNamespaces = 0;
348e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregorstatic unsigned nOverFuncs = 0;
3556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanstatic unsigned nTypedef = 0;
3656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanstatic unsigned nFieldDecls = 0;
3755d71f9f4cf5f123db5d6dcfd20f3a8d5699c226Argyrios Kyrtzidisstatic unsigned nCXXFieldDecls = 0;
3856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanstatic unsigned nInterfaceDecls = 0;
3956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanstatic unsigned nClassDecls = 0;
4056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanstatic unsigned nMethodDecls = 0;
4156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanstatic unsigned nProtocolDecls = 0;
4256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanstatic unsigned nForwardProtocolDecls = 0;
4356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanstatic unsigned nCategoryDecls = 0;
4456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanstatic unsigned nIvarDecls = 0;
4501e6779faca1e3a3164c697d6e2dfee0881a6981Ted Kremenekstatic unsigned nAtDefsFieldDecls = 0;
4656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanstatic unsigned nObjCImplementationDecls = 0;
4756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanstatic unsigned nObjCCategoryImpl = 0;
4856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanstatic unsigned nObjCCompatibleAlias = 0;
4956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanstatic unsigned nObjCPropertyDecl = 0;
5056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanstatic unsigned nObjCPropertyImplDecl = 0;
5156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanstatic unsigned nLinkageSpecDecl = 0;
5256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanstatic unsigned nFileScopeAsmDecl = 0;
5356ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroffstatic unsigned nBlockDecls = 0;
5456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman
5556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanstatic bool StatSwitch = false;
5656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman
5756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman// This keeps track of all decl attributes. Since so few decls have attrs, we
5856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman// keep them in a hash map instead of wasting space in the Decl class.
5956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmantypedef llvm::DenseMap<const Decl*, Attr*> DeclAttrMapTy;
6056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman
6156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanstatic DeclAttrMapTy *DeclAttrs = 0;
6256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman
6356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanconst char *Decl::getDeclKindName() const {
6456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  switch (DeclKind) {
6556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  default: assert(0 && "Unknown decl kind!");
6656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  case Namespace:           return "Namespace";
678e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor  case OverloadedFunction:  return "OverloadedFunction";
6856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  case Typedef:             return "Typedef";
6956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  case Function:            return "Function";
7056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  case Var:                 return "Var";
7156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  case ParmVar:             return "ParmVar";
7256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  case EnumConstant:        return "EnumConstant";
7356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  case ObjCIvar:            return "ObjCIvar";
7456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  case ObjCInterface:       return "ObjCInterface";
75d40910b581b09c937a8c1fdcde9b8ec724398fb9Steve Naroff  case ObjCImplementation:  return "ObjCImplementation";
7656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  case ObjCClass:           return "ObjCClass";
7756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  case ObjCMethod:          return "ObjCMethod";
7856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  case ObjCProtocol:        return "ObjCProtocol";
79d40910b581b09c937a8c1fdcde9b8ec724398fb9Steve Naroff  case ObjCProperty:        return "ObjCProperty";
80d40910b581b09c937a8c1fdcde9b8ec724398fb9Steve Naroff  case ObjCPropertyImpl:    return "ObjCPropertyImpl";
8156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  case ObjCForwardProtocol: return "ObjCForwardProtocol";
8235bc0821c4f80041724cd4c5c4889b2581546a41Argyrios Kyrtzidis  case Record:              return "Record";
8335bc0821c4f80041724cd4c5c4889b2581546a41Argyrios Kyrtzidis  case CXXRecord:           return "CXXRecord";
8456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  case Enum:                return "Enum";
8556ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff  case Block:               return "Block";
8656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  }
8756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman}
8856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman
8956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanbool Decl::CollectingStats(bool Enable) {
9056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  if (Enable)
9156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman    StatSwitch = true;
9256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  return StatSwitch;
9356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman}
9456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman
9556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanvoid Decl::PrintStats() {
9656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  fprintf(stderr, "*** Decl Stats:\n");
9756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  fprintf(stderr, "  %d decls total.\n",
9855d71f9f4cf5f123db5d6dcfd20f3a8d5699c226Argyrios Kyrtzidis          int(nFuncs+nVars+nParmVars+nFieldDecls+nSUC+nCXXFieldDecls+nCXXSUC+
9956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman              nEnumDecls+nEnumConst+nTypedef+nInterfaceDecls+nClassDecls+
10056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman              nMethodDecls+nProtocolDecls+nCategoryDecls+nIvarDecls+
1018e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor              nAtDefsFieldDecls+nNamespaces+nOverFuncs));
10256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  fprintf(stderr, "    %d namespace decls, %d each (%d bytes)\n",
10356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman          nNamespaces, (int)sizeof(NamespaceDecl),
10456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman          int(nNamespaces*sizeof(NamespaceDecl)));
1058e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor  fprintf(stderr, "    %d overloaded function decls, %d each (%d bytes)\n",
1068e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor          nOverFuncs, (int)sizeof(OverloadedFunctionDecl),
1078e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor          int(nOverFuncs*sizeof(OverloadedFunctionDecl)));
10856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  fprintf(stderr, "    %d function decls, %d each (%d bytes)\n",
10956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman          nFuncs, (int)sizeof(FunctionDecl), int(nFuncs*sizeof(FunctionDecl)));
11056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  fprintf(stderr, "    %d variable decls, %d each (%d bytes)\n",
11156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman          nVars, (int)sizeof(VarDecl),
11256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman          int(nVars*sizeof(VarDecl)));
11356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  fprintf(stderr, "    %d parameter variable decls, %d each (%d bytes)\n",
11456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman          nParmVars, (int)sizeof(ParmVarDecl),
11556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman          int(nParmVars*sizeof(ParmVarDecl)));
11656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  fprintf(stderr, "    %d field decls, %d each (%d bytes)\n",
11756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman          nFieldDecls, (int)sizeof(FieldDecl),
11856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman          int(nFieldDecls*sizeof(FieldDecl)));
11901e6779faca1e3a3164c697d6e2dfee0881a6981Ted Kremenek  fprintf(stderr, "    %d @defs generated field decls, %d each (%d bytes)\n",
12001e6779faca1e3a3164c697d6e2dfee0881a6981Ted Kremenek          nAtDefsFieldDecls, (int)sizeof(ObjCAtDefsFieldDecl),
12101e6779faca1e3a3164c697d6e2dfee0881a6981Ted Kremenek          int(nAtDefsFieldDecls*sizeof(ObjCAtDefsFieldDecl)));
12256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  fprintf(stderr, "    %d struct/union/class decls, %d each (%d bytes)\n",
12356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman          nSUC, (int)sizeof(RecordDecl),
12456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman          int(nSUC*sizeof(RecordDecl)));
12555d71f9f4cf5f123db5d6dcfd20f3a8d5699c226Argyrios Kyrtzidis  fprintf(stderr, "    %d C++ field decls, %d each (%d bytes)\n",
12655d71f9f4cf5f123db5d6dcfd20f3a8d5699c226Argyrios Kyrtzidis          nCXXFieldDecls, (int)sizeof(CXXFieldDecl),
12755d71f9f4cf5f123db5d6dcfd20f3a8d5699c226Argyrios Kyrtzidis          int(nCXXFieldDecls*sizeof(CXXFieldDecl)));
12855d71f9f4cf5f123db5d6dcfd20f3a8d5699c226Argyrios Kyrtzidis  fprintf(stderr, "    %d C++ struct/union/class decls, %d each (%d bytes)\n",
12955d71f9f4cf5f123db5d6dcfd20f3a8d5699c226Argyrios Kyrtzidis          nCXXSUC, (int)sizeof(CXXRecordDecl),
13055d71f9f4cf5f123db5d6dcfd20f3a8d5699c226Argyrios Kyrtzidis          int(nCXXSUC*sizeof(CXXRecordDecl)));
13156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  fprintf(stderr, "    %d enum decls, %d each (%d bytes)\n",
13256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman          nEnumDecls, (int)sizeof(EnumDecl),
13356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman          int(nEnumDecls*sizeof(EnumDecl)));
13456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  fprintf(stderr, "    %d enum constant decls, %d each (%d bytes)\n",
13556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman          nEnumConst, (int)sizeof(EnumConstantDecl),
13656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman          int(nEnumConst*sizeof(EnumConstantDecl)));
13756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  fprintf(stderr, "    %d typedef decls, %d each (%d bytes)\n",
13856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman          nTypedef, (int)sizeof(TypedefDecl),int(nTypedef*sizeof(TypedefDecl)));
13956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  // Objective-C decls...
14056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  fprintf(stderr, "    %d interface decls, %d each (%d bytes)\n",
14156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman          nInterfaceDecls, (int)sizeof(ObjCInterfaceDecl),
14256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman          int(nInterfaceDecls*sizeof(ObjCInterfaceDecl)));
14356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  fprintf(stderr, "    %d instance variable decls, %d each (%d bytes)\n",
14456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman          nIvarDecls, (int)sizeof(ObjCIvarDecl),
14556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman          int(nIvarDecls*sizeof(ObjCIvarDecl)));
14656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  fprintf(stderr, "    %d class decls, %d each (%d bytes)\n",
14756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman          nClassDecls, (int)sizeof(ObjCClassDecl),
14856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman          int(nClassDecls*sizeof(ObjCClassDecl)));
14956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  fprintf(stderr, "    %d method decls, %d each (%d bytes)\n",
15056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman          nMethodDecls, (int)sizeof(ObjCMethodDecl),
15156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman          int(nMethodDecls*sizeof(ObjCMethodDecl)));
15256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  fprintf(stderr, "    %d protocol decls, %d each (%d bytes)\n",
15356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman          nProtocolDecls, (int)sizeof(ObjCProtocolDecl),
15456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman          int(nProtocolDecls*sizeof(ObjCProtocolDecl)));
15556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  fprintf(stderr, "    %d forward protocol decls, %d each (%d bytes)\n",
15656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman          nForwardProtocolDecls, (int)sizeof(ObjCForwardProtocolDecl),
15756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman          int(nForwardProtocolDecls*sizeof(ObjCForwardProtocolDecl)));
15856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  fprintf(stderr, "    %d category decls, %d each (%d bytes)\n",
15956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman          nCategoryDecls, (int)sizeof(ObjCCategoryDecl),
16056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman          int(nCategoryDecls*sizeof(ObjCCategoryDecl)));
16156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman
16256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  fprintf(stderr, "    %d class implementation decls, %d each (%d bytes)\n",
16356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman          nObjCImplementationDecls, (int)sizeof(ObjCImplementationDecl),
16456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman          int(nObjCImplementationDecls*sizeof(ObjCImplementationDecl)));
16556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman
16656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  fprintf(stderr, "    %d class implementation decls, %d each (%d bytes)\n",
16756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman          nObjCCategoryImpl, (int)sizeof(ObjCCategoryImplDecl),
16856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman          int(nObjCCategoryImpl*sizeof(ObjCCategoryImplDecl)));
16956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman
17056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  fprintf(stderr, "    %d compatibility alias decls, %d each (%d bytes)\n",
17156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman          nObjCCompatibleAlias, (int)sizeof(ObjCCompatibleAliasDecl),
17256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman          int(nObjCCompatibleAlias*sizeof(ObjCCompatibleAliasDecl)));
17356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman
17456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  fprintf(stderr, "    %d property decls, %d each (%d bytes)\n",
17556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman          nObjCPropertyDecl, (int)sizeof(ObjCPropertyDecl),
17656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman          int(nObjCPropertyDecl*sizeof(ObjCPropertyDecl)));
17756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman
17856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  fprintf(stderr, "    %d property implementation decls, %d each (%d bytes)\n",
17956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman          nObjCPropertyImplDecl, (int)sizeof(ObjCPropertyImplDecl),
18056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman          int(nObjCPropertyImplDecl*sizeof(ObjCPropertyImplDecl)));
18156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman
18256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  fprintf(stderr, "Total bytes = %d\n",
18356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman          int(nFuncs*sizeof(FunctionDecl)+
18456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman              nVars*sizeof(VarDecl)+nParmVars*sizeof(ParmVarDecl)+
18556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman              nFieldDecls*sizeof(FieldDecl)+nSUC*sizeof(RecordDecl)+
18655d71f9f4cf5f123db5d6dcfd20f3a8d5699c226Argyrios Kyrtzidis              nCXXFieldDecls*sizeof(CXXFieldDecl)+nCXXSUC*sizeof(CXXRecordDecl)+
18756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman              nEnumDecls*sizeof(EnumDecl)+nEnumConst*sizeof(EnumConstantDecl)+
18856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman              nTypedef*sizeof(TypedefDecl)+
18956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman              nInterfaceDecls*sizeof(ObjCInterfaceDecl)+
19056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman              nIvarDecls*sizeof(ObjCIvarDecl)+
19156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman              nClassDecls*sizeof(ObjCClassDecl)+
19256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman              nMethodDecls*sizeof(ObjCMethodDecl)+
19356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman              nProtocolDecls*sizeof(ObjCProtocolDecl)+
19456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman              nForwardProtocolDecls*sizeof(ObjCForwardProtocolDecl)+
19556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman              nCategoryDecls*sizeof(ObjCCategoryDecl)+
19656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman              nObjCImplementationDecls*sizeof(ObjCImplementationDecl)+
19756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman              nObjCCategoryImpl*sizeof(ObjCCategoryImplDecl)+
19856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman              nObjCCompatibleAlias*sizeof(ObjCCompatibleAliasDecl)+
19956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman              nObjCPropertyDecl*sizeof(ObjCPropertyDecl)+
20056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman              nObjCPropertyImplDecl*sizeof(ObjCPropertyImplDecl)+
20156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman              nLinkageSpecDecl*sizeof(LinkageSpecDecl)+
20256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman              nFileScopeAsmDecl*sizeof(FileScopeAsmDecl)+
2038e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor              nNamespaces*sizeof(NamespaceDecl)+
2048e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor              nOverFuncs*sizeof(OverloadedFunctionDecl)));
20556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman
20656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman}
20756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman
20856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanvoid Decl::addDeclKind(Kind k) {
20956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  switch (k) {
21056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  case Namespace:           nNamespaces++; break;
2118e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor  case OverloadedFunction:  nOverFuncs++; break;
21256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  case Typedef:             nTypedef++; break;
21356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  case Function:            nFuncs++; break;
21456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  case Var:                 nVars++; break;
21556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  case ParmVar:             nParmVars++; break;
21656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  case EnumConstant:        nEnumConst++; break;
21756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  case Field:               nFieldDecls++; break;
21835bc0821c4f80041724cd4c5c4889b2581546a41Argyrios Kyrtzidis  case Record:              nSUC++; break;
21956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  case Enum:                nEnumDecls++; break;
22056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  case ObjCInterface:       nInterfaceDecls++; break;
22156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  case ObjCClass:           nClassDecls++; break;
22256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  case ObjCMethod:          nMethodDecls++; break;
22356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  case ObjCProtocol:        nProtocolDecls++; break;
22456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  case ObjCForwardProtocol: nForwardProtocolDecls++; break;
22556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  case ObjCCategory:        nCategoryDecls++; break;
22656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  case ObjCIvar:            nIvarDecls++; break;
22701e6779faca1e3a3164c697d6e2dfee0881a6981Ted Kremenek  case ObjCAtDefsField:     nAtDefsFieldDecls++; break;
22856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  case ObjCImplementation:  nObjCImplementationDecls++; break;
22956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  case ObjCCategoryImpl:    nObjCCategoryImpl++; break;
23056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  case ObjCCompatibleAlias: nObjCCompatibleAlias++; break;
23156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  case ObjCProperty:        nObjCPropertyDecl++; break;
23256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  case ObjCPropertyImpl:    nObjCPropertyImplDecl++; break;
23356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  case LinkageSpec:         nLinkageSpecDecl++; break;
23456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  case FileScopeAsm:        nFileScopeAsmDecl++; break;
23556ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff  case Block:               nBlockDecls++; break;
2364111024be81e7c0525e42dadcc126d27e5bf2425Chris Lattner  case ImplicitParam:
23756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  case TranslationUnit:     break;
238d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis
23955d71f9f4cf5f123db5d6dcfd20f3a8d5699c226Argyrios Kyrtzidis  case CXXField:            nCXXFieldDecls++; break;
24035bc0821c4f80041724cd4c5c4889b2581546a41Argyrios Kyrtzidis  case CXXRecord:           nCXXSUC++; break;
241d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis  // FIXME: Statistics for C++ decls.
242d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis  case CXXMethod:
243b48fe3812047e84164925c8938ce82be0624c40cDouglas Gregor  case CXXConstructor:
24442a552f8200ba5948661aee0106fce0c04e39818Douglas Gregor  case CXXDestructor:
2452f1bc5285ccd40f411af5f5993f013e27e74ab78Douglas Gregor  case CXXConversion:
246d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis  case CXXClassVar:
247d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis    break;
24856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  }
24956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman}
25056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman
25156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman//===----------------------------------------------------------------------===//
25256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman// Decl Implementation
25356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman//===----------------------------------------------------------------------===//
25456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman
25556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman// Out-of-line virtual method providing a home for Decl.
25656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli FriedmanDecl::~Decl() {
25756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  if (!HasAttrs)
25856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman    return;
25956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman
26056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  DeclAttrMapTy::iterator it = DeclAttrs->find(this);
26156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  assert(it != DeclAttrs->end() && "No attrs found but HasAttrs is true!");
26256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman
26356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  // release attributes.
26456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  delete it->second;
26556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  invalidateAttrs();
26656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman}
26756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman
26856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanvoid Decl::addAttr(Attr *NewAttr) {
26956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  if (!DeclAttrs)
27056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman    DeclAttrs = new DeclAttrMapTy();
27156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman
27256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  Attr *&ExistingAttr = (*DeclAttrs)[this];
27356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman
27456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  NewAttr->setNext(ExistingAttr);
27556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  ExistingAttr = NewAttr;
27656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman
27756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  HasAttrs = true;
27856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman}
27956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman
28056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanvoid Decl::invalidateAttrs() {
28156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  if (!HasAttrs) return;
28256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman
28356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  HasAttrs = false;
28456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  (*DeclAttrs)[this] = 0;
28556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  DeclAttrs->erase(this);
28656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman
28756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  if (DeclAttrs->empty()) {
28856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman    delete DeclAttrs;
28956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman    DeclAttrs = 0;
29056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  }
29156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman}
29256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman
29356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanconst Attr *Decl::getAttrs() const {
29456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  if (!HasAttrs)
29556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman    return 0;
29656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman
29756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  return (*DeclAttrs)[this];
29856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman}
29956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman
30056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanvoid Decl::swapAttrs(Decl *RHS) {
30156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  bool HasLHSAttr = this->HasAttrs;
30256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  bool HasRHSAttr = RHS->HasAttrs;
30356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman
30456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  // Usually, neither decl has attrs, nothing to do.
30556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  if (!HasLHSAttr && !HasRHSAttr) return;
30656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman
30756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  // If 'this' has no attrs, swap the other way.
30856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  if (!HasLHSAttr)
30956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman    return RHS->swapAttrs(this);
31056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman
31156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  // Handle the case when both decls have attrs.
31256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  if (HasRHSAttr) {
31356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman    std::swap((*DeclAttrs)[this], (*DeclAttrs)[RHS]);
31456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman    return;
31556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  }
31656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman
31756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  // Otherwise, LHS has an attr and RHS doesn't.
31856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  (*DeclAttrs)[RHS] = (*DeclAttrs)[this];
31956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  (*DeclAttrs).erase(this);
32056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  this->HasAttrs = false;
32156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  RHS->HasAttrs = true;
32256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman}
32356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman
32456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman
32556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanvoid Decl::Destroy(ASTContext& C) {
32656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman
32756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  if (ScopedDecl* SD = dyn_cast<ScopedDecl>(this)) {
32856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman
32956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman    // Observe the unrolled recursion.  By setting N->NextDeclarator = 0x0
33056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman    // within the loop, only the Destroy method for the first ScopedDecl
33156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman    // will deallocate all of the ScopedDecls in a chain.
33256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman
33356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman    ScopedDecl* N = SD->getNextDeclarator();
33456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman
33556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman    while (N) {
33656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman      ScopedDecl* Tmp = N->getNextDeclarator();
33756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman      N->NextDeclarator = 0x0;
33856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman      N->Destroy(C);
33956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman      N = Tmp;
34056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman    }
34156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  }
34256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman
34356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  this->~Decl();
34456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  C.getAllocator().Deallocate((void *)this);
34556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman}
34656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman
34742220c5432c141d47cc8ce786e472b49dc907378Argyrios KyrtzidisDecl *Decl::castFromDeclContext (const DeclContext *D) {
34842220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidis  return DeclContext::CastTo<Decl>(D);
34942220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidis}
35042220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidis
35142220c5432c141d47cc8ce786e472b49dc907378Argyrios KyrtzidisDeclContext *Decl::castToDeclContext(const Decl *D) {
35242220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidis  return DeclContext::CastTo<DeclContext>(D);
35342220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidis}
35442220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidis
35556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman//===----------------------------------------------------------------------===//
35656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman// DeclContext Implementation
35756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman//===----------------------------------------------------------------------===//
35856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman
35920bc6762282d192bd19be03094d4f311710e020cArgyrios Kyrtzidisconst DeclContext *DeclContext::getParent() const {
36020bc6762282d192bd19be03094d4f311710e020cArgyrios Kyrtzidis  if (const ScopedDecl *SD = dyn_cast<ScopedDecl>(this))
36156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman    return SD->getDeclContext();
36220bc6762282d192bd19be03094d4f311710e020cArgyrios Kyrtzidis  else if (const BlockDecl *BD = dyn_cast<BlockDecl>(this))
363090276f5e164d491a1bb3f541bafdb394f5e6f04Steve Naroff    return BD->getParentContext();
36456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman  else
36556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman    return NULL;
36656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman}
36777407b802130b1c44b1f63b855722a5376f57bcaArgyrios Kyrtzidis
36877407b802130b1c44b1f63b855722a5376f57bcaArgyrios Kyrtzidisconst DeclContext *DeclContext::getLexicalParent() const {
36977407b802130b1c44b1f63b855722a5376f57bcaArgyrios Kyrtzidis  if (const ScopedDecl *SD = dyn_cast<ScopedDecl>(this))
37077407b802130b1c44b1f63b855722a5376f57bcaArgyrios Kyrtzidis    return SD->getLexicalDeclContext();
371051c13a4a99c651e404b4a3160e1173b427eee17Argyrios Kyrtzidis  return getParent();
37277407b802130b1c44b1f63b855722a5376f57bcaArgyrios Kyrtzidis}
373