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