DeclBase.cpp revision 81abbdd848aa02c30242bd22dcc6ffe024ae2957
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" 16d3bb44f0f1a83cb208d3e61ee80afe6a4d20d2d8Argyrios Kyrtzidis#include "clang/AST/DeclCXX.h" 17aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor#include "clang/AST/DeclObjC.h" 18aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor#include "clang/AST/DeclTemplate.h" 1956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman#include "clang/AST/ASTContext.h" 2044b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor#include "clang/AST/Type.h" 2156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman#include "llvm/ADT/DenseMap.h" 2249f28ca787d8db7cac3c8898334f70ea55374c98Chris Lattner#include "llvm/Support/raw_ostream.h" 236ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor#include <algorithm> 243daed52a57d03765223021f5f921bdc280c8f3ccChris Lattner#include <cstdio> 256ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor#include <functional> 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 1204afa39deaa245592977136d367251ee2c173dd8dDouglas Gregorvoid Decl::setDeclContext(DeclContext *DC) { 1214afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor if (isOutOfSemaDC()) 1224afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor delete getMultipleDC(); 1234afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor 1244afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor DeclCtx = reinterpret_cast<uintptr_t>(DC); 1254afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor} 1264afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor 1274afa39deaa245592977136d367251ee2c173dd8dDouglas Gregorvoid Decl::setLexicalDeclContext(DeclContext *DC) { 1284afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor if (DC == getLexicalDeclContext()) 1294afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor return; 1304afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor 1314afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor if (isInSemaDC()) { 1324afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor MultipleDC *MDC = new MultipleDC(); 1334afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor MDC->SemanticDC = getDeclContext(); 1344afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor MDC->LexicalDC = DC; 1354afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor DeclCtx = reinterpret_cast<uintptr_t>(MDC) | 0x1; 1364afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor } else { 1374afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor getMultipleDC()->LexicalDC = DC; 1384afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor } 1394afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor} 1404afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor 14156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman// Out-of-line virtual method providing a home for Decl. 14256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli FriedmanDecl::~Decl() { 1434afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor if (isOutOfSemaDC()) 1444afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor delete getMultipleDC(); 1454afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor 146cc5814732edc0c382d0136ab57ec6149566043e2Chris Lattner assert(!HasAttrs && "attributes should have been freed by Destroy"); 14756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman} 14856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 14956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanvoid Decl::addAttr(Attr *NewAttr) { 15056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman if (!DeclAttrs) 15156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman DeclAttrs = new DeclAttrMapTy(); 15256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 15356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman Attr *&ExistingAttr = (*DeclAttrs)[this]; 15456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 15556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman NewAttr->setNext(ExistingAttr); 15656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman ExistingAttr = NewAttr; 15756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 15856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman HasAttrs = true; 15956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman} 16056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 16156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanvoid Decl::invalidateAttrs() { 16256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman if (!HasAttrs) return; 16356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 16456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman HasAttrs = false; 16556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman (*DeclAttrs)[this] = 0; 16656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman DeclAttrs->erase(this); 16756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 16856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman if (DeclAttrs->empty()) { 16956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman delete DeclAttrs; 17056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman DeclAttrs = 0; 17156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman } 17256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman} 17356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 17481abbdd848aa02c30242bd22dcc6ffe024ae2957Chris Lattnerconst Attr *Decl::getAttrsImpl() const { 17581abbdd848aa02c30242bd22dcc6ffe024ae2957Chris Lattner assert(HasAttrs && "getAttrs() should verify this!"); 17656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman return (*DeclAttrs)[this]; 17756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman} 17856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 17956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanvoid Decl::swapAttrs(Decl *RHS) { 18056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman bool HasLHSAttr = this->HasAttrs; 18156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman bool HasRHSAttr = RHS->HasAttrs; 18256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 18356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman // Usually, neither decl has attrs, nothing to do. 18456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman if (!HasLHSAttr && !HasRHSAttr) return; 18556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 18656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman // If 'this' has no attrs, swap the other way. 18756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman if (!HasLHSAttr) 18856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman return RHS->swapAttrs(this); 18956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 19056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman // Handle the case when both decls have attrs. 19156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman if (HasRHSAttr) { 19256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman std::swap((*DeclAttrs)[this], (*DeclAttrs)[RHS]); 19356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman return; 19456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman } 19556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 19656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman // Otherwise, LHS has an attr and RHS doesn't. 19756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman (*DeclAttrs)[RHS] = (*DeclAttrs)[this]; 19856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman (*DeclAttrs).erase(this); 19956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman this->HasAttrs = false; 20056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman RHS->HasAttrs = true; 20156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman} 20256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 20356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 204cc5814732edc0c382d0136ab57ec6149566043e2Chris Lattnervoid Decl::Destroy(ASTContext &C) { 205cc5814732edc0c382d0136ab57ec6149566043e2Chris Lattner // Free attributes for this decl. 206cc5814732edc0c382d0136ab57ec6149566043e2Chris Lattner if (HasAttrs) { 207cc5814732edc0c382d0136ab57ec6149566043e2Chris Lattner DeclAttrMapTy::iterator it = DeclAttrs->find(this); 208cc5814732edc0c382d0136ab57ec6149566043e2Chris Lattner assert(it != DeclAttrs->end() && "No attrs found but HasAttrs is true!"); 209cc5814732edc0c382d0136ab57ec6149566043e2Chris Lattner 210cc5814732edc0c382d0136ab57ec6149566043e2Chris Lattner // release attributes. 211cc5814732edc0c382d0136ab57ec6149566043e2Chris Lattner it->second->Destroy(C); 212cc5814732edc0c382d0136ab57ec6149566043e2Chris Lattner invalidateAttrs(); 213cc5814732edc0c382d0136ab57ec6149566043e2Chris Lattner HasAttrs = false; 214cc5814732edc0c382d0136ab57ec6149566043e2Chris Lattner } 215cc5814732edc0c382d0136ab57ec6149566043e2Chris Lattner 216a0fc55f3e9d7d7aa8761d0a9726033947d0d6bc0Douglas Gregor#if 0 21700ad0ef8369ee65337ff29c8db3c1841a01102c4Douglas Gregor // FIXME: Once ownership is fully understood, we can enable this code 21800ad0ef8369ee65337ff29c8db3c1841a01102c4Douglas Gregor if (DeclContext *DC = dyn_cast<DeclContext>(this)) 21900ad0ef8369ee65337ff29c8db3c1841a01102c4Douglas Gregor DC->decls_begin()->Destroy(C); 22056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 22100ad0ef8369ee65337ff29c8db3c1841a01102c4Douglas Gregor // Observe the unrolled recursion. By setting N->NextDeclInScope = 0x0 2224afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor // within the loop, only the Destroy method for the first Decl 2234afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor // will deallocate all of the Decls in a chain. 2244afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor 22500ad0ef8369ee65337ff29c8db3c1841a01102c4Douglas Gregor Decl* N = NextDeclInScope; 2264afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor 2274afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor while (N) { 22800ad0ef8369ee65337ff29c8db3c1841a01102c4Douglas Gregor Decl* Tmp = N->NextDeclInScope; 22900ad0ef8369ee65337ff29c8db3c1841a01102c4Douglas Gregor N->NextDeclInScope = 0; 2304afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor N->Destroy(C); 2314afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor N = Tmp; 23256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman } 233a0fc55f3e9d7d7aa8761d0a9726033947d0d6bc0Douglas Gregor 23456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman this->~Decl(); 2353e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff C.Deallocate((void *)this); 23600ad0ef8369ee65337ff29c8db3c1841a01102c4Douglas Gregor#endif 23756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman} 23856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 23942220c5432c141d47cc8ce786e472b49dc907378Argyrios KyrtzidisDecl *Decl::castFromDeclContext (const DeclContext *D) { 2403d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis Decl::Kind DK = D->getDeclKind(); 2413d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis switch(DK) { 2423d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis#define DECL_CONTEXT(Name) \ 2433d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis case Decl::Name: \ 2443d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis return static_cast<Name##Decl*>(const_cast<DeclContext*>(D)); 2453d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis#define DECL_CONTEXT_BASE(Name) 2463d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis#include "clang/AST/DeclNodes.def" 2473d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis default: 2483d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis#define DECL_CONTEXT_BASE(Name) \ 2493d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis if (DK >= Decl::Name##First && DK <= Decl::Name##Last) \ 2503d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis return static_cast<Name##Decl*>(const_cast<DeclContext*>(D)); 2513d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis#include "clang/AST/DeclNodes.def" 2523d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis assert(false && "a decl that inherits DeclContext isn't handled"); 2533d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis return 0; 2543d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis } 25542220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidis} 25642220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidis 25742220c5432c141d47cc8ce786e472b49dc907378Argyrios KyrtzidisDeclContext *Decl::castToDeclContext(const Decl *D) { 2583d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis Decl::Kind DK = D->getKind(); 2593d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis switch(DK) { 2603d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis#define DECL_CONTEXT(Name) \ 2613d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis case Decl::Name: \ 2623d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis return static_cast<Name##Decl*>(const_cast<Decl*>(D)); 2633d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis#define DECL_CONTEXT_BASE(Name) 2643d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis#include "clang/AST/DeclNodes.def" 2653d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis default: 2663d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis#define DECL_CONTEXT_BASE(Name) \ 2673d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis if (DK >= Decl::Name##First && DK <= Decl::Name##Last) \ 2683d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis return static_cast<Name##Decl*>(const_cast<Decl*>(D)); 2693d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis#include "clang/AST/DeclNodes.def" 2703d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis assert(false && "a decl that inherits DeclContext isn't handled"); 2713d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis return 0; 2723d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis } 27342220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidis} 27442220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidis 27556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman//===----------------------------------------------------------------------===// 27656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman// DeclContext Implementation 27756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman//===----------------------------------------------------------------------===// 27856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 2793d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidisbool DeclContext::classof(const Decl *D) { 2803d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis switch (D->getKind()) { 2813d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis#define DECL_CONTEXT(Name) case Decl::Name: 2823d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis#define DECL_CONTEXT_BASE(Name) 2833d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis#include "clang/AST/DeclNodes.def" 2843d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis return true; 2853d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis default: 2863d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis#define DECL_CONTEXT_BASE(Name) \ 2873d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis if (D->getKind() >= Decl::Name##First && \ 2883d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis D->getKind() <= Decl::Name##Last) \ 2893d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis return true; 2903d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis#include "clang/AST/DeclNodes.def" 2913d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis return false; 2923d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis } 2933d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis} 2943d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis 29567762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner/// StoredDeclsList - This is an array of decls optimized a common case of only 29667762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner/// containing one entry. 29767762a35dca6202d2272db02d0b8740728e3aa8fChris Lattnerstruct StoredDeclsList { 29867762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner /// Data - If the integer is 0, then the pointer is a NamedDecl*. If the 29967762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner /// integer is 1, then it is a VectorTy; 30067762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner llvm::PointerIntPair<void*, 1, bool> Data; 30167762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner 30267762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner /// VectorTy - When in vector form, this is what the Data pointer points to. 30367762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner typedef llvm::SmallVector<NamedDecl*, 4> VectorTy; 30467762a35dca6202d2272db02d0b8740728e3aa8fChris Lattnerpublic: 30567762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner StoredDeclsList() {} 30667762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner StoredDeclsList(const StoredDeclsList &RHS) : Data(RHS.Data) { 30767762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner if (isVector()) 30867762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner Data.setPointer(new VectorTy(getVector())); 30967762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner } 31067762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner 31167762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner ~StoredDeclsList() { 31267762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner // If this is a vector-form, free the vector. 31367762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner if (isVector()) 31467762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner delete &getVector(); 31567762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner } 31667762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner 31701011d4e4d6d5146f58233a508509757382d62c3Chris Lattner StoredDeclsList &operator=(const StoredDeclsList &RHS) { 31801011d4e4d6d5146f58233a508509757382d62c3Chris Lattner if (isVector()) 31901011d4e4d6d5146f58233a508509757382d62c3Chris Lattner delete &getVector(); 32001011d4e4d6d5146f58233a508509757382d62c3Chris Lattner Data = RHS.Data; 32101011d4e4d6d5146f58233a508509757382d62c3Chris Lattner if (isVector()) 32201011d4e4d6d5146f58233a508509757382d62c3Chris Lattner Data.setPointer(new VectorTy(getVector())); 32301011d4e4d6d5146f58233a508509757382d62c3Chris Lattner return *this; 32401011d4e4d6d5146f58233a508509757382d62c3Chris Lattner } 32501011d4e4d6d5146f58233a508509757382d62c3Chris Lattner 32667762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner bool isVector() const { return Data.getInt() != 0; } 32767762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner bool isInline() const { return Data.getInt() == 0; } 32867762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner bool isNull() const { return Data.getPointer() == 0; } 32967762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner 33067762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner void setOnlyValue(NamedDecl *ND) { 33167762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner assert(isInline() && "Not inline"); 33267762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner Data.setPointer(ND); 33367762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner } 33467762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner 33567762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner /// getLookupResult - Return an array of all the decls that this list 33667762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner /// represents. 33767762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner DeclContext::lookup_result getLookupResult() { 33867762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner // If we have a single inline unit, return it. 33967762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner if (isInline()) { 34067762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner assert(!isNull() && "Empty list isn't allowed"); 34167762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner 34267762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner // Data is a raw pointer to a NamedDecl*, return it. 34367762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner void *Ptr = &Data; 34467762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner return DeclContext::lookup_result((NamedDecl**)Ptr, (NamedDecl**)Ptr+1); 34567762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner } 34667762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner 34767762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner // Otherwise, we have a range result. 34867762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner VectorTy &V = getVector(); 34967762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner return DeclContext::lookup_result(&V[0], &V[0]+V.size()); 35067762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner } 35167762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner 35267762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner /// HandleRedeclaration - If this is a redeclaration of an existing decl, 35367762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner /// replace the old one with D and return true. Otherwise return false. 35467762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner bool HandleRedeclaration(NamedDecl *D) { 35567762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner // Most decls only have one entry in their list, special case it. 35667762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner if (isInline()) { 35767762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner if (!D->declarationReplaces(getInlineValue())) 35867762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner return false; 35967762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner setOnlyValue(D); 36067762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner return true; 36167762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner } 36267762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner 36367762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner // Determine if this declaration is actually a redeclaration. 36467762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner VectorTy &Vec = getVector(); 36567762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner VectorTy::iterator RDI 36667762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner = std::find_if(Vec.begin(), Vec.end(), 36767762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner std::bind1st(std::mem_fun(&NamedDecl::declarationReplaces), 36867762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner D)); 36967762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner if (RDI == Vec.end()) 37067762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner return false; 37167762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner *RDI = D; 37267762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner return true; 37367762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner } 37467762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner 37567762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner /// AddSubsequentDecl - This is called on the second and later decl when it is 37667762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner /// not a redeclaration to merge it into the appropriate place in our list. 37767762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner /// 37867762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner void AddSubsequentDecl(NamedDecl *D) { 37967762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner // If this is the second decl added to the list, convert this to vector 38067762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner // form. 38167762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner if (isInline()) { 38267762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner NamedDecl *OldD = getInlineValue(); 38367762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner Data.setInt(1); 38467762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner VectorTy *VT = new VectorTy(); 38567762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner VT->push_back(OldD); 38667762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner Data.setPointer(VT); 38767762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner } 38867762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner 38967762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner VectorTy &Vec = getVector(); 39067762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner if (isa<UsingDirectiveDecl>(D) || 39167762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner D->getIdentifierNamespace() == Decl::IDNS_Tag) 39267762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner Vec.push_back(D); 39367762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner else if (Vec.back()->getIdentifierNamespace() == Decl::IDNS_Tag) { 39467762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner NamedDecl *TagD = Vec.back(); 39567762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner Vec.back() = D; 39667762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner Vec.push_back(TagD); 39767762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner } else 39867762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner Vec.push_back(D); 39967762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner } 40067762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner 40167762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner 40267762a35dca6202d2272db02d0b8740728e3aa8fChris Lattnerprivate: 40367762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner VectorTy &getVector() const { 40467762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner assert(isVector() && "Not in vector form"); 40567762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner return *static_cast<VectorTy*>(Data.getPointer()); 40667762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner } 40767762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner 40867762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner NamedDecl *getInlineValue() const { 40967762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner assert(isInline() && "Not in inline form"); 41067762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner return (NamedDecl*)Data.getPointer(); 41167762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner } 41267762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner}; 41367762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner 41467762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner 41567762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner 41667762a35dca6202d2272db02d0b8740728e3aa8fChris Lattnertypedef llvm::DenseMap<DeclarationName, StoredDeclsList> StoredDeclsMap; 41744b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 41844b4321feab46299d3f5cfd404680884752a0fcfDouglas GregorDeclContext::~DeclContext() { 41944b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor unsigned Size = LookupPtr.getInt(); 42091942501b6f71a41d3a09bedec19be479832c718Chris Lattner if (Size == LookupIsMap) 42191942501b6f71a41d3a09bedec19be479832c718Chris Lattner delete static_cast<StoredDeclsMap*>(LookupPtr.getPointer()); 42291942501b6f71a41d3a09bedec19be479832c718Chris Lattner else 42391942501b6f71a41d3a09bedec19be479832c718Chris Lattner delete [] static_cast<NamedDecl**>(LookupPtr.getPointer()); 42444b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor} 42544b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 42644b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregorvoid DeclContext::DestroyDecls(ASTContext &C) { 42700ad0ef8369ee65337ff29c8db3c1841a01102c4Douglas Gregor for (decl_iterator D = decls_begin(); D != decls_end(); ) 42800ad0ef8369ee65337ff29c8db3c1841a01102c4Douglas Gregor (*D++)->Destroy(C); 42944b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor} 43044b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 431074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregorbool DeclContext::isTransparentContext() const { 432074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor if (DeclKind == Decl::Enum) 433074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor return true; // FIXME: Check for C++0x scoped enums 434074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor else if (DeclKind == Decl::LinkageSpec) 435074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor return true; 43665100792a69a16895bd80f1d639b99e7ad903386Douglas Gregor else if (DeclKind >= Decl::RecordFirst && DeclKind <= Decl::RecordLast) 437bcbffc46f1ad3796c4582fa1e3a9113b5aa26061Douglas Gregor return cast<RecordDecl>(this)->isAnonymousStructOrUnion(); 438074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor else if (DeclKind == Decl::Namespace) 439074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor return false; // FIXME: Check for C++0x inline namespaces 440074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor 441074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor return false; 442074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor} 443074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor 4440701bbb228dfd87e1fe82a0a4b7b9facfecb43daSteve NaroffDeclContext *DeclContext::getPrimaryContext() { 44544b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor switch (DeclKind) { 44644b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor case Decl::TranslationUnit: 447074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor case Decl::LinkageSpec: 448074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor case Decl::Block: 44944b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor // There is only one DeclContext for these entities. 45044b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor return this; 45144b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 45244b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor case Decl::Namespace: 45344b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor // The original namespace is our primary context. 45444b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor return static_cast<NamespaceDecl*>(this)->getOriginalNamespace(); 45544b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 45644b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor case Decl::ObjCMethod: 45744b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor return this; 45844b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 45944b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor case Decl::ObjCInterface: 4600701bbb228dfd87e1fe82a0a4b7b9facfecb43daSteve Naroff case Decl::ObjCProtocol: 4610701bbb228dfd87e1fe82a0a4b7b9facfecb43daSteve Naroff case Decl::ObjCCategory: 46244b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor // FIXME: Can Objective-C interfaces be forward-declared? 46344b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor return this; 46444b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 4650701bbb228dfd87e1fe82a0a4b7b9facfecb43daSteve Naroff case Decl::ObjCImplementation: 4660701bbb228dfd87e1fe82a0a4b7b9facfecb43daSteve Naroff case Decl::ObjCCategoryImpl: 4670701bbb228dfd87e1fe82a0a4b7b9facfecb43daSteve Naroff return this; 4680701bbb228dfd87e1fe82a0a4b7b9facfecb43daSteve Naroff 46944b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor default: 470cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor if (DeclKind >= Decl::TagFirst && DeclKind <= Decl::TagLast) { 471cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor // If this is a tag type that has a definition or is currently 472cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor // being defined, that definition is our primary context. 473fc705b84347e6fb4746a1a7e26949f64c2f2f358Douglas Gregor if (const TagType *TagT = cast<TagDecl>(this)->TypeForDecl->getAsTagType()) 474cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor if (TagT->isBeingDefined() || 475cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor (TagT->getDecl() && TagT->getDecl()->isDefinition())) 476cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor return TagT->getDecl(); 477cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor return this; 478cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor } 479cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor 48044b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor assert(DeclKind >= Decl::FunctionFirst && DeclKind <= Decl::FunctionLast && 48144b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor "Unknown DeclContext kind"); 48244b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor return this; 48344b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor } 48444b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor} 48544b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 48644b4321feab46299d3f5cfd404680884752a0fcfDouglas GregorDeclContext *DeclContext::getNextContext() { 48744b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor switch (DeclKind) { 48844b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor case Decl::Namespace: 48944b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor // Return the next namespace 49044b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor return static_cast<NamespaceDecl*>(this)->getNextNamespace(); 49144b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 49244b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor default: 49344b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor return 0; 49444b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor } 49544b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor} 49644b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 4974afa39deaa245592977136d367251ee2c173dd8dDouglas Gregorvoid DeclContext::addDecl(Decl *D) { 4987f0be13b435ad110f99af83a24a50f43225f3083Chris Lattner assert(D->getLexicalDeclContext() == this && 4997f0be13b435ad110f99af83a24a50f43225f3083Chris Lattner "Decl inserted into wrong lexical context"); 5006037fcba3431b47de1a994c9b286feac17894effDouglas Gregor assert(!D->NextDeclInScope && D != LastDecl && 5016037fcba3431b47de1a994c9b286feac17894effDouglas Gregor "Decl already inserted into a DeclContext"); 5026037fcba3431b47de1a994c9b286feac17894effDouglas Gregor 5036037fcba3431b47de1a994c9b286feac17894effDouglas Gregor if (FirstDecl) { 5046037fcba3431b47de1a994c9b286feac17894effDouglas Gregor LastDecl->NextDeclInScope = D; 5056037fcba3431b47de1a994c9b286feac17894effDouglas Gregor LastDecl = D; 5066037fcba3431b47de1a994c9b286feac17894effDouglas Gregor } else { 5076037fcba3431b47de1a994c9b286feac17894effDouglas Gregor FirstDecl = LastDecl = D; 5086037fcba3431b47de1a994c9b286feac17894effDouglas Gregor } 5094afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor 5104afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor if (NamedDecl *ND = dyn_cast<NamedDecl>(D)) 51140f4e69002af9623a1f959bd57b99afda186a6a7Douglas Gregor ND->getDeclContext()->makeDeclVisibleInContext(ND); 51244b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor} 51344b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 514074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor/// buildLookup - Build the lookup data structure with all of the 515074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor/// declarations in DCtx (and any other contexts linked to it or 516074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor/// transparent contexts nested within it). 5170701bbb228dfd87e1fe82a0a4b7b9facfecb43daSteve Naroffvoid DeclContext::buildLookup(DeclContext *DCtx) { 518074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor for (; DCtx; DCtx = DCtx->getNextContext()) { 5194f3b8f8ac2f8c89028a2f8793df0a7887df809d4Douglas Gregor for (decl_iterator D = DCtx->decls_begin(), DEnd = DCtx->decls_end(); 5204f3b8f8ac2f8c89028a2f8793df0a7887df809d4Douglas Gregor D != DEnd; ++D) { 521074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor // Insert this declaration into the lookup structure 5224afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor if (NamedDecl *ND = dyn_cast<NamedDecl>(*D)) 52340f4e69002af9623a1f959bd57b99afda186a6a7Douglas Gregor makeDeclVisibleInContextImpl(ND); 524074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor 525074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor // If this declaration is itself a transparent declaration context, 526074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor // add its members (recursively). 527074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor if (DeclContext *InnerCtx = dyn_cast<DeclContext>(*D)) 528074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor if (InnerCtx->isTransparentContext()) 5290701bbb228dfd87e1fe82a0a4b7b9facfecb43daSteve Naroff buildLookup(InnerCtx->getPrimaryContext()); 530074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor } 531074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor } 532074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor} 533074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor 53444b4321feab46299d3f5cfd404680884752a0fcfDouglas GregorDeclContext::lookup_result 5350701bbb228dfd87e1fe82a0a4b7b9facfecb43daSteve NaroffDeclContext::lookup(DeclarationName Name) { 5360701bbb228dfd87e1fe82a0a4b7b9facfecb43daSteve Naroff DeclContext *PrimaryContext = getPrimaryContext(); 53744b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor if (PrimaryContext != this) 5380701bbb228dfd87e1fe82a0a4b7b9facfecb43daSteve Naroff return PrimaryContext->lookup(Name); 53944b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 5403fc749d899dfc194162128c1a88933148a39b68dDouglas Gregor /// If there is no lookup data structure, build one now by walking 54144b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor /// all of the linked DeclContexts (in declaration order!) and 54244b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor /// inserting their values. 543074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor if (LookupPtr.getPointer() == 0) 5440701bbb228dfd87e1fe82a0a4b7b9facfecb43daSteve Naroff buildLookup(this); 54544b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 54644b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor if (isLookupMap()) { 54744b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor StoredDeclsMap *Map = static_cast<StoredDeclsMap*>(LookupPtr.getPointer()); 54844b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor StoredDeclsMap::iterator Pos = Map->find(Name); 54991942501b6f71a41d3a09bedec19be479832c718Chris Lattner if (Pos == Map->end()) 55091942501b6f71a41d3a09bedec19be479832c718Chris Lattner return lookup_result(0, 0); 55167762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner return Pos->second.getLookupResult(); 55244b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor } 55344b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 55444b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor // We have a small array. Look into it. 55544b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor unsigned Size = LookupPtr.getInt(); 5564afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor NamedDecl **Array = static_cast<NamedDecl**>(LookupPtr.getPointer()); 557e267ff35b2f4e9d2b0d8bf24109d41cc7398b61bDouglas Gregor for (unsigned Idx = 0; Idx != Size; ++Idx) 55844b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor if (Array[Idx]->getDeclName() == Name) { 5593fc749d899dfc194162128c1a88933148a39b68dDouglas Gregor unsigned Last = Idx + 1; 5603fc749d899dfc194162128c1a88933148a39b68dDouglas Gregor while (Last != Size && Array[Last]->getDeclName() == Name) 5613fc749d899dfc194162128c1a88933148a39b68dDouglas Gregor ++Last; 5623fc749d899dfc194162128c1a88933148a39b68dDouglas Gregor return lookup_result(&Array[Idx], &Array[Last]); 56344b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor } 56444b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 5653fc749d899dfc194162128c1a88933148a39b68dDouglas Gregor return lookup_result(0, 0); 56644b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor} 56744b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 56844b4321feab46299d3f5cfd404680884752a0fcfDouglas GregorDeclContext::lookup_const_result 5690701bbb228dfd87e1fe82a0a4b7b9facfecb43daSteve NaroffDeclContext::lookup(DeclarationName Name) const { 5700701bbb228dfd87e1fe82a0a4b7b9facfecb43daSteve Naroff return const_cast<DeclContext*>(this)->lookup(Name); 57144b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor} 57244b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 57317a9b9e3ee75f5dbb4819cc8ebf40eec8015f84aDouglas Gregorconst DeclContext *DeclContext::getLookupContext() const { 57417a9b9e3ee75f5dbb4819cc8ebf40eec8015f84aDouglas Gregor const DeclContext *Ctx = this; 57572de6676bd30f9081ee4166bbe07b4c270258ce6Douglas Gregor // Skip through transparent contexts. 576ce35607c282c845b3285d0f6e106489d8bbeba13Douglas Gregor while (Ctx->isTransparentContext()) 577ce35607c282c845b3285d0f6e106489d8bbeba13Douglas Gregor Ctx = Ctx->getParent(); 578ce35607c282c845b3285d0f6e106489d8bbeba13Douglas Gregor return Ctx; 579ce35607c282c845b3285d0f6e106489d8bbeba13Douglas Gregor} 580ce35607c282c845b3285d0f6e106489d8bbeba13Douglas Gregor 58188b7094185b9d4fe9820c731b6936d8d37f6143eDouglas GregorDeclContext *DeclContext::getEnclosingNamespaceContext() { 58288b7094185b9d4fe9820c731b6936d8d37f6143eDouglas Gregor DeclContext *Ctx = this; 58388b7094185b9d4fe9820c731b6936d8d37f6143eDouglas Gregor // Skip through non-namespace, non-translation-unit contexts. 58488b7094185b9d4fe9820c731b6936d8d37f6143eDouglas Gregor while (!Ctx->isFileContext() || Ctx->isTransparentContext()) 58588b7094185b9d4fe9820c731b6936d8d37f6143eDouglas Gregor Ctx = Ctx->getParent(); 58688b7094185b9d4fe9820c731b6936d8d37f6143eDouglas Gregor return Ctx->getPrimaryContext(); 58788b7094185b9d4fe9820c731b6936d8d37f6143eDouglas Gregor} 58888b7094185b9d4fe9820c731b6936d8d37f6143eDouglas Gregor 58940f4e69002af9623a1f959bd57b99afda186a6a7Douglas Gregorvoid DeclContext::makeDeclVisibleInContext(NamedDecl *D) { 590cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor // FIXME: This feels like a hack. Should DeclarationName support 591cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor // template-ids, or is there a better way to keep specializations 592cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor // from being visible? 593cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor if (isa<ClassTemplateSpecializationDecl>(D)) 594cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor return; 595cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor 5960701bbb228dfd87e1fe82a0a4b7b9facfecb43daSteve Naroff DeclContext *PrimaryContext = getPrimaryContext(); 59744b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor if (PrimaryContext != this) { 59840f4e69002af9623a1f959bd57b99afda186a6a7Douglas Gregor PrimaryContext->makeDeclVisibleInContext(D); 59944b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor return; 60044b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor } 60144b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 60244b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor // If we already have a lookup data structure, perform the insertion 60344b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor // into it. Otherwise, be lazy and don't build that structure until 60444b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor // someone asks for it. 60544b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor if (LookupPtr.getPointer()) 60640f4e69002af9623a1f959bd57b99afda186a6a7Douglas Gregor makeDeclVisibleInContextImpl(D); 607074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor 608074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor // If we are a transparent context, insert into our parent context, 609074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor // too. This operation is recursive. 610074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor if (isTransparentContext()) 61140f4e69002af9623a1f959bd57b99afda186a6a7Douglas Gregor getParent()->makeDeclVisibleInContext(D); 61244b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor} 61344b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 61440f4e69002af9623a1f959bd57b99afda186a6a7Douglas Gregorvoid DeclContext::makeDeclVisibleInContextImpl(NamedDecl *D) { 615074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor // Skip unnamed declarations. 616074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor if (!D->getDeclName()) 617074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor return; 618074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor 619cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor // FIXME: This feels like a hack. Should DeclarationName support 620cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor // template-ids, or is there a better way to keep specializations 621cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor // from being visible? 622cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor if (isa<ClassTemplateSpecializationDecl>(D)) 623cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor return; 624cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor 6253fc749d899dfc194162128c1a88933148a39b68dDouglas Gregor bool MayBeRedeclaration = true; 6263fc749d899dfc194162128c1a88933148a39b68dDouglas Gregor 62744b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor if (!isLookupMap()) { 62844b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor unsigned Size = LookupPtr.getInt(); 62944b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 63044b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor // The lookup data is stored as an array. Search through the array 63144b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor // to find the insertion location. 6324afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor NamedDecl **Array; 63344b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor if (Size == 0) { 6344afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor Array = new NamedDecl*[LookupIsMap - 1]; 63544b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor LookupPtr.setPointer(Array); 63644b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor } else { 6374afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor Array = static_cast<NamedDecl **>(LookupPtr.getPointer()); 63844b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor } 63944b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 64044b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor // We always keep declarations of the same name next to each other 64144b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor // in the array, so that it is easy to return multiple results 6423fc749d899dfc194162128c1a88933148a39b68dDouglas Gregor // from lookup(). 6433fc749d899dfc194162128c1a88933148a39b68dDouglas Gregor unsigned FirstMatch; 6443fc749d899dfc194162128c1a88933148a39b68dDouglas Gregor for (FirstMatch = 0; FirstMatch != Size; ++FirstMatch) 6453fc749d899dfc194162128c1a88933148a39b68dDouglas Gregor if (Array[FirstMatch]->getDeclName() == D->getDeclName()) 646e267ff35b2f4e9d2b0d8bf24109d41cc7398b61bDouglas Gregor break; 64744b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 6483fc749d899dfc194162128c1a88933148a39b68dDouglas Gregor unsigned InsertPos = FirstMatch; 6493fc749d899dfc194162128c1a88933148a39b68dDouglas Gregor if (FirstMatch != Size) { 6503fc749d899dfc194162128c1a88933148a39b68dDouglas Gregor // We found another declaration with the same name. First 6513fc749d899dfc194162128c1a88933148a39b68dDouglas Gregor // determine whether this is a redeclaration of an existing 6523fc749d899dfc194162128c1a88933148a39b68dDouglas Gregor // declaration in this scope, in which case we will replace the 6533fc749d899dfc194162128c1a88933148a39b68dDouglas Gregor // existing declaration. 6543fc749d899dfc194162128c1a88933148a39b68dDouglas Gregor unsigned LastMatch = FirstMatch; 6553fc749d899dfc194162128c1a88933148a39b68dDouglas Gregor for (; LastMatch != Size; ++LastMatch) { 6563fc749d899dfc194162128c1a88933148a39b68dDouglas Gregor if (Array[LastMatch]->getDeclName() != D->getDeclName()) 6573fc749d899dfc194162128c1a88933148a39b68dDouglas Gregor break; 6583fc749d899dfc194162128c1a88933148a39b68dDouglas Gregor 6596ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor if (D->declarationReplaces(Array[LastMatch])) { 6603fc749d899dfc194162128c1a88933148a39b68dDouglas Gregor // D is a redeclaration of an existing element in the 6613fc749d899dfc194162128c1a88933148a39b68dDouglas Gregor // array. Replace that element with D. 6623fc749d899dfc194162128c1a88933148a39b68dDouglas Gregor Array[LastMatch] = D; 6633fc749d899dfc194162128c1a88933148a39b68dDouglas Gregor return; 6643fc749d899dfc194162128c1a88933148a39b68dDouglas Gregor } 66544b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor } 66644b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 6673fc749d899dfc194162128c1a88933148a39b68dDouglas Gregor // [FirstMatch, LastMatch) contains the set of declarations that 6683fc749d899dfc194162128c1a88933148a39b68dDouglas Gregor // have the same name as this declaration. Determine where the 6692a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor // declaration D will be inserted into this range. 6702a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor if (D->getKind() == Decl::UsingDirective || 6712a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor D->getIdentifierNamespace() == Decl::IDNS_Tag) 6723fc749d899dfc194162128c1a88933148a39b68dDouglas Gregor InsertPos = LastMatch; 6733fc749d899dfc194162128c1a88933148a39b68dDouglas Gregor else if (Array[LastMatch-1]->getIdentifierNamespace() == Decl::IDNS_Tag) 6743fc749d899dfc194162128c1a88933148a39b68dDouglas Gregor InsertPos = LastMatch - 1; 6753fc749d899dfc194162128c1a88933148a39b68dDouglas Gregor else 6763fc749d899dfc194162128c1a88933148a39b68dDouglas Gregor InsertPos = LastMatch; 67744b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor } 67844b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 67944b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor if (Size < LookupIsMap - 1) { 68044b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor // The new declaration will fit in the array. Insert the new 68144b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor // declaration at the position Match in the array. 6823fc749d899dfc194162128c1a88933148a39b68dDouglas Gregor for (unsigned Idx = Size; Idx > InsertPos; --Idx) 68344b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor Array[Idx] = Array[Idx-1]; 68444b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 6853fc749d899dfc194162128c1a88933148a39b68dDouglas Gregor Array[InsertPos] = D; 68644b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor LookupPtr.setInt(Size + 1); 68744b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor return; 68844b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor } 68944b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 69044b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor // We've reached capacity in this array. Create a map and copy in 69144b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor // all of the declarations that were stored in the array. 69244b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor StoredDeclsMap *Map = new StoredDeclsMap(16); 69344b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor LookupPtr.setPointer(Map); 69444b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor LookupPtr.setInt(LookupIsMap); 695e267ff35b2f4e9d2b0d8bf24109d41cc7398b61bDouglas Gregor for (unsigned Idx = 0; Idx != LookupIsMap - 1; ++Idx) 69640f4e69002af9623a1f959bd57b99afda186a6a7Douglas Gregor makeDeclVisibleInContextImpl(Array[Idx]); 69744b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor delete [] Array; 69844b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 69944b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor // Fall through to perform insertion into the map. 7003fc749d899dfc194162128c1a88933148a39b68dDouglas Gregor MayBeRedeclaration = false; 7013fc749d899dfc194162128c1a88933148a39b68dDouglas Gregor } 70244b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 70344b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor // Insert this declaration into the map. 70467762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner StoredDeclsMap &Map = *static_cast<StoredDeclsMap*>(LookupPtr.getPointer()); 70567762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner StoredDeclsList &DeclNameEntries = Map[D->getDeclName()]; 70667762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner if (DeclNameEntries.isNull()) { 70767762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner DeclNameEntries.setOnlyValue(D); 708bd6c80037626a37ce3936a36d9ae287f475845b7Chris Lattner return; 70944b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor } 71091942501b6f71a41d3a09bedec19be479832c718Chris Lattner 711bdc3d0034d5b637b211abd01a936267df27118ccChris Lattner // If it is possible that this is a redeclaration, check to see if there is 712bdc3d0034d5b637b211abd01a936267df27118ccChris Lattner // already a decl for which declarationReplaces returns true. If there is 713bdc3d0034d5b637b211abd01a936267df27118ccChris Lattner // one, just replace it and return. 71467762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner if (MayBeRedeclaration && DeclNameEntries.HandleRedeclaration(D)) 71567762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner return; 71691942501b6f71a41d3a09bedec19be479832c718Chris Lattner 717bd6c80037626a37ce3936a36d9ae287f475845b7Chris Lattner // Put this declaration into the appropriate slot. 71867762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner DeclNameEntries.AddSubsequentDecl(D); 71944b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor} 7202a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor 7212a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor/// Returns iterator range [First, Last) of UsingDirectiveDecls stored within 7222a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor/// this context. 7232a3009a432bdcec59e6383d7b2b17494d6f91649Douglas GregorDeclContext::udir_iterator_range DeclContext::getUsingDirectives() const { 7242a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor lookup_const_result Result = lookup(UsingDirectiveDecl::getName()); 7252a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor return udir_iterator_range(reinterpret_cast<udir_iterator>(Result.first), 7262a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor reinterpret_cast<udir_iterator>(Result.second)); 7272a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor} 7282a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor 729