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