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