DeclBase.cpp revision fc705b84347e6fb4746a1a7e26949f64c2f2f358
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" 226ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor#include <algorithm> 236ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor#include <functional> 243fc749d899dfc194162128c1a88933148a39b68dDouglas Gregor#include <vector> 2556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanusing namespace clang; 2656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 2756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman//===----------------------------------------------------------------------===// 2856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman// Statistics 2956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman//===----------------------------------------------------------------------===// 3056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 3164650af7cc4352c6c67b9bd1bf8ef3ce7471b910Douglas Gregor#define DECL(Derived, Base) static int n##Derived##s = 0; 3264650af7cc4352c6c67b9bd1bf8ef3ce7471b910Douglas Gregor#include "clang/AST/DeclNodes.def" 3356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 3456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanstatic bool StatSwitch = false; 3556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 3656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman// This keeps track of all decl attributes. Since so few decls have attrs, we 3756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman// keep them in a hash map instead of wasting space in the Decl class. 3856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmantypedef llvm::DenseMap<const Decl*, Attr*> DeclAttrMapTy; 3956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 4056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanstatic DeclAttrMapTy *DeclAttrs = 0; 4156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 4256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanconst char *Decl::getDeclKindName() const { 4356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman switch (DeclKind) { 4464650af7cc4352c6c67b9bd1bf8ef3ce7471b910Douglas Gregor default: assert(0 && "Declaration not in DeclNodes.def!"); 4564650af7cc4352c6c67b9bd1bf8ef3ce7471b910Douglas Gregor#define DECL(Derived, Base) case Derived: return #Derived; 4664650af7cc4352c6c67b9bd1bf8ef3ce7471b910Douglas Gregor#include "clang/AST/DeclNodes.def" 4756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman } 4856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman} 4956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 500a4739305a984ef9b821cedad5f4fe235eb6ef7dSteve Naroffconst char *DeclContext::getDeclKindName() const { 510a4739305a984ef9b821cedad5f4fe235eb6ef7dSteve Naroff switch (DeclKind) { 5264650af7cc4352c6c67b9bd1bf8ef3ce7471b910Douglas Gregor default: assert(0 && "Declaration context not in DeclNodes.def!"); 531ad4dd78ec53c24ea9e752b216035d7aa666fe49Argyrios Kyrtzidis#define DECL(Derived, Base) case Decl::Derived: return #Derived; 5464650af7cc4352c6c67b9bd1bf8ef3ce7471b910Douglas Gregor#include "clang/AST/DeclNodes.def" 550a4739305a984ef9b821cedad5f4fe235eb6ef7dSteve Naroff } 560a4739305a984ef9b821cedad5f4fe235eb6ef7dSteve Naroff} 570a4739305a984ef9b821cedad5f4fe235eb6ef7dSteve Naroff 5856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanbool Decl::CollectingStats(bool Enable) { 5956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman if (Enable) 6056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman StatSwitch = true; 6156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman return StatSwitch; 6256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman} 6356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 6456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanvoid Decl::PrintStats() { 6556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman fprintf(stderr, "*** Decl Stats:\n"); 6656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 6764650af7cc4352c6c67b9bd1bf8ef3ce7471b910Douglas Gregor int totalDecls = 0; 6864650af7cc4352c6c67b9bd1bf8ef3ce7471b910Douglas Gregor#define DECL(Derived, Base) totalDecls += n##Derived##s; 6964650af7cc4352c6c67b9bd1bf8ef3ce7471b910Douglas Gregor#include "clang/AST/DeclNodes.def" 7064650af7cc4352c6c67b9bd1bf8ef3ce7471b910Douglas Gregor fprintf(stderr, " %d decls total.\n", totalDecls); 7164650af7cc4352c6c67b9bd1bf8ef3ce7471b910Douglas Gregor 7264650af7cc4352c6c67b9bd1bf8ef3ce7471b910Douglas Gregor int totalBytes = 0; 7364650af7cc4352c6c67b9bd1bf8ef3ce7471b910Douglas Gregor#define DECL(Derived, Base) \ 7464650af7cc4352c6c67b9bd1bf8ef3ce7471b910Douglas Gregor if (n##Derived##s > 0) { \ 7564650af7cc4352c6c67b9bd1bf8ef3ce7471b910Douglas Gregor totalBytes += (int)(n##Derived##s * sizeof(Derived##Decl)); \ 7664650af7cc4352c6c67b9bd1bf8ef3ce7471b910Douglas Gregor fprintf(stderr, " %d " #Derived " decls, %d each (%d bytes)\n", \ 7764650af7cc4352c6c67b9bd1bf8ef3ce7471b910Douglas Gregor n##Derived##s, (int)sizeof(Derived##Decl), \ 7864650af7cc4352c6c67b9bd1bf8ef3ce7471b910Douglas Gregor (int)(n##Derived##s * sizeof(Derived##Decl))); \ 7964650af7cc4352c6c67b9bd1bf8ef3ce7471b910Douglas Gregor } 8064650af7cc4352c6c67b9bd1bf8ef3ce7471b910Douglas Gregor#include "clang/AST/DeclNodes.def" 8156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 8264650af7cc4352c6c67b9bd1bf8ef3ce7471b910Douglas Gregor fprintf(stderr, "Total bytes = %d\n", totalBytes); 8356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman} 8456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 8556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanvoid Decl::addDeclKind(Kind k) { 8656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman switch (k) { 8764650af7cc4352c6c67b9bd1bf8ef3ce7471b910Douglas Gregor default: assert(0 && "Declaration not in DeclNodes.def!"); 8864650af7cc4352c6c67b9bd1bf8ef3ce7471b910Douglas Gregor#define DECL(Derived, Base) case Derived: ++n##Derived##s; break; 8964650af7cc4352c6c67b9bd1bf8ef3ce7471b910Douglas Gregor#include "clang/AST/DeclNodes.def" 9056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman } 9156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman} 9256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 9356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman//===----------------------------------------------------------------------===// 9456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman// Decl Implementation 9556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman//===----------------------------------------------------------------------===// 9656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 974afa39deaa245592977136d367251ee2c173dd8dDouglas Gregorvoid Decl::setDeclContext(DeclContext *DC) { 984afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor if (isOutOfSemaDC()) 994afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor delete getMultipleDC(); 1004afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor 1014afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor DeclCtx = reinterpret_cast<uintptr_t>(DC); 1024afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor} 1034afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor 1044afa39deaa245592977136d367251ee2c173dd8dDouglas Gregorvoid Decl::setLexicalDeclContext(DeclContext *DC) { 1054afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor if (DC == getLexicalDeclContext()) 1064afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor return; 1074afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor 1084afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor if (isInSemaDC()) { 1094afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor MultipleDC *MDC = new MultipleDC(); 1104afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor MDC->SemanticDC = getDeclContext(); 1114afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor MDC->LexicalDC = DC; 1124afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor DeclCtx = reinterpret_cast<uintptr_t>(MDC) | 0x1; 1134afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor } else { 1144afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor getMultipleDC()->LexicalDC = DC; 1154afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor } 1164afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor} 1174afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor 11856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman// Out-of-line virtual method providing a home for Decl. 11956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli FriedmanDecl::~Decl() { 1204afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor if (isOutOfSemaDC()) 1214afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor delete getMultipleDC(); 1224afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor 12356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman if (!HasAttrs) 12456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman return; 12556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 12656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman DeclAttrMapTy::iterator it = DeclAttrs->find(this); 12756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman assert(it != DeclAttrs->end() && "No attrs found but HasAttrs is true!"); 12856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 12956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman // release attributes. 13056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman delete it->second; 13156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman invalidateAttrs(); 13256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman} 13356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 13456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanvoid Decl::addAttr(Attr *NewAttr) { 13556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman if (!DeclAttrs) 13656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman DeclAttrs = new DeclAttrMapTy(); 13756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 13856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman Attr *&ExistingAttr = (*DeclAttrs)[this]; 13956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 14056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman NewAttr->setNext(ExistingAttr); 14156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman ExistingAttr = NewAttr; 14256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 14356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman HasAttrs = true; 14456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman} 14556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 14656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanvoid Decl::invalidateAttrs() { 14756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman if (!HasAttrs) return; 14856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 14956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman HasAttrs = false; 15056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman (*DeclAttrs)[this] = 0; 15156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman DeclAttrs->erase(this); 15256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 15356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman if (DeclAttrs->empty()) { 15456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman delete DeclAttrs; 15556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman DeclAttrs = 0; 15656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman } 15756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman} 15856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 15956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanconst Attr *Decl::getAttrs() const { 16056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman if (!HasAttrs) 16156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman return 0; 16256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 16356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman return (*DeclAttrs)[this]; 16456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman} 16556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 16656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanvoid Decl::swapAttrs(Decl *RHS) { 16756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman bool HasLHSAttr = this->HasAttrs; 16856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman bool HasRHSAttr = RHS->HasAttrs; 16956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 17056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman // Usually, neither decl has attrs, nothing to do. 17156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman if (!HasLHSAttr && !HasRHSAttr) return; 17256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 17356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman // If 'this' has no attrs, swap the other way. 17456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman if (!HasLHSAttr) 17556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman return RHS->swapAttrs(this); 17656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 17756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman // Handle the case when both decls have attrs. 17856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman if (HasRHSAttr) { 17956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman std::swap((*DeclAttrs)[this], (*DeclAttrs)[RHS]); 18056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman return; 18156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman } 18256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 18356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman // Otherwise, LHS has an attr and RHS doesn't. 18456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman (*DeclAttrs)[RHS] = (*DeclAttrs)[this]; 18556d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman (*DeclAttrs).erase(this); 18656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman this->HasAttrs = false; 18756d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman RHS->HasAttrs = true; 18856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman} 18956d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 19056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 19156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedmanvoid Decl::Destroy(ASTContext& C) { 192a0fc55f3e9d7d7aa8761d0a9726033947d0d6bc0Douglas Gregor#if 0 19300ad0ef8369ee65337ff29c8db3c1841a01102c4Douglas Gregor // FIXME: Once ownership is fully understood, we can enable this code 19400ad0ef8369ee65337ff29c8db3c1841a01102c4Douglas Gregor if (DeclContext *DC = dyn_cast<DeclContext>(this)) 19500ad0ef8369ee65337ff29c8db3c1841a01102c4Douglas Gregor DC->decls_begin()->Destroy(C); 19656d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 19700ad0ef8369ee65337ff29c8db3c1841a01102c4Douglas Gregor // Observe the unrolled recursion. By setting N->NextDeclInScope = 0x0 1984afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor // within the loop, only the Destroy method for the first Decl 1994afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor // will deallocate all of the Decls in a chain. 2004afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor 20100ad0ef8369ee65337ff29c8db3c1841a01102c4Douglas Gregor Decl* N = NextDeclInScope; 2024afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor 2034afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor while (N) { 20400ad0ef8369ee65337ff29c8db3c1841a01102c4Douglas Gregor Decl* Tmp = N->NextDeclInScope; 20500ad0ef8369ee65337ff29c8db3c1841a01102c4Douglas Gregor N->NextDeclInScope = 0; 2064afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor N->Destroy(C); 2074afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor N = Tmp; 20856d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman } 209a0fc55f3e9d7d7aa8761d0a9726033947d0d6bc0Douglas Gregor 21056d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman this->~Decl(); 2113e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff C.Deallocate((void *)this); 21200ad0ef8369ee65337ff29c8db3c1841a01102c4Douglas Gregor#endif 21356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman} 21456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 21542220c5432c141d47cc8ce786e472b49dc907378Argyrios KyrtzidisDecl *Decl::castFromDeclContext (const DeclContext *D) { 2163d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis Decl::Kind DK = D->getDeclKind(); 2173d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis switch(DK) { 2183d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis#define DECL_CONTEXT(Name) \ 2193d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis case Decl::Name: \ 2203d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis return static_cast<Name##Decl*>(const_cast<DeclContext*>(D)); 2213d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis#define DECL_CONTEXT_BASE(Name) 2223d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis#include "clang/AST/DeclNodes.def" 2233d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis default: 2243d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis#define DECL_CONTEXT_BASE(Name) \ 2253d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis if (DK >= Decl::Name##First && DK <= Decl::Name##Last) \ 2263d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis return static_cast<Name##Decl*>(const_cast<DeclContext*>(D)); 2273d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis#include "clang/AST/DeclNodes.def" 2283d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis assert(false && "a decl that inherits DeclContext isn't handled"); 2293d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis return 0; 2303d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis } 23142220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidis} 23242220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidis 23342220c5432c141d47cc8ce786e472b49dc907378Argyrios KyrtzidisDeclContext *Decl::castToDeclContext(const Decl *D) { 2343d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis Decl::Kind DK = D->getKind(); 2353d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis switch(DK) { 2363d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis#define DECL_CONTEXT(Name) \ 2373d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis case Decl::Name: \ 2383d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis return static_cast<Name##Decl*>(const_cast<Decl*>(D)); 2393d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis#define DECL_CONTEXT_BASE(Name) 2403d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis#include "clang/AST/DeclNodes.def" 2413d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis default: 2423d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis#define DECL_CONTEXT_BASE(Name) \ 2433d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis if (DK >= Decl::Name##First && DK <= Decl::Name##Last) \ 2443d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis return static_cast<Name##Decl*>(const_cast<Decl*>(D)); 2453d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis#include "clang/AST/DeclNodes.def" 2463d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis assert(false && "a decl that inherits DeclContext isn't handled"); 2473d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis return 0; 2483d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis } 24942220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidis} 25042220c5432c141d47cc8ce786e472b49dc907378Argyrios Kyrtzidis 25156d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman//===----------------------------------------------------------------------===// 25256d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman// DeclContext Implementation 25356d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman//===----------------------------------------------------------------------===// 25456d29376459f88dcdbcbf6c9a83c2f77e433f1e2Eli Friedman 2553d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidisbool DeclContext::classof(const Decl *D) { 2563d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis switch (D->getKind()) { 2573d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis#define DECL_CONTEXT(Name) case Decl::Name: 2583d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis#define DECL_CONTEXT_BASE(Name) 2593d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis#include "clang/AST/DeclNodes.def" 2603d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis return true; 2613d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis default: 2623d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis#define DECL_CONTEXT_BASE(Name) \ 2633d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis if (D->getKind() >= Decl::Name##First && \ 2643d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis D->getKind() <= Decl::Name##Last) \ 2653d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis return true; 2663d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis#include "clang/AST/DeclNodes.def" 2673d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis return false; 2683d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis } 2693d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis} 2703d7641e090cf113dec64306a1597d3e4523e2a55Argyrios Kyrtzidis 27167762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner/// StoredDeclsList - This is an array of decls optimized a common case of only 27267762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner/// containing one entry. 27367762a35dca6202d2272db02d0b8740728e3aa8fChris Lattnerstruct StoredDeclsList { 27467762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner /// Data - If the integer is 0, then the pointer is a NamedDecl*. If the 27567762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner /// integer is 1, then it is a VectorTy; 27667762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner llvm::PointerIntPair<void*, 1, bool> Data; 27767762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner 27867762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner /// VectorTy - When in vector form, this is what the Data pointer points to. 27967762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner typedef llvm::SmallVector<NamedDecl*, 4> VectorTy; 28067762a35dca6202d2272db02d0b8740728e3aa8fChris Lattnerpublic: 28167762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner StoredDeclsList() {} 28267762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner StoredDeclsList(const StoredDeclsList &RHS) : Data(RHS.Data) { 28367762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner if (isVector()) 28467762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner Data.setPointer(new VectorTy(getVector())); 28567762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner } 28667762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner 28767762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner ~StoredDeclsList() { 28867762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner // If this is a vector-form, free the vector. 28967762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner if (isVector()) 29067762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner delete &getVector(); 29167762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner } 29267762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner 29301011d4e4d6d5146f58233a508509757382d62c3Chris Lattner StoredDeclsList &operator=(const StoredDeclsList &RHS) { 29401011d4e4d6d5146f58233a508509757382d62c3Chris Lattner if (isVector()) 29501011d4e4d6d5146f58233a508509757382d62c3Chris Lattner delete &getVector(); 29601011d4e4d6d5146f58233a508509757382d62c3Chris Lattner Data = RHS.Data; 29701011d4e4d6d5146f58233a508509757382d62c3Chris Lattner if (isVector()) 29801011d4e4d6d5146f58233a508509757382d62c3Chris Lattner Data.setPointer(new VectorTy(getVector())); 29901011d4e4d6d5146f58233a508509757382d62c3Chris Lattner return *this; 30001011d4e4d6d5146f58233a508509757382d62c3Chris Lattner } 30101011d4e4d6d5146f58233a508509757382d62c3Chris Lattner 30267762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner bool isVector() const { return Data.getInt() != 0; } 30367762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner bool isInline() const { return Data.getInt() == 0; } 30467762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner bool isNull() const { return Data.getPointer() == 0; } 30567762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner 30667762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner void setOnlyValue(NamedDecl *ND) { 30767762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner assert(isInline() && "Not inline"); 30867762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner Data.setPointer(ND); 30967762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner } 31067762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner 31167762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner /// getLookupResult - Return an array of all the decls that this list 31267762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner /// represents. 31367762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner DeclContext::lookup_result getLookupResult() { 31467762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner // If we have a single inline unit, return it. 31567762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner if (isInline()) { 31667762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner assert(!isNull() && "Empty list isn't allowed"); 31767762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner 31867762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner // Data is a raw pointer to a NamedDecl*, return it. 31967762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner void *Ptr = &Data; 32067762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner return DeclContext::lookup_result((NamedDecl**)Ptr, (NamedDecl**)Ptr+1); 32167762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner } 32267762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner 32367762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner // Otherwise, we have a range result. 32467762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner VectorTy &V = getVector(); 32567762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner return DeclContext::lookup_result(&V[0], &V[0]+V.size()); 32667762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner } 32767762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner 32867762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner /// HandleRedeclaration - If this is a redeclaration of an existing decl, 32967762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner /// replace the old one with D and return true. Otherwise return false. 33067762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner bool HandleRedeclaration(NamedDecl *D) { 33167762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner // Most decls only have one entry in their list, special case it. 33267762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner if (isInline()) { 33367762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner if (!D->declarationReplaces(getInlineValue())) 33467762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner return false; 33567762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner setOnlyValue(D); 33667762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner return true; 33767762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner } 33867762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner 33967762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner // Determine if this declaration is actually a redeclaration. 34067762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner VectorTy &Vec = getVector(); 34167762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner VectorTy::iterator RDI 34267762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner = std::find_if(Vec.begin(), Vec.end(), 34367762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner std::bind1st(std::mem_fun(&NamedDecl::declarationReplaces), 34467762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner D)); 34567762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner if (RDI == Vec.end()) 34667762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner return false; 34767762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner *RDI = D; 34867762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner return true; 34967762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner } 35067762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner 35167762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner /// AddSubsequentDecl - This is called on the second and later decl when it is 35267762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner /// not a redeclaration to merge it into the appropriate place in our list. 35367762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner /// 35467762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner void AddSubsequentDecl(NamedDecl *D) { 35567762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner // If this is the second decl added to the list, convert this to vector 35667762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner // form. 35767762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner if (isInline()) { 35867762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner NamedDecl *OldD = getInlineValue(); 35967762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner Data.setInt(1); 36067762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner VectorTy *VT = new VectorTy(); 36167762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner VT->push_back(OldD); 36267762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner Data.setPointer(VT); 36367762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner } 36467762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner 36567762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner VectorTy &Vec = getVector(); 36667762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner if (isa<UsingDirectiveDecl>(D) || 36767762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner D->getIdentifierNamespace() == Decl::IDNS_Tag) 36867762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner Vec.push_back(D); 36967762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner else if (Vec.back()->getIdentifierNamespace() == Decl::IDNS_Tag) { 37067762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner NamedDecl *TagD = Vec.back(); 37167762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner Vec.back() = D; 37267762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner Vec.push_back(TagD); 37367762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner } else 37467762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner Vec.push_back(D); 37567762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner } 37667762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner 37767762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner 37867762a35dca6202d2272db02d0b8740728e3aa8fChris Lattnerprivate: 37967762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner VectorTy &getVector() const { 38067762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner assert(isVector() && "Not in vector form"); 38167762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner return *static_cast<VectorTy*>(Data.getPointer()); 38267762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner } 38367762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner 38467762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner NamedDecl *getInlineValue() const { 38567762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner assert(isInline() && "Not in inline form"); 38667762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner return (NamedDecl*)Data.getPointer(); 38767762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner } 38867762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner}; 38967762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner 39067762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner 39167762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner 39267762a35dca6202d2272db02d0b8740728e3aa8fChris Lattnertypedef llvm::DenseMap<DeclarationName, StoredDeclsList> StoredDeclsMap; 39344b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 39444b4321feab46299d3f5cfd404680884752a0fcfDouglas GregorDeclContext::~DeclContext() { 39544b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor unsigned Size = LookupPtr.getInt(); 39691942501b6f71a41d3a09bedec19be479832c718Chris Lattner if (Size == LookupIsMap) 39791942501b6f71a41d3a09bedec19be479832c718Chris Lattner delete static_cast<StoredDeclsMap*>(LookupPtr.getPointer()); 39891942501b6f71a41d3a09bedec19be479832c718Chris Lattner else 39991942501b6f71a41d3a09bedec19be479832c718Chris Lattner delete [] static_cast<NamedDecl**>(LookupPtr.getPointer()); 40044b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor} 40144b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 40244b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregorvoid DeclContext::DestroyDecls(ASTContext &C) { 40300ad0ef8369ee65337ff29c8db3c1841a01102c4Douglas Gregor for (decl_iterator D = decls_begin(); D != decls_end(); ) 40400ad0ef8369ee65337ff29c8db3c1841a01102c4Douglas Gregor (*D++)->Destroy(C); 40544b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor} 40644b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 407074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregorbool DeclContext::isTransparentContext() const { 408074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor if (DeclKind == Decl::Enum) 409074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor return true; // FIXME: Check for C++0x scoped enums 410074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor else if (DeclKind == Decl::LinkageSpec) 411074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor return true; 41265100792a69a16895bd80f1d639b99e7ad903386Douglas Gregor else if (DeclKind >= Decl::RecordFirst && DeclKind <= Decl::RecordLast) 413bcbffc46f1ad3796c4582fa1e3a9113b5aa26061Douglas Gregor return cast<RecordDecl>(this)->isAnonymousStructOrUnion(); 414074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor else if (DeclKind == Decl::Namespace) 415074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor return false; // FIXME: Check for C++0x inline namespaces 416074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor 417074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor return false; 418074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor} 419074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor 4200701bbb228dfd87e1fe82a0a4b7b9facfecb43daSteve NaroffDeclContext *DeclContext::getPrimaryContext() { 42144b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor switch (DeclKind) { 42244b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor case Decl::TranslationUnit: 423074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor case Decl::LinkageSpec: 424074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor case Decl::Block: 42544b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor // There is only one DeclContext for these entities. 42644b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor return this; 42744b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 42844b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor case Decl::Namespace: 42944b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor // The original namespace is our primary context. 43044b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor return static_cast<NamespaceDecl*>(this)->getOriginalNamespace(); 43144b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 43244b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor case Decl::ObjCMethod: 43344b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor return this; 43444b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 43544b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor case Decl::ObjCInterface: 4360701bbb228dfd87e1fe82a0a4b7b9facfecb43daSteve Naroff case Decl::ObjCProtocol: 4370701bbb228dfd87e1fe82a0a4b7b9facfecb43daSteve Naroff case Decl::ObjCCategory: 43844b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor // FIXME: Can Objective-C interfaces be forward-declared? 43944b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor return this; 44044b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 4410701bbb228dfd87e1fe82a0a4b7b9facfecb43daSteve Naroff case Decl::ObjCImplementation: 4420701bbb228dfd87e1fe82a0a4b7b9facfecb43daSteve Naroff case Decl::ObjCCategoryImpl: 4430701bbb228dfd87e1fe82a0a4b7b9facfecb43daSteve Naroff return this; 4440701bbb228dfd87e1fe82a0a4b7b9facfecb43daSteve Naroff 44544b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor default: 446cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor if (DeclKind >= Decl::TagFirst && DeclKind <= Decl::TagLast) { 447cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor // If this is a tag type that has a definition or is currently 448cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor // being defined, that definition is our primary context. 449fc705b84347e6fb4746a1a7e26949f64c2f2f358Douglas Gregor if (const TagType *TagT = cast<TagDecl>(this)->TypeForDecl->getAsTagType()) 450cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor if (TagT->isBeingDefined() || 451cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor (TagT->getDecl() && TagT->getDecl()->isDefinition())) 452cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor return TagT->getDecl(); 453cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor return this; 454cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor } 455cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor 45644b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor assert(DeclKind >= Decl::FunctionFirst && DeclKind <= Decl::FunctionLast && 45744b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor "Unknown DeclContext kind"); 45844b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor return this; 45944b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor } 46044b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor} 46144b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 46244b4321feab46299d3f5cfd404680884752a0fcfDouglas GregorDeclContext *DeclContext::getNextContext() { 46344b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor switch (DeclKind) { 46444b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor case Decl::Namespace: 46544b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor // Return the next namespace 46644b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor return static_cast<NamespaceDecl*>(this)->getNextNamespace(); 46744b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 46844b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor default: 46944b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor return 0; 47044b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor } 47144b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor} 47244b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 4734afa39deaa245592977136d367251ee2c173dd8dDouglas Gregorvoid DeclContext::addDecl(Decl *D) { 4747f0be13b435ad110f99af83a24a50f43225f3083Chris Lattner assert(D->getLexicalDeclContext() == this && 4757f0be13b435ad110f99af83a24a50f43225f3083Chris Lattner "Decl inserted into wrong lexical context"); 4766037fcba3431b47de1a994c9b286feac17894effDouglas Gregor assert(!D->NextDeclInScope && D != LastDecl && 4776037fcba3431b47de1a994c9b286feac17894effDouglas Gregor "Decl already inserted into a DeclContext"); 4786037fcba3431b47de1a994c9b286feac17894effDouglas Gregor 4796037fcba3431b47de1a994c9b286feac17894effDouglas Gregor if (FirstDecl) { 4806037fcba3431b47de1a994c9b286feac17894effDouglas Gregor LastDecl->NextDeclInScope = D; 4816037fcba3431b47de1a994c9b286feac17894effDouglas Gregor LastDecl = D; 4826037fcba3431b47de1a994c9b286feac17894effDouglas Gregor } else { 4836037fcba3431b47de1a994c9b286feac17894effDouglas Gregor FirstDecl = LastDecl = D; 4846037fcba3431b47de1a994c9b286feac17894effDouglas Gregor } 4854afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor 4864afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor if (NamedDecl *ND = dyn_cast<NamedDecl>(D)) 48740f4e69002af9623a1f959bd57b99afda186a6a7Douglas Gregor ND->getDeclContext()->makeDeclVisibleInContext(ND); 48844b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor} 48944b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 490074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor/// buildLookup - Build the lookup data structure with all of the 491074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor/// declarations in DCtx (and any other contexts linked to it or 492074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor/// transparent contexts nested within it). 4930701bbb228dfd87e1fe82a0a4b7b9facfecb43daSteve Naroffvoid DeclContext::buildLookup(DeclContext *DCtx) { 494074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor for (; DCtx; DCtx = DCtx->getNextContext()) { 4954f3b8f8ac2f8c89028a2f8793df0a7887df809d4Douglas Gregor for (decl_iterator D = DCtx->decls_begin(), DEnd = DCtx->decls_end(); 4964f3b8f8ac2f8c89028a2f8793df0a7887df809d4Douglas Gregor D != DEnd; ++D) { 497074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor // Insert this declaration into the lookup structure 4984afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor if (NamedDecl *ND = dyn_cast<NamedDecl>(*D)) 49940f4e69002af9623a1f959bd57b99afda186a6a7Douglas Gregor makeDeclVisibleInContextImpl(ND); 500074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor 501074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor // If this declaration is itself a transparent declaration context, 502074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor // add its members (recursively). 503074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor if (DeclContext *InnerCtx = dyn_cast<DeclContext>(*D)) 504074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor if (InnerCtx->isTransparentContext()) 5050701bbb228dfd87e1fe82a0a4b7b9facfecb43daSteve Naroff buildLookup(InnerCtx->getPrimaryContext()); 506074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor } 507074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor } 508074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor} 509074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor 51044b4321feab46299d3f5cfd404680884752a0fcfDouglas GregorDeclContext::lookup_result 5110701bbb228dfd87e1fe82a0a4b7b9facfecb43daSteve NaroffDeclContext::lookup(DeclarationName Name) { 5120701bbb228dfd87e1fe82a0a4b7b9facfecb43daSteve Naroff DeclContext *PrimaryContext = getPrimaryContext(); 51344b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor if (PrimaryContext != this) 5140701bbb228dfd87e1fe82a0a4b7b9facfecb43daSteve Naroff return PrimaryContext->lookup(Name); 51544b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 5163fc749d899dfc194162128c1a88933148a39b68dDouglas Gregor /// If there is no lookup data structure, build one now by walking 51744b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor /// all of the linked DeclContexts (in declaration order!) and 51844b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor /// inserting their values. 519074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor if (LookupPtr.getPointer() == 0) 5200701bbb228dfd87e1fe82a0a4b7b9facfecb43daSteve Naroff buildLookup(this); 52144b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 52244b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor if (isLookupMap()) { 52344b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor StoredDeclsMap *Map = static_cast<StoredDeclsMap*>(LookupPtr.getPointer()); 52444b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor StoredDeclsMap::iterator Pos = Map->find(Name); 52591942501b6f71a41d3a09bedec19be479832c718Chris Lattner if (Pos == Map->end()) 52691942501b6f71a41d3a09bedec19be479832c718Chris Lattner return lookup_result(0, 0); 52767762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner return Pos->second.getLookupResult(); 52844b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor } 52944b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 53044b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor // We have a small array. Look into it. 53144b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor unsigned Size = LookupPtr.getInt(); 5324afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor NamedDecl **Array = static_cast<NamedDecl**>(LookupPtr.getPointer()); 533e267ff35b2f4e9d2b0d8bf24109d41cc7398b61bDouglas Gregor for (unsigned Idx = 0; Idx != Size; ++Idx) 53444b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor if (Array[Idx]->getDeclName() == Name) { 5353fc749d899dfc194162128c1a88933148a39b68dDouglas Gregor unsigned Last = Idx + 1; 5363fc749d899dfc194162128c1a88933148a39b68dDouglas Gregor while (Last != Size && Array[Last]->getDeclName() == Name) 5373fc749d899dfc194162128c1a88933148a39b68dDouglas Gregor ++Last; 5383fc749d899dfc194162128c1a88933148a39b68dDouglas Gregor return lookup_result(&Array[Idx], &Array[Last]); 53944b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor } 54044b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 5413fc749d899dfc194162128c1a88933148a39b68dDouglas Gregor return lookup_result(0, 0); 54244b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor} 54344b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 54444b4321feab46299d3f5cfd404680884752a0fcfDouglas GregorDeclContext::lookup_const_result 5450701bbb228dfd87e1fe82a0a4b7b9facfecb43daSteve NaroffDeclContext::lookup(DeclarationName Name) const { 5460701bbb228dfd87e1fe82a0a4b7b9facfecb43daSteve Naroff return const_cast<DeclContext*>(this)->lookup(Name); 54744b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor} 54844b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 54917a9b9e3ee75f5dbb4819cc8ebf40eec8015f84aDouglas Gregorconst DeclContext *DeclContext::getLookupContext() const { 55017a9b9e3ee75f5dbb4819cc8ebf40eec8015f84aDouglas Gregor const DeclContext *Ctx = this; 55172de6676bd30f9081ee4166bbe07b4c270258ce6Douglas Gregor // Skip through transparent contexts. 552ce35607c282c845b3285d0f6e106489d8bbeba13Douglas Gregor while (Ctx->isTransparentContext()) 553ce35607c282c845b3285d0f6e106489d8bbeba13Douglas Gregor Ctx = Ctx->getParent(); 554ce35607c282c845b3285d0f6e106489d8bbeba13Douglas Gregor return Ctx; 555ce35607c282c845b3285d0f6e106489d8bbeba13Douglas Gregor} 556ce35607c282c845b3285d0f6e106489d8bbeba13Douglas Gregor 55788b7094185b9d4fe9820c731b6936d8d37f6143eDouglas GregorDeclContext *DeclContext::getEnclosingNamespaceContext() { 55888b7094185b9d4fe9820c731b6936d8d37f6143eDouglas Gregor DeclContext *Ctx = this; 55988b7094185b9d4fe9820c731b6936d8d37f6143eDouglas Gregor // Skip through non-namespace, non-translation-unit contexts. 56088b7094185b9d4fe9820c731b6936d8d37f6143eDouglas Gregor while (!Ctx->isFileContext() || Ctx->isTransparentContext()) 56188b7094185b9d4fe9820c731b6936d8d37f6143eDouglas Gregor Ctx = Ctx->getParent(); 56288b7094185b9d4fe9820c731b6936d8d37f6143eDouglas Gregor return Ctx->getPrimaryContext(); 56388b7094185b9d4fe9820c731b6936d8d37f6143eDouglas Gregor} 56488b7094185b9d4fe9820c731b6936d8d37f6143eDouglas Gregor 56540f4e69002af9623a1f959bd57b99afda186a6a7Douglas Gregorvoid DeclContext::makeDeclVisibleInContext(NamedDecl *D) { 566cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor // FIXME: This feels like a hack. Should DeclarationName support 567cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor // template-ids, or is there a better way to keep specializations 568cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor // from being visible? 569cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor if (isa<ClassTemplateSpecializationDecl>(D)) 570cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor return; 571cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor 5720701bbb228dfd87e1fe82a0a4b7b9facfecb43daSteve Naroff DeclContext *PrimaryContext = getPrimaryContext(); 57344b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor if (PrimaryContext != this) { 57440f4e69002af9623a1f959bd57b99afda186a6a7Douglas Gregor PrimaryContext->makeDeclVisibleInContext(D); 57544b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor return; 57644b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor } 57744b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 57844b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor // If we already have a lookup data structure, perform the insertion 57944b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor // into it. Otherwise, be lazy and don't build that structure until 58044b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor // someone asks for it. 58144b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor if (LookupPtr.getPointer()) 58240f4e69002af9623a1f959bd57b99afda186a6a7Douglas Gregor makeDeclVisibleInContextImpl(D); 583074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor 584074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor // If we are a transparent context, insert into our parent context, 585074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor // too. This operation is recursive. 586074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor if (isTransparentContext()) 58740f4e69002af9623a1f959bd57b99afda186a6a7Douglas Gregor getParent()->makeDeclVisibleInContext(D); 58844b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor} 58944b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 59040f4e69002af9623a1f959bd57b99afda186a6a7Douglas Gregorvoid DeclContext::makeDeclVisibleInContextImpl(NamedDecl *D) { 591074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor // Skip unnamed declarations. 592074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor if (!D->getDeclName()) 593074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor return; 594074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor 595cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor // FIXME: This feels like a hack. Should DeclarationName support 596cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor // template-ids, or is there a better way to keep specializations 597cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor // from being visible? 598cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor if (isa<ClassTemplateSpecializationDecl>(D)) 599cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor return; 600cc636688c4fd10b1732ce3e33b2b106024d545caDouglas Gregor 6013fc749d899dfc194162128c1a88933148a39b68dDouglas Gregor bool MayBeRedeclaration = true; 6023fc749d899dfc194162128c1a88933148a39b68dDouglas Gregor 60344b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor if (!isLookupMap()) { 60444b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor unsigned Size = LookupPtr.getInt(); 60544b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 60644b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor // The lookup data is stored as an array. Search through the array 60744b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor // to find the insertion location. 6084afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor NamedDecl **Array; 60944b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor if (Size == 0) { 6104afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor Array = new NamedDecl*[LookupIsMap - 1]; 61144b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor LookupPtr.setPointer(Array); 61244b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor } else { 6134afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor Array = static_cast<NamedDecl **>(LookupPtr.getPointer()); 61444b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor } 61544b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 61644b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor // We always keep declarations of the same name next to each other 61744b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor // in the array, so that it is easy to return multiple results 6183fc749d899dfc194162128c1a88933148a39b68dDouglas Gregor // from lookup(). 6193fc749d899dfc194162128c1a88933148a39b68dDouglas Gregor unsigned FirstMatch; 6203fc749d899dfc194162128c1a88933148a39b68dDouglas Gregor for (FirstMatch = 0; FirstMatch != Size; ++FirstMatch) 6213fc749d899dfc194162128c1a88933148a39b68dDouglas Gregor if (Array[FirstMatch]->getDeclName() == D->getDeclName()) 622e267ff35b2f4e9d2b0d8bf24109d41cc7398b61bDouglas Gregor break; 62344b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 6243fc749d899dfc194162128c1a88933148a39b68dDouglas Gregor unsigned InsertPos = FirstMatch; 6253fc749d899dfc194162128c1a88933148a39b68dDouglas Gregor if (FirstMatch != Size) { 6263fc749d899dfc194162128c1a88933148a39b68dDouglas Gregor // We found another declaration with the same name. First 6273fc749d899dfc194162128c1a88933148a39b68dDouglas Gregor // determine whether this is a redeclaration of an existing 6283fc749d899dfc194162128c1a88933148a39b68dDouglas Gregor // declaration in this scope, in which case we will replace the 6293fc749d899dfc194162128c1a88933148a39b68dDouglas Gregor // existing declaration. 6303fc749d899dfc194162128c1a88933148a39b68dDouglas Gregor unsigned LastMatch = FirstMatch; 6313fc749d899dfc194162128c1a88933148a39b68dDouglas Gregor for (; LastMatch != Size; ++LastMatch) { 6323fc749d899dfc194162128c1a88933148a39b68dDouglas Gregor if (Array[LastMatch]->getDeclName() != D->getDeclName()) 6333fc749d899dfc194162128c1a88933148a39b68dDouglas Gregor break; 6343fc749d899dfc194162128c1a88933148a39b68dDouglas Gregor 6356ed40e351a7c1fb3084434f1db19216b79623cf0Douglas Gregor if (D->declarationReplaces(Array[LastMatch])) { 6363fc749d899dfc194162128c1a88933148a39b68dDouglas Gregor // D is a redeclaration of an existing element in the 6373fc749d899dfc194162128c1a88933148a39b68dDouglas Gregor // array. Replace that element with D. 6383fc749d899dfc194162128c1a88933148a39b68dDouglas Gregor Array[LastMatch] = D; 6393fc749d899dfc194162128c1a88933148a39b68dDouglas Gregor return; 6403fc749d899dfc194162128c1a88933148a39b68dDouglas Gregor } 64144b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor } 64244b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 6433fc749d899dfc194162128c1a88933148a39b68dDouglas Gregor // [FirstMatch, LastMatch) contains the set of declarations that 6443fc749d899dfc194162128c1a88933148a39b68dDouglas Gregor // have the same name as this declaration. Determine where the 6452a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor // declaration D will be inserted into this range. 6462a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor if (D->getKind() == Decl::UsingDirective || 6472a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor D->getIdentifierNamespace() == Decl::IDNS_Tag) 6483fc749d899dfc194162128c1a88933148a39b68dDouglas Gregor InsertPos = LastMatch; 6493fc749d899dfc194162128c1a88933148a39b68dDouglas Gregor else if (Array[LastMatch-1]->getIdentifierNamespace() == Decl::IDNS_Tag) 6503fc749d899dfc194162128c1a88933148a39b68dDouglas Gregor InsertPos = LastMatch - 1; 6513fc749d899dfc194162128c1a88933148a39b68dDouglas Gregor else 6523fc749d899dfc194162128c1a88933148a39b68dDouglas Gregor InsertPos = LastMatch; 65344b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor } 65444b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 65544b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor if (Size < LookupIsMap - 1) { 65644b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor // The new declaration will fit in the array. Insert the new 65744b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor // declaration at the position Match in the array. 6583fc749d899dfc194162128c1a88933148a39b68dDouglas Gregor for (unsigned Idx = Size; Idx > InsertPos; --Idx) 65944b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor Array[Idx] = Array[Idx-1]; 66044b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 6613fc749d899dfc194162128c1a88933148a39b68dDouglas Gregor Array[InsertPos] = D; 66244b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor LookupPtr.setInt(Size + 1); 66344b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor return; 66444b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor } 66544b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 66644b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor // We've reached capacity in this array. Create a map and copy in 66744b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor // all of the declarations that were stored in the array. 66844b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor StoredDeclsMap *Map = new StoredDeclsMap(16); 66944b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor LookupPtr.setPointer(Map); 67044b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor LookupPtr.setInt(LookupIsMap); 671e267ff35b2f4e9d2b0d8bf24109d41cc7398b61bDouglas Gregor for (unsigned Idx = 0; Idx != LookupIsMap - 1; ++Idx) 67240f4e69002af9623a1f959bd57b99afda186a6a7Douglas Gregor makeDeclVisibleInContextImpl(Array[Idx]); 67344b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor delete [] Array; 67444b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 67544b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor // Fall through to perform insertion into the map. 6763fc749d899dfc194162128c1a88933148a39b68dDouglas Gregor MayBeRedeclaration = false; 6773fc749d899dfc194162128c1a88933148a39b68dDouglas Gregor } 67844b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor 67944b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor // Insert this declaration into the map. 68067762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner StoredDeclsMap &Map = *static_cast<StoredDeclsMap*>(LookupPtr.getPointer()); 68167762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner StoredDeclsList &DeclNameEntries = Map[D->getDeclName()]; 68267762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner if (DeclNameEntries.isNull()) { 68367762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner DeclNameEntries.setOnlyValue(D); 684bd6c80037626a37ce3936a36d9ae287f475845b7Chris Lattner return; 68544b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor } 68691942501b6f71a41d3a09bedec19be479832c718Chris Lattner 687bdc3d0034d5b637b211abd01a936267df27118ccChris Lattner // If it is possible that this is a redeclaration, check to see if there is 688bdc3d0034d5b637b211abd01a936267df27118ccChris Lattner // already a decl for which declarationReplaces returns true. If there is 689bdc3d0034d5b637b211abd01a936267df27118ccChris Lattner // one, just replace it and return. 69067762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner if (MayBeRedeclaration && DeclNameEntries.HandleRedeclaration(D)) 69167762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner return; 69291942501b6f71a41d3a09bedec19be479832c718Chris Lattner 693bd6c80037626a37ce3936a36d9ae287f475845b7Chris Lattner // Put this declaration into the appropriate slot. 69467762a35dca6202d2272db02d0b8740728e3aa8fChris Lattner DeclNameEntries.AddSubsequentDecl(D); 69544b4321feab46299d3f5cfd404680884752a0fcfDouglas Gregor} 6962a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor 6972a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor/// Returns iterator range [First, Last) of UsingDirectiveDecls stored within 6982a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor/// this context. 6992a3009a432bdcec59e6383d7b2b17494d6f91649Douglas GregorDeclContext::udir_iterator_range DeclContext::getUsingDirectives() const { 7002a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor lookup_const_result Result = lookup(UsingDirectiveDecl::getName()); 7012a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor return udir_iterator_range(reinterpret_cast<udir_iterator>(Result.first), 7022a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor reinterpret_cast<udir_iterator>(Result.second)); 7032a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor} 7042a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor 705