DeclBase.cpp revision c36c540c5bfce941f3d892919394d092491211f2
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" 1564650af7cc4352c6c67b9bd1bf8ef3ce7471b910Douglas Gregor#include "clang/AST/Decl.h" 16c2ee10d79f70036af652a395ac1f8273f3d04e12Douglas Gregor#include "clang/AST/DeclContextInternals.h" 17d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis#include "clang/AST/DeclCXX.h" 18aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor#include "clang/AST/DeclObjC.h" 19aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor#include "clang/AST/DeclTemplate.h" 2056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman#include "clang/AST/ASTContext.h" 2144b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor#include "clang/AST/Type.h" 2256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman#include "llvm/ADT/DenseMap.h" 2349f28ca787d8db7cac3c8898334f70ea55374c98Chris Lattner#include "llvm/Support/raw_ostream.h" 246ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor#include <algorithm> 253daed52a57d03765223021f5f921bdc280c8f3ccChris Lattner#include <cstdio> 263fc749d899dfc194162128c1a88933148a39b68dDouglas Gregor#include <vector> 2756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanusing namespace clang; 2856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 2956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman//===----------------------------------------------------------------------===// 3056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman// Statistics 3156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman//===----------------------------------------------------------------------===// 3256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 3364650af7cc4352c6c67b9bd1bf8ef3ce7471b910Douglas Gregor#define DECL(Derived, Base) static int n##Derived##s = 0; 3464650af7cc4352c6c67b9bd1bf8ef3ce7471b910Douglas Gregor#include "clang/AST/DeclNodes.def" 3556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 3656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanstatic bool StatSwitch = false; 3756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 3856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman// This keeps track of all decl attributes. Since so few decls have attrs, we 3956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman// keep them in a hash map instead of wasting space in the Decl class. 4056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmantypedef llvm::DenseMap<const Decl*, Attr*> DeclAttrMapTy; 4156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 4256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanstatic DeclAttrMapTy *DeclAttrs = 0; 4356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 4456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanconst char *Decl::getDeclKindName() const { 4556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman switch (DeclKind) { 4664650af7cc4352c6c67b9bd1bf8ef3ce7471b910Douglas Gregor default: assert(0 && "Declaration not in DeclNodes.def!"); 4764650af7cc4352c6c67b9bd1bf8ef3ce7471b910Douglas Gregor#define DECL(Derived, Base) case Derived: return #Derived; 4864650af7cc4352c6c67b9bd1bf8ef3ce7471b910Douglas Gregor#include "clang/AST/DeclNodes.def" 4956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman } 5056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman} 5156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 520a4739305a984ef9b821cedad5f4fe235eb6ef7dSteve Naroffconst char *DeclContext::getDeclKindName() const { 530a4739305a984ef9b821cedad5f4fe235eb6ef7dSteve Naroff switch (DeclKind) { 5464650af7cc4352c6c67b9bd1bf8ef3ce7471b910Douglas Gregor default: assert(0 && "Declaration context not in DeclNodes.def!"); 551ad4dd78ec53c24ea9e752b216035d7aa666fe49Argyrios Kyrtzidis#define DECL(Derived, Base) case Decl::Derived: return #Derived; 5664650af7cc4352c6c67b9bd1bf8ef3ce7471b910Douglas Gregor#include "clang/AST/DeclNodes.def" 570a4739305a984ef9b821cedad5f4fe235eb6ef7dSteve Naroff } 580a4739305a984ef9b821cedad5f4fe235eb6ef7dSteve Naroff} 590a4739305a984ef9b821cedad5f4fe235eb6ef7dSteve Naroff 6056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanbool Decl::CollectingStats(bool Enable) { 6156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman if (Enable) 6256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman StatSwitch = true; 6356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman return StatSwitch; 6456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman} 6556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 6656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanvoid Decl::PrintStats() { 6756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman fprintf(stderr, "*** Decl Stats:\n"); 6856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 6964650af7cc4352c6c67b9bd1bf8ef3ce7471b910Douglas Gregor int totalDecls = 0; 7064650af7cc4352c6c67b9bd1bf8ef3ce7471b910Douglas Gregor#define DECL(Derived, Base) totalDecls += n##Derived##s; 7164650af7cc4352c6c67b9bd1bf8ef3ce7471b910Douglas Gregor#include "clang/AST/DeclNodes.def" 7264650af7cc4352c6c67b9bd1bf8ef3ce7471b910Douglas Gregor fprintf(stderr, " %d decls total.\n", totalDecls); 7364650af7cc4352c6c67b9bd1bf8ef3ce7471b910Douglas Gregor 7464650af7cc4352c6c67b9bd1bf8ef3ce7471b910Douglas Gregor int totalBytes = 0; 7564650af7cc4352c6c67b9bd1bf8ef3ce7471b910Douglas Gregor#define DECL(Derived, Base) \ 7664650af7cc4352c6c67b9bd1bf8ef3ce7471b910Douglas Gregor if (n##Derived##s > 0) { \ 7764650af7cc4352c6c67b9bd1bf8ef3ce7471b910Douglas Gregor totalBytes += (int)(n##Derived##s * sizeof(Derived##Decl)); \ 7864650af7cc4352c6c67b9bd1bf8ef3ce7471b910Douglas Gregor fprintf(stderr, " %d " #Derived " decls, %d each (%d bytes)\n", \ 7964650af7cc4352c6c67b9bd1bf8ef3ce7471b910Douglas Gregor n##Derived##s, (int)sizeof(Derived##Decl), \ 8064650af7cc4352c6c67b9bd1bf8ef3ce7471b910Douglas Gregor (int)(n##Derived##s * sizeof(Derived##Decl))); \ 8164650af7cc4352c6c67b9bd1bf8ef3ce7471b910Douglas Gregor } 8264650af7cc4352c6c67b9bd1bf8ef3ce7471b910Douglas Gregor#include "clang/AST/DeclNodes.def" 8356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 8464650af7cc4352c6c67b9bd1bf8ef3ce7471b910Douglas Gregor fprintf(stderr, "Total bytes = %d\n", totalBytes); 8556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman} 8656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 8756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanvoid Decl::addDeclKind(Kind k) { 8856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman switch (k) { 8964650af7cc4352c6c67b9bd1bf8ef3ce7471b910Douglas Gregor default: assert(0 && "Declaration not in DeclNodes.def!"); 9064650af7cc4352c6c67b9bd1bf8ef3ce7471b910Douglas Gregor#define DECL(Derived, Base) case Derived: ++n##Derived##s; break; 9164650af7cc4352c6c67b9bd1bf8ef3ce7471b910Douglas Gregor#include "clang/AST/DeclNodes.def" 9256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman } 9356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman} 9456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 9556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman//===----------------------------------------------------------------------===// 9649f28ca787d8db7cac3c8898334f70ea55374c98Chris Lattner// PrettyStackTraceDecl Implementation 9749f28ca787d8db7cac3c8898334f70ea55374c98Chris Lattner//===----------------------------------------------------------------------===// 9849f28ca787d8db7cac3c8898334f70ea55374c98Chris Lattner 9949f28ca787d8db7cac3c8898334f70ea55374c98Chris Lattnervoid PrettyStackTraceDecl::print(llvm::raw_ostream &OS) const { 10049f28ca787d8db7cac3c8898334f70ea55374c98Chris Lattner SourceLocation TheLoc = Loc; 10149f28ca787d8db7cac3c8898334f70ea55374c98Chris Lattner if (TheLoc.isInvalid() && TheDecl) 10249f28ca787d8db7cac3c8898334f70ea55374c98Chris Lattner TheLoc = TheDecl->getLocation(); 10349f28ca787d8db7cac3c8898334f70ea55374c98Chris Lattner 10449f28ca787d8db7cac3c8898334f70ea55374c98Chris Lattner if (TheLoc.isValid()) { 10549f28ca787d8db7cac3c8898334f70ea55374c98Chris Lattner TheLoc.print(OS, SM); 10649f28ca787d8db7cac3c8898334f70ea55374c98Chris Lattner OS << ": "; 10749f28ca787d8db7cac3c8898334f70ea55374c98Chris Lattner } 10849f28ca787d8db7cac3c8898334f70ea55374c98Chris Lattner 10949f28ca787d8db7cac3c8898334f70ea55374c98Chris Lattner OS << Message; 11049f28ca787d8db7cac3c8898334f70ea55374c98Chris Lattner 11149f28ca787d8db7cac3c8898334f70ea55374c98Chris Lattner if (NamedDecl *DN = dyn_cast_or_null<NamedDecl>(TheDecl)) 11249f28ca787d8db7cac3c8898334f70ea55374c98Chris Lattner OS << " '" << DN->getQualifiedNameAsString() << '\''; 11349f28ca787d8db7cac3c8898334f70ea55374c98Chris Lattner OS << '\n'; 11449f28ca787d8db7cac3c8898334f70ea55374c98Chris Lattner} 11549f28ca787d8db7cac3c8898334f70ea55374c98Chris Lattner 11649f28ca787d8db7cac3c8898334f70ea55374c98Chris Lattner//===----------------------------------------------------------------------===// 11756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman// Decl Implementation 11856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman//===----------------------------------------------------------------------===// 11956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 120769dbdf467681f6020ff248b969c2d41a4fdccd3Chris Lattner// Out-of-line virtual method providing a home for Decl. 121769dbdf467681f6020ff248b969c2d41a4fdccd3Chris LattnerDecl::~Decl() { 122769dbdf467681f6020ff248b969c2d41a4fdccd3Chris Lattner if (isOutOfSemaDC()) 123769dbdf467681f6020ff248b969c2d41a4fdccd3Chris Lattner delete getMultipleDC(); 124769dbdf467681f6020ff248b969c2d41a4fdccd3Chris Lattner 125769dbdf467681f6020ff248b969c2d41a4fdccd3Chris Lattner assert(!HasAttrs && "attributes should have been freed by Destroy"); 126769dbdf467681f6020ff248b969c2d41a4fdccd3Chris Lattner} 127769dbdf467681f6020ff248b969c2d41a4fdccd3Chris Lattner 1284afa39deaa245592977136d367251ee2c173dd8dDouglas Gregorvoid Decl::setDeclContext(DeclContext *DC) { 1294afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor if (isOutOfSemaDC()) 1304afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor delete getMultipleDC(); 1314afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor 132ee219fd5f2776d8dd39d857f87304297b5ed743aChris Lattner DeclCtx = DC; 1334afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor} 1344afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor 1354afa39deaa245592977136d367251ee2c173dd8dDouglas Gregorvoid Decl::setLexicalDeclContext(DeclContext *DC) { 1364afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor if (DC == getLexicalDeclContext()) 1374afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor return; 1384afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor 1394afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor if (isInSemaDC()) { 1404afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor MultipleDC *MDC = new MultipleDC(); 1414afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor MDC->SemanticDC = getDeclContext(); 1424afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor MDC->LexicalDC = DC; 143ee219fd5f2776d8dd39d857f87304297b5ed743aChris Lattner DeclCtx = MDC; 1444afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor } else { 1454afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor getMultipleDC()->LexicalDC = DC; 1464afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor } 1474afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor} 1484afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor 149769dbdf467681f6020ff248b969c2d41a4fdccd3Chris Lattnerunsigned Decl::getIdentifierNamespaceForKind(Kind DeclKind) { 150769dbdf467681f6020ff248b969c2d41a4fdccd3Chris Lattner switch (DeclKind) { 151769dbdf467681f6020ff248b969c2d41a4fdccd3Chris Lattner default: 152769dbdf467681f6020ff248b969c2d41a4fdccd3Chris Lattner if (DeclKind >= FunctionFirst && DeclKind <= FunctionLast) 153769dbdf467681f6020ff248b969c2d41a4fdccd3Chris Lattner return IDNS_Ordinary; 154769dbdf467681f6020ff248b969c2d41a4fdccd3Chris Lattner assert(0 && "Unknown decl kind!"); 155769dbdf467681f6020ff248b969c2d41a4fdccd3Chris Lattner case OverloadedFunction: 156769dbdf467681f6020ff248b969c2d41a4fdccd3Chris Lattner case Typedef: 157769dbdf467681f6020ff248b969c2d41a4fdccd3Chris Lattner case EnumConstant: 158769dbdf467681f6020ff248b969c2d41a4fdccd3Chris Lattner case Var: 159769dbdf467681f6020ff248b969c2d41a4fdccd3Chris Lattner case ImplicitParam: 160769dbdf467681f6020ff248b969c2d41a4fdccd3Chris Lattner case ParmVar: 161769dbdf467681f6020ff248b969c2d41a4fdccd3Chris Lattner case OriginalParmVar: 162769dbdf467681f6020ff248b969c2d41a4fdccd3Chris Lattner case NonTypeTemplateParm: 163769dbdf467681f6020ff248b969c2d41a4fdccd3Chris Lattner case ObjCMethod: 164769dbdf467681f6020ff248b969c2d41a4fdccd3Chris Lattner case ObjCContainer: 165769dbdf467681f6020ff248b969c2d41a4fdccd3Chris Lattner case ObjCCategory: 166769dbdf467681f6020ff248b969c2d41a4fdccd3Chris Lattner case ObjCInterface: 167769dbdf467681f6020ff248b969c2d41a4fdccd3Chris Lattner case ObjCCategoryImpl: 168769dbdf467681f6020ff248b969c2d41a4fdccd3Chris Lattner case ObjCProperty: 169769dbdf467681f6020ff248b969c2d41a4fdccd3Chris Lattner case ObjCCompatibleAlias: 170769dbdf467681f6020ff248b969c2d41a4fdccd3Chris Lattner return IDNS_Ordinary; 171769dbdf467681f6020ff248b969c2d41a4fdccd3Chris Lattner 172769dbdf467681f6020ff248b969c2d41a4fdccd3Chris Lattner case ObjCProtocol: 173769dbdf467681f6020ff248b969c2d41a4fdccd3Chris Lattner return IDNS_Protocol; 174769dbdf467681f6020ff248b969c2d41a4fdccd3Chris Lattner 175769dbdf467681f6020ff248b969c2d41a4fdccd3Chris Lattner case Field: 176769dbdf467681f6020ff248b969c2d41a4fdccd3Chris Lattner case ObjCAtDefsField: 177769dbdf467681f6020ff248b969c2d41a4fdccd3Chris Lattner case ObjCIvar: 178769dbdf467681f6020ff248b969c2d41a4fdccd3Chris Lattner return IDNS_Member; 179769dbdf467681f6020ff248b969c2d41a4fdccd3Chris Lattner 180769dbdf467681f6020ff248b969c2d41a4fdccd3Chris Lattner case Record: 181769dbdf467681f6020ff248b969c2d41a4fdccd3Chris Lattner case CXXRecord: 182769dbdf467681f6020ff248b969c2d41a4fdccd3Chris Lattner case Enum: 183769dbdf467681f6020ff248b969c2d41a4fdccd3Chris Lattner case TemplateTypeParm: 184769dbdf467681f6020ff248b969c2d41a4fdccd3Chris Lattner return IDNS_Tag; 185769dbdf467681f6020ff248b969c2d41a4fdccd3Chris Lattner 186769dbdf467681f6020ff248b969c2d41a4fdccd3Chris Lattner case Namespace: 187769dbdf467681f6020ff248b969c2d41a4fdccd3Chris Lattner case Template: 188769dbdf467681f6020ff248b969c2d41a4fdccd3Chris Lattner case FunctionTemplate: 189769dbdf467681f6020ff248b969c2d41a4fdccd3Chris Lattner case ClassTemplate: 190769dbdf467681f6020ff248b969c2d41a4fdccd3Chris Lattner case TemplateTemplateParm: 191faf0e872f3409ecafbc458eabb22be76f79cb050Anders Carlsson case NamespaceAlias: 192769dbdf467681f6020ff248b969c2d41a4fdccd3Chris Lattner return IDNS_Tag | IDNS_Ordinary; 193769dbdf467681f6020ff248b969c2d41a4fdccd3Chris Lattner 194769dbdf467681f6020ff248b969c2d41a4fdccd3Chris Lattner // Never have names. 195769dbdf467681f6020ff248b969c2d41a4fdccd3Chris Lattner case LinkageSpec: 196769dbdf467681f6020ff248b969c2d41a4fdccd3Chris Lattner case FileScopeAsm: 197769dbdf467681f6020ff248b969c2d41a4fdccd3Chris Lattner case StaticAssert: 198769dbdf467681f6020ff248b969c2d41a4fdccd3Chris Lattner case ObjCClass: 199769dbdf467681f6020ff248b969c2d41a4fdccd3Chris Lattner case ObjCImplementation: 200769dbdf467681f6020ff248b969c2d41a4fdccd3Chris Lattner case ObjCPropertyImpl: 201769dbdf467681f6020ff248b969c2d41a4fdccd3Chris Lattner case ObjCForwardProtocol: 202769dbdf467681f6020ff248b969c2d41a4fdccd3Chris Lattner case Block: 203769dbdf467681f6020ff248b969c2d41a4fdccd3Chris Lattner case TranslationUnit: 204769dbdf467681f6020ff248b969c2d41a4fdccd3Chris Lattner 205769dbdf467681f6020ff248b969c2d41a4fdccd3Chris Lattner // Aren't looked up? 206769dbdf467681f6020ff248b969c2d41a4fdccd3Chris Lattner case UsingDirective: 207769dbdf467681f6020ff248b969c2d41a4fdccd3Chris Lattner case ClassTemplateSpecialization: 208769dbdf467681f6020ff248b969c2d41a4fdccd3Chris Lattner return 0; 209769dbdf467681f6020ff248b969c2d41a4fdccd3Chris Lattner } 21056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman} 21156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 21256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanvoid Decl::addAttr(Attr *NewAttr) { 21356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman if (!DeclAttrs) 21456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman DeclAttrs = new DeclAttrMapTy(); 21556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 21656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman Attr *&ExistingAttr = (*DeclAttrs)[this]; 21756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 21856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman NewAttr->setNext(ExistingAttr); 21956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman ExistingAttr = NewAttr; 22056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 22156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman HasAttrs = true; 22256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman} 22356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 22456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanvoid Decl::invalidateAttrs() { 22556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman if (!HasAttrs) return; 22656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 22756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman HasAttrs = false; 22856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman (*DeclAttrs)[this] = 0; 22956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman DeclAttrs->erase(this); 23056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 23156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman if (DeclAttrs->empty()) { 23256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman delete DeclAttrs; 23356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman DeclAttrs = 0; 23456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman } 23556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman} 23656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 23781abbdd848aa02c30242bd22dcc6ffe024ae2957Chris Lattnerconst Attr *Decl::getAttrsImpl() const { 23881abbdd848aa02c30242bd22dcc6ffe024ae2957Chris Lattner assert(HasAttrs && "getAttrs() should verify this!"); 23956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman return (*DeclAttrs)[this]; 24056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman} 24156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 24256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanvoid Decl::swapAttrs(Decl *RHS) { 24356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman bool HasLHSAttr = this->HasAttrs; 24456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman bool HasRHSAttr = RHS->HasAttrs; 24556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 24656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman // Usually, neither decl has attrs, nothing to do. 24756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman if (!HasLHSAttr && !HasRHSAttr) return; 24856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 24956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman // If 'this' has no attrs, swap the other way. 25056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman if (!HasLHSAttr) 25156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman return RHS->swapAttrs(this); 25256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 25356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman // Handle the case when both decls have attrs. 25456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman if (HasRHSAttr) { 25556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman std::swap((*DeclAttrs)[this], (*DeclAttrs)[RHS]); 25656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman return; 25756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman } 25856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 25956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman // Otherwise, LHS has an attr and RHS doesn't. 26056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman (*DeclAttrs)[RHS] = (*DeclAttrs)[this]; 26156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman (*DeclAttrs).erase(this); 26256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman this->HasAttrs = false; 26356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman RHS->HasAttrs = true; 26456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman} 26556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 26656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 267cc5814732edc0c382d0136ab57ec6149566043e2Chris Lattnervoid Decl::Destroy(ASTContext &C) { 268cc5814732edc0c382d0136ab57ec6149566043e2Chris Lattner // Free attributes for this decl. 269cc5814732edc0c382d0136ab57ec6149566043e2Chris Lattner if (HasAttrs) { 270cc5814732edc0c382d0136ab57ec6149566043e2Chris Lattner DeclAttrMapTy::iterator it = DeclAttrs->find(this); 271cc5814732edc0c382d0136ab57ec6149566043e2Chris Lattner assert(it != DeclAttrs->end() && "No attrs found but HasAttrs is true!"); 272cc5814732edc0c382d0136ab57ec6149566043e2Chris Lattner 273cc5814732edc0c382d0136ab57ec6149566043e2Chris Lattner // release attributes. 274cc5814732edc0c382d0136ab57ec6149566043e2Chris Lattner it->second->Destroy(C); 275cc5814732edc0c382d0136ab57ec6149566043e2Chris Lattner invalidateAttrs(); 276cc5814732edc0c382d0136ab57ec6149566043e2Chris Lattner HasAttrs = false; 277cc5814732edc0c382d0136ab57ec6149566043e2Chris Lattner } 278cc5814732edc0c382d0136ab57ec6149566043e2Chris Lattner 279a0fc55f3e9d7d7aa8761d0a9726033947d0d6bc0Douglas Gregor#if 0 28000ad0ef8369ee65337ff29c8db3c1841a01102c4Douglas Gregor // FIXME: Once ownership is fully understood, we can enable this code 28100ad0ef8369ee65337ff29c8db3c1841a01102c4Douglas Gregor if (DeclContext *DC = dyn_cast<DeclContext>(this)) 28200ad0ef8369ee65337ff29c8db3c1841a01102c4Douglas Gregor DC->decls_begin()->Destroy(C); 28356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 284244a67d911d08c3757a18ad666e4a268cf3ee285Chris Lattner // Observe the unrolled recursion. By setting N->NextDeclInContext = 0x0 2854afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor // within the loop, only the Destroy method for the first Decl 2864afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor // will deallocate all of the Decls in a chain. 2874afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor 288244a67d911d08c3757a18ad666e4a268cf3ee285Chris Lattner Decl* N = getNextDeclInContext(); 2894afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor 2904afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor while (N) { 291244a67d911d08c3757a18ad666e4a268cf3ee285Chris Lattner Decl* Tmp = N->getNextDeclInContext(); 292244a67d911d08c3757a18ad666e4a268cf3ee285Chris Lattner N->NextDeclInContext = 0; 2934afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor N->Destroy(C); 2944afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor N = Tmp; 29556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman } 296a0fc55f3e9d7d7aa8761d0a9726033947d0d6bc0Douglas Gregor 29756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman this->~Decl(); 2983e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff C.Deallocate((void *)this); 29900ad0ef8369ee65337ff29c8db3c1841a01102c4Douglas Gregor#endif 30056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman} 30156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 30242220c5432c141d47cc8ce786e472b49dc907378Argyrios KyrtzidisDecl *Decl::castFromDeclContext (const DeclContext *D) { 3033d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis Decl::Kind DK = D->getDeclKind(); 3043d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis switch(DK) { 3053d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis#define DECL_CONTEXT(Name) \ 3063d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis case Decl::Name: \ 3073d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis return static_cast<Name##Decl*>(const_cast<DeclContext*>(D)); 3083d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis#define DECL_CONTEXT_BASE(Name) 3093d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis#include "clang/AST/DeclNodes.def" 3103d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis default: 3113d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis#define DECL_CONTEXT_BASE(Name) \ 3123d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis if (DK >= Decl::Name##First && DK <= Decl::Name##Last) \ 3133d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis return static_cast<Name##Decl*>(const_cast<DeclContext*>(D)); 3143d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis#include "clang/AST/DeclNodes.def" 3153d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis assert(false && "a decl that inherits DeclContext isn't handled"); 3163d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis return 0; 3173d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis } 31842220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidis} 31942220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidis 32042220c5432c141d47cc8ce786e472b49dc907378Argyrios KyrtzidisDeclContext *Decl::castToDeclContext(const Decl *D) { 3213d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis Decl::Kind DK = D->getKind(); 3223d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis switch(DK) { 3233d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis#define DECL_CONTEXT(Name) \ 3243d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis case Decl::Name: \ 3253d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis return static_cast<Name##Decl*>(const_cast<Decl*>(D)); 3263d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis#define DECL_CONTEXT_BASE(Name) 3273d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis#include "clang/AST/DeclNodes.def" 3283d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis default: 3293d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis#define DECL_CONTEXT_BASE(Name) \ 3303d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis if (DK >= Decl::Name##First && DK <= Decl::Name##Last) \ 3313d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis return static_cast<Name##Decl*>(const_cast<Decl*>(D)); 3323d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis#include "clang/AST/DeclNodes.def" 3333d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis assert(false && "a decl that inherits DeclContext isn't handled"); 3343d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis return 0; 3353d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis } 33642220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidis} 33742220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidis 3381329c274628cc8c4e8ad472b41d1a78c8123f611Anders Carlsson#ifndef NDEBUG 3391329c274628cc8c4e8ad472b41d1a78c8123f611Anders Carlssonvoid Decl::CheckAccessDeclContext() const { 3405c27f2bfd2e19429dd9206f9b019e11d4a570acfDouglas Gregor assert((Access != AS_none || isa<TranslationUnitDecl>(this) || 3415c27f2bfd2e19429dd9206f9b019e11d4a570acfDouglas Gregor !isa<CXXRecordDecl>(getDeclContext())) && 3421329c274628cc8c4e8ad472b41d1a78c8123f611Anders Carlsson "Access specifier is AS_none inside a record decl"); 3431329c274628cc8c4e8ad472b41d1a78c8123f611Anders Carlsson} 3441329c274628cc8c4e8ad472b41d1a78c8123f611Anders Carlsson 3451329c274628cc8c4e8ad472b41d1a78c8123f611Anders Carlsson#endif 3461329c274628cc8c4e8ad472b41d1a78c8123f611Anders Carlsson 34756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman//===----------------------------------------------------------------------===// 34856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman// DeclContext Implementation 34956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman//===----------------------------------------------------------------------===// 35056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 3513d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidisbool DeclContext::classof(const Decl *D) { 3523d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis switch (D->getKind()) { 3533d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis#define DECL_CONTEXT(Name) case Decl::Name: 3543d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis#define DECL_CONTEXT_BASE(Name) 3553d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis#include "clang/AST/DeclNodes.def" 3563d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis return true; 3573d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis default: 3583d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis#define DECL_CONTEXT_BASE(Name) \ 3593d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis if (D->getKind() >= Decl::Name##First && \ 3603d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis D->getKind() <= Decl::Name##Last) \ 3613d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis return true; 3623d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis#include "clang/AST/DeclNodes.def" 3633d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis return false; 3643d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis } 3653d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis} 3663d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis 36744b4321feab46299d3f5cfd404680884752a0fcfDouglas GregorDeclContext::~DeclContext() { 368c36c540c5bfce941f3d892919394d092491211f2Douglas Gregor delete static_cast<StoredDeclsMap*>(LookupPtr); 36944b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor} 37044b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 37144b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregorvoid DeclContext::DestroyDecls(ASTContext &C) { 37200ad0ef8369ee65337ff29c8db3c1841a01102c4Douglas Gregor for (decl_iterator D = decls_begin(); D != decls_end(); ) 37300ad0ef8369ee65337ff29c8db3c1841a01102c4Douglas Gregor (*D++)->Destroy(C); 37444b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor} 37544b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 376074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregorbool DeclContext::isTransparentContext() const { 377074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor if (DeclKind == Decl::Enum) 378074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor return true; // FIXME: Check for C++0x scoped enums 379074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor else if (DeclKind == Decl::LinkageSpec) 380074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor return true; 38165100792a69a16895bd80f1d639b99e7ad903386Douglas Gregor else if (DeclKind >= Decl::RecordFirst && DeclKind <= Decl::RecordLast) 382bcbffc46f1ad3796c4582fa1e3a9113b5aa26061Douglas Gregor return cast<RecordDecl>(this)->isAnonymousStructOrUnion(); 383074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor else if (DeclKind == Decl::Namespace) 384074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor return false; // FIXME: Check for C++0x inline namespaces 385074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor 386074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor return false; 387074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor} 388074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor 3890701bbb228dfd87e1fe82a0a4b7b9facfecb43daSteve NaroffDeclContext *DeclContext::getPrimaryContext() { 39044b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor switch (DeclKind) { 39144b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor case Decl::TranslationUnit: 392074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor case Decl::LinkageSpec: 393074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor case Decl::Block: 39444b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor // There is only one DeclContext for these entities. 39544b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor return this; 39644b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 39744b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor case Decl::Namespace: 39844b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor // The original namespace is our primary context. 39944b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor return static_cast<NamespaceDecl*>(this)->getOriginalNamespace(); 40044b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 40144b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor case Decl::ObjCMethod: 40244b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor return this; 40344b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 40444b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor case Decl::ObjCInterface: 4050701bbb228dfd87e1fe82a0a4b7b9facfecb43daSteve Naroff case Decl::ObjCProtocol: 4060701bbb228dfd87e1fe82a0a4b7b9facfecb43daSteve Naroff case Decl::ObjCCategory: 40744b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor // FIXME: Can Objective-C interfaces be forward-declared? 40844b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor return this; 40944b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 4100701bbb228dfd87e1fe82a0a4b7b9facfecb43daSteve Naroff case Decl::ObjCImplementation: 4110701bbb228dfd87e1fe82a0a4b7b9facfecb43daSteve Naroff case Decl::ObjCCategoryImpl: 4120701bbb228dfd87e1fe82a0a4b7b9facfecb43daSteve Naroff return this; 4130701bbb228dfd87e1fe82a0a4b7b9facfecb43daSteve Naroff 41444b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor default: 415cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor if (DeclKind >= Decl::TagFirst && DeclKind <= Decl::TagLast) { 416cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor // If this is a tag type that has a definition or is currently 417cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor // being defined, that definition is our primary context. 418244a67d911d08c3757a18ad666e4a268cf3ee285Chris Lattner if (const TagType *TagT =cast<TagDecl>(this)->TypeForDecl->getAsTagType()) 419cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor if (TagT->isBeingDefined() || 420cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor (TagT->getDecl() && TagT->getDecl()->isDefinition())) 421cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor return TagT->getDecl(); 422cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor return this; 423cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor } 424cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor 42544b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor assert(DeclKind >= Decl::FunctionFirst && DeclKind <= Decl::FunctionLast && 42644b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor "Unknown DeclContext kind"); 42744b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor return this; 42844b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor } 42944b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor} 43044b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 43144b4321feab46299d3f5cfd404680884752a0fcfDouglas GregorDeclContext *DeclContext::getNextContext() { 43244b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor switch (DeclKind) { 43344b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor case Decl::Namespace: 43444b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor // Return the next namespace 43544b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor return static_cast<NamespaceDecl*>(this)->getNextNamespace(); 43644b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 43744b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor default: 43844b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor return 0; 43944b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor } 44044b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor} 44144b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 4424afa39deaa245592977136d367251ee2c173dd8dDouglas Gregorvoid DeclContext::addDecl(Decl *D) { 4437f0be13b435ad110f99af83a24a50f43225f3083Chris Lattner assert(D->getLexicalDeclContext() == this && 4447f0be13b435ad110f99af83a24a50f43225f3083Chris Lattner "Decl inserted into wrong lexical context"); 445244a67d911d08c3757a18ad666e4a268cf3ee285Chris Lattner assert(!D->getNextDeclInContext() && D != LastDecl && 4466037fcba3431b47de1a994c9b286feac17894effDouglas Gregor "Decl already inserted into a DeclContext"); 4476037fcba3431b47de1a994c9b286feac17894effDouglas Gregor 4486037fcba3431b47de1a994c9b286feac17894effDouglas Gregor if (FirstDecl) { 449244a67d911d08c3757a18ad666e4a268cf3ee285Chris Lattner LastDecl->NextDeclInContext = D; 4506037fcba3431b47de1a994c9b286feac17894effDouglas Gregor LastDecl = D; 4516037fcba3431b47de1a994c9b286feac17894effDouglas Gregor } else { 4526037fcba3431b47de1a994c9b286feac17894effDouglas Gregor FirstDecl = LastDecl = D; 4536037fcba3431b47de1a994c9b286feac17894effDouglas Gregor } 4544afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor 4554afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor if (NamedDecl *ND = dyn_cast<NamedDecl>(D)) 45640f4e69002af9623a1f959bd57b99afda186a6a7Douglas Gregor ND->getDeclContext()->makeDeclVisibleInContext(ND); 45744b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor} 45844b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 459074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor/// buildLookup - Build the lookup data structure with all of the 460074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor/// declarations in DCtx (and any other contexts linked to it or 461074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor/// transparent contexts nested within it). 4620701bbb228dfd87e1fe82a0a4b7b9facfecb43daSteve Naroffvoid DeclContext::buildLookup(DeclContext *DCtx) { 463074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor for (; DCtx; DCtx = DCtx->getNextContext()) { 4644f3b8f8ac2f8c89028a2f8793df0a7887df809d4Douglas Gregor for (decl_iterator D = DCtx->decls_begin(), DEnd = DCtx->decls_end(); 4654f3b8f8ac2f8c89028a2f8793df0a7887df809d4Douglas Gregor D != DEnd; ++D) { 466074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor // Insert this declaration into the lookup structure 4674afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor if (NamedDecl *ND = dyn_cast<NamedDecl>(*D)) 46840f4e69002af9623a1f959bd57b99afda186a6a7Douglas Gregor makeDeclVisibleInContextImpl(ND); 469074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor 470074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor // If this declaration is itself a transparent declaration context, 471074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor // add its members (recursively). 472074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor if (DeclContext *InnerCtx = dyn_cast<DeclContext>(*D)) 473074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor if (InnerCtx->isTransparentContext()) 4740701bbb228dfd87e1fe82a0a4b7b9facfecb43daSteve Naroff buildLookup(InnerCtx->getPrimaryContext()); 475074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor } 476074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor } 477074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor} 478074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor 47944b4321feab46299d3f5cfd404680884752a0fcfDouglas GregorDeclContext::lookup_result 4800701bbb228dfd87e1fe82a0a4b7b9facfecb43daSteve NaroffDeclContext::lookup(DeclarationName Name) { 4810701bbb228dfd87e1fe82a0a4b7b9facfecb43daSteve Naroff DeclContext *PrimaryContext = getPrimaryContext(); 48244b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor if (PrimaryContext != this) 4830701bbb228dfd87e1fe82a0a4b7b9facfecb43daSteve Naroff return PrimaryContext->lookup(Name); 48444b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 4853fc749d899dfc194162128c1a88933148a39b68dDouglas Gregor /// If there is no lookup data structure, build one now by walking 48644b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor /// all of the linked DeclContexts (in declaration order!) and 48744b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor /// inserting their values. 488c36c540c5bfce941f3d892919394d092491211f2Douglas Gregor if (!LookupPtr) { 4890701bbb228dfd87e1fe82a0a4b7b9facfecb43daSteve Naroff buildLookup(this); 49044b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 491c36c540c5bfce941f3d892919394d092491211f2Douglas Gregor if (!LookupPtr) 49291942501b6f71a41d3a09bedec19be479832c718Chris Lattner return lookup_result(0, 0); 493c36c540c5bfce941f3d892919394d092491211f2Douglas Gregor } 49444b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 495c36c540c5bfce941f3d892919394d092491211f2Douglas Gregor StoredDeclsMap *Map = static_cast<StoredDeclsMap*>(LookupPtr); 496c36c540c5bfce941f3d892919394d092491211f2Douglas Gregor StoredDeclsMap::iterator Pos = Map->find(Name); 497c36c540c5bfce941f3d892919394d092491211f2Douglas Gregor if (Pos == Map->end()) 498c36c540c5bfce941f3d892919394d092491211f2Douglas Gregor return lookup_result(0, 0); 499c36c540c5bfce941f3d892919394d092491211f2Douglas Gregor return Pos->second.getLookupResult(); 50044b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor} 50144b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 50244b4321feab46299d3f5cfd404680884752a0fcfDouglas GregorDeclContext::lookup_const_result 5030701bbb228dfd87e1fe82a0a4b7b9facfecb43daSteve NaroffDeclContext::lookup(DeclarationName Name) const { 5040701bbb228dfd87e1fe82a0a4b7b9facfecb43daSteve Naroff return const_cast<DeclContext*>(this)->lookup(Name); 50544b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor} 50644b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 5070cf2b1990c82121d03a004dafe498ba43bf4b42aChris LattnerDeclContext *DeclContext::getLookupContext() { 5080cf2b1990c82121d03a004dafe498ba43bf4b42aChris Lattner DeclContext *Ctx = this; 50972de6676bd30f9081ee4166bbe07b4c270258ce6Douglas Gregor // Skip through transparent contexts. 510ce35607c282c845b3285d0f6e106489d8bbeba13Douglas Gregor while (Ctx->isTransparentContext()) 511ce35607c282c845b3285d0f6e106489d8bbeba13Douglas Gregor Ctx = Ctx->getParent(); 512ce35607c282c845b3285d0f6e106489d8bbeba13Douglas Gregor return Ctx; 513ce35607c282c845b3285d0f6e106489d8bbeba13Douglas Gregor} 514ce35607c282c845b3285d0f6e106489d8bbeba13Douglas Gregor 51588b7094185b9d4fe9820c731b6936d8d37f6143eDouglas GregorDeclContext *DeclContext::getEnclosingNamespaceContext() { 51688b7094185b9d4fe9820c731b6936d8d37f6143eDouglas Gregor DeclContext *Ctx = this; 51788b7094185b9d4fe9820c731b6936d8d37f6143eDouglas Gregor // Skip through non-namespace, non-translation-unit contexts. 51888b7094185b9d4fe9820c731b6936d8d37f6143eDouglas Gregor while (!Ctx->isFileContext() || Ctx->isTransparentContext()) 51988b7094185b9d4fe9820c731b6936d8d37f6143eDouglas Gregor Ctx = Ctx->getParent(); 52088b7094185b9d4fe9820c731b6936d8d37f6143eDouglas Gregor return Ctx->getPrimaryContext(); 52188b7094185b9d4fe9820c731b6936d8d37f6143eDouglas Gregor} 52288b7094185b9d4fe9820c731b6936d8d37f6143eDouglas Gregor 52340f4e69002af9623a1f959bd57b99afda186a6a7Douglas Gregorvoid DeclContext::makeDeclVisibleInContext(NamedDecl *D) { 524cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor // FIXME: This feels like a hack. Should DeclarationName support 525cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor // template-ids, or is there a better way to keep specializations 526cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor // from being visible? 527cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor if (isa<ClassTemplateSpecializationDecl>(D)) 528cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor return; 529cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor 5300701bbb228dfd87e1fe82a0a4b7b9facfecb43daSteve Naroff DeclContext *PrimaryContext = getPrimaryContext(); 53144b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor if (PrimaryContext != this) { 53240f4e69002af9623a1f959bd57b99afda186a6a7Douglas Gregor PrimaryContext->makeDeclVisibleInContext(D); 53344b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor return; 53444b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor } 53544b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 53644b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor // If we already have a lookup data structure, perform the insertion 53744b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor // into it. Otherwise, be lazy and don't build that structure until 53844b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor // someone asks for it. 539c36c540c5bfce941f3d892919394d092491211f2Douglas Gregor if (LookupPtr) 54040f4e69002af9623a1f959bd57b99afda186a6a7Douglas Gregor makeDeclVisibleInContextImpl(D); 541074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor 542074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor // If we are a transparent context, insert into our parent context, 543074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor // too. This operation is recursive. 544074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor if (isTransparentContext()) 54540f4e69002af9623a1f959bd57b99afda186a6a7Douglas Gregor getParent()->makeDeclVisibleInContext(D); 54644b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor} 54744b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 54840f4e69002af9623a1f959bd57b99afda186a6a7Douglas Gregorvoid DeclContext::makeDeclVisibleInContextImpl(NamedDecl *D) { 549074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor // Skip unnamed declarations. 550074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor if (!D->getDeclName()) 551074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor return; 552074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor 553cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor // FIXME: This feels like a hack. Should DeclarationName support 554cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor // template-ids, or is there a better way to keep specializations 555cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor // from being visible? 556cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor if (isa<ClassTemplateSpecializationDecl>(D)) 557cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor return; 558cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor 559c36c540c5bfce941f3d892919394d092491211f2Douglas Gregor if (!LookupPtr) 560c36c540c5bfce941f3d892919394d092491211f2Douglas Gregor LookupPtr = new StoredDeclsMap; 56144b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 56244b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor // Insert this declaration into the map. 563c36c540c5bfce941f3d892919394d092491211f2Douglas Gregor StoredDeclsMap &Map = *static_cast<StoredDeclsMap*>(LookupPtr); 56467762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner StoredDeclsList &DeclNameEntries = Map[D->getDeclName()]; 56567762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner if (DeclNameEntries.isNull()) { 56667762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner DeclNameEntries.setOnlyValue(D); 567bd6c80037626a37ce3936a36d9ae287f475845b7Chris Lattner return; 56844b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor } 56991942501b6f71a41d3a09bedec19be479832c718Chris Lattner 570bdc3d0034d5b637b211abd01a936267df27118ccChris Lattner // If it is possible that this is a redeclaration, check to see if there is 571bdc3d0034d5b637b211abd01a936267df27118ccChris Lattner // already a decl for which declarationReplaces returns true. If there is 572bdc3d0034d5b637b211abd01a936267df27118ccChris Lattner // one, just replace it and return. 573c36c540c5bfce941f3d892919394d092491211f2Douglas Gregor if (DeclNameEntries.HandleRedeclaration(D)) 57467762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner return; 57591942501b6f71a41d3a09bedec19be479832c718Chris Lattner 576bd6c80037626a37ce3936a36d9ae287f475845b7Chris Lattner // Put this declaration into the appropriate slot. 57767762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner DeclNameEntries.AddSubsequentDecl(D); 57844b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor} 5792a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor 5802a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor/// Returns iterator range [First, Last) of UsingDirectiveDecls stored within 5812a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor/// this context. 5822a3009a432bdcec59e6383d7b2b17494d6f91649Douglas GregorDeclContext::udir_iterator_range DeclContext::getUsingDirectives() const { 5832a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor lookup_const_result Result = lookup(UsingDirectiveDecl::getName()); 5842a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor return udir_iterator_range(reinterpret_cast<udir_iterator>(Result.first), 5852a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor reinterpret_cast<udir_iterator>(Result.second)); 5862a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor} 5872a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor 588