IdentifierResolver.cpp revision 7cbc558ffda5877ec4d2e432534e3d3d4ac10050
1a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner//===- IdentifierResolver.cpp - Lexical Scope Name lookup -------*- C++ -*-===//
2a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner//
3a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner//                     The LLVM Compiler Infrastructure
4a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner//
5a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner// This file is distributed under the University of Illinois Open Source
6a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner// License. See LICENSE.TXT for details.
7a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner//
8a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner//===----------------------------------------------------------------------===//
9a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner//
10321f278db3405268e8644eb75f4fcf8900e0d09cArgyrios Kyrtzidis// This file implements the IdentifierResolver class, which is used for lexical
112def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor// scoped lookup, based on declaration names.
12a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner//
13a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner//===----------------------------------------------------------------------===//
14a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner
15e737f5041a36d0befb39ffeed8d50ba15916d3daDouglas Gregor#include "clang/Sema/IdentifierResolver.h"
167cd088e519d7e6caa4c4c12db52e0e4ae35d25c2John McCall#include "clang/Sema/Scope.h"
177cd088e519d7e6caa4c4c12db52e0e4ae35d25c2John McCall#include "clang/AST/Decl.h"
18f99cb051665d2faab038ed855b2eff15d603796dArgyrios Kyrtzidis#include "clang/Basic/LangOptions.h"
19a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner
20a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattnerusing namespace clang;
21a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner
2281bebb1e2e6bb05e360f36da098dc7016e8f654bArgyrios Kyrtzidis//===----------------------------------------------------------------------===//
2381bebb1e2e6bb05e360f36da098dc7016e8f654bArgyrios Kyrtzidis// IdDeclInfoMap class
2481bebb1e2e6bb05e360f36da098dc7016e8f654bArgyrios Kyrtzidis//===----------------------------------------------------------------------===//
25a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner
262def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor/// IdDeclInfoMap - Associates IdDeclInfos with declaration names.
27321f278db3405268e8644eb75f4fcf8900e0d09cArgyrios Kyrtzidis/// Allocates 'pools' (vectors of IdDeclInfos) to avoid allocating each
28a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner/// individual IdDeclInfo to heap.
2900bc645d154f8f30bfbfb2fe508caf087793157cArgyrios Kyrtzidisclass IdentifierResolver::IdDeclInfoMap {
30eeb1cb49244a67327fce088c1f720da1f8c021a9John McCall  static const unsigned int POOL_SIZE = 512;
31eeb1cb49244a67327fce088c1f720da1f8c021a9John McCall
32eeb1cb49244a67327fce088c1f720da1f8c021a9John McCall  /// We use our own linked-list implementation because it is sadly
33eeb1cb49244a67327fce088c1f720da1f8c021a9John McCall  /// impossible to add something to a pre-C++0x STL container without
34eeb1cb49244a67327fce088c1f720da1f8c021a9John McCall  /// a completely unnecessary copy.
35eeb1cb49244a67327fce088c1f720da1f8c021a9John McCall  struct IdDeclInfoPool {
36eeb1cb49244a67327fce088c1f720da1f8c021a9John McCall    IdDeclInfoPool(IdDeclInfoPool *Next) : Next(Next) {}
37eeb1cb49244a67327fce088c1f720da1f8c021a9John McCall
38eeb1cb49244a67327fce088c1f720da1f8c021a9John McCall    IdDeclInfoPool *Next;
39eeb1cb49244a67327fce088c1f720da1f8c021a9John McCall    IdDeclInfo Pool[POOL_SIZE];
40eeb1cb49244a67327fce088c1f720da1f8c021a9John McCall  };
41eeb1cb49244a67327fce088c1f720da1f8c021a9John McCall
42eeb1cb49244a67327fce088c1f720da1f8c021a9John McCall  IdDeclInfoPool *CurPool;
43a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner  unsigned int CurIndex;
441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
45a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattnerpublic:
46eeb1cb49244a67327fce088c1f720da1f8c021a9John McCall  IdDeclInfoMap() : CurPool(0), CurIndex(POOL_SIZE) {}
47eeb1cb49244a67327fce088c1f720da1f8c021a9John McCall
48eeb1cb49244a67327fce088c1f720da1f8c021a9John McCall  ~IdDeclInfoMap() {
49eeb1cb49244a67327fce088c1f720da1f8c021a9John McCall    IdDeclInfoPool *Cur = CurPool;
50eeb1cb49244a67327fce088c1f720da1f8c021a9John McCall    while (IdDeclInfoPool *P = Cur) {
51eeb1cb49244a67327fce088c1f720da1f8c021a9John McCall      Cur = Cur->Next;
52eeb1cb49244a67327fce088c1f720da1f8c021a9John McCall      delete P;
53eeb1cb49244a67327fce088c1f720da1f8c021a9John McCall    }
54eeb1cb49244a67327fce088c1f720da1f8c021a9John McCall  }
55a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner
562def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  /// Returns the IdDeclInfo associated to the DeclarationName.
57a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner  /// It creates a new IdDeclInfo if one was not created before for this id.
582def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  IdDeclInfo &operator[](DeclarationName Name);
59a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner};
60a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner
617bc198fb47a498e327a9ceb2d17612dcb3d15095Argyrios Kyrtzidis
6281bebb1e2e6bb05e360f36da098dc7016e8f654bArgyrios Kyrtzidis//===----------------------------------------------------------------------===//
6381bebb1e2e6bb05e360f36da098dc7016e8f654bArgyrios Kyrtzidis// IdDeclInfo Implementation
6481bebb1e2e6bb05e360f36da098dc7016e8f654bArgyrios Kyrtzidis//===----------------------------------------------------------------------===//
6581bebb1e2e6bb05e360f36da098dc7016e8f654bArgyrios Kyrtzidis
6681bebb1e2e6bb05e360f36da098dc7016e8f654bArgyrios Kyrtzidis/// RemoveDecl - Remove the decl from the scope chain.
6781bebb1e2e6bb05e360f36da098dc7016e8f654bArgyrios Kyrtzidis/// The decl must already be part of the decl chain.
6881bebb1e2e6bb05e360f36da098dc7016e8f654bArgyrios Kyrtzidisvoid IdentifierResolver::IdDeclInfo::RemoveDecl(NamedDecl *D) {
6981bebb1e2e6bb05e360f36da098dc7016e8f654bArgyrios Kyrtzidis  for (DeclsTy::iterator I = Decls.end(); I != Decls.begin(); --I) {
7081bebb1e2e6bb05e360f36da098dc7016e8f654bArgyrios Kyrtzidis    if (D == *(I-1)) {
7181bebb1e2e6bb05e360f36da098dc7016e8f654bArgyrios Kyrtzidis      Decls.erase(I-1);
7281bebb1e2e6bb05e360f36da098dc7016e8f654bArgyrios Kyrtzidis      return;
7381bebb1e2e6bb05e360f36da098dc7016e8f654bArgyrios Kyrtzidis    }
7481bebb1e2e6bb05e360f36da098dc7016e8f654bArgyrios Kyrtzidis  }
7581bebb1e2e6bb05e360f36da098dc7016e8f654bArgyrios Kyrtzidis
7681bebb1e2e6bb05e360f36da098dc7016e8f654bArgyrios Kyrtzidis  assert(0 && "Didn't find this decl on its identifier's chain!");
7781bebb1e2e6bb05e360f36da098dc7016e8f654bArgyrios Kyrtzidis}
7881bebb1e2e6bb05e360f36da098dc7016e8f654bArgyrios Kyrtzidis
791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpbool
806393519272ce727f4d26e71bbefb5de712274d0eDouglas GregorIdentifierResolver::IdDeclInfo::ReplaceDecl(NamedDecl *Old, NamedDecl *New) {
816393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor  for (DeclsTy::iterator I = Decls.end(); I != Decls.begin(); --I) {
826393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor    if (Old == *(I-1)) {
836393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor      *(I - 1) = New;
846393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor      return true;
856393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor    }
866393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor  }
876393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor
886393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor  return false;
896393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor}
906393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor
9181bebb1e2e6bb05e360f36da098dc7016e8f654bArgyrios Kyrtzidis
9281bebb1e2e6bb05e360f36da098dc7016e8f654bArgyrios Kyrtzidis//===----------------------------------------------------------------------===//
9381bebb1e2e6bb05e360f36da098dc7016e8f654bArgyrios Kyrtzidis// IdentifierResolver Implementation
9481bebb1e2e6bb05e360f36da098dc7016e8f654bArgyrios Kyrtzidis//===----------------------------------------------------------------------===//
9581bebb1e2e6bb05e360f36da098dc7016e8f654bArgyrios Kyrtzidis
96eb7c388bc7ce19fffb8b4b440cee0173297e8490Argyrios KyrtzidisIdentifierResolver::IdentifierResolver(const LangOptions &langOpt)
97eb7c388bc7ce19fffb8b4b440cee0173297e8490Argyrios Kyrtzidis    : LangOpt(langOpt), IdDeclInfos(new IdDeclInfoMap) {
98eb7c388bc7ce19fffb8b4b440cee0173297e8490Argyrios Kyrtzidis}
997bc198fb47a498e327a9ceb2d17612dcb3d15095Argyrios KyrtzidisIdentifierResolver::~IdentifierResolver() {
10000bc645d154f8f30bfbfb2fe508caf087793157cArgyrios Kyrtzidis  delete IdDeclInfos;
1017bc198fb47a498e327a9ceb2d17612dcb3d15095Argyrios Kyrtzidis}
102a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner
10381bebb1e2e6bb05e360f36da098dc7016e8f654bArgyrios Kyrtzidis/// isDeclInScope - If 'Ctx' is a function/method, isDeclInScope returns true
10481bebb1e2e6bb05e360f36da098dc7016e8f654bArgyrios Kyrtzidis/// if 'D' is in Scope 'S', otherwise 'S' is ignored and isDeclInScope returns
10581bebb1e2e6bb05e360f36da098dc7016e8f654bArgyrios Kyrtzidis/// true if 'D' belongs to the given declaration context.
106f99cb051665d2faab038ed855b2eff15d603796dArgyrios Kyrtzidisbool IdentifierResolver::isDeclInScope(Decl *D, DeclContext *Ctx,
107cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor                                       ASTContext &Context, Scope *S,
108cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor                             bool ExplicitInstantiationOrSpecialization) const {
1097a126a474fdde06382b315b4e3d8ef0a21d4dc31Sebastian Redl  Ctx = Ctx->getRedeclContext();
110074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor
111f99cb051665d2faab038ed855b2eff15d603796dArgyrios Kyrtzidis  if (Ctx->isFunctionOrMethod()) {
112074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor    // Ignore the scopes associated within transparent declaration contexts.
1131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    while (S->getEntity() &&
114074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor           ((DeclContext *)S->getEntity())->isTransparentContext())
115074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor      S = S->getParent();
116074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor
117d226f65006733ed7f709c3174f22ce33391cb58fJohn McCall    if (S->isDeclScope(D))
118f99cb051665d2faab038ed855b2eff15d603796dArgyrios Kyrtzidis      return true;
119f99cb051665d2faab038ed855b2eff15d603796dArgyrios Kyrtzidis    if (LangOpt.CPlusPlus) {
120a0fd8652f3302d0f39ed9849b521ee5b76597b0aSebastian Redl      // C++ 3.3.2p3:
121a0fd8652f3302d0f39ed9849b521ee5b76597b0aSebastian Redl      // The name declared in a catch exception-declaration is local to the
122a0fd8652f3302d0f39ed9849b521ee5b76597b0aSebastian Redl      // handler and shall not be redeclared in the outermost block of the
123a0fd8652f3302d0f39ed9849b521ee5b76597b0aSebastian Redl      // handler.
124f99cb051665d2faab038ed855b2eff15d603796dArgyrios Kyrtzidis      // C++ 3.3.2p4:
125f99cb051665d2faab038ed855b2eff15d603796dArgyrios Kyrtzidis      // Names declared in the for-init-statement, and in the condition of if,
126f99cb051665d2faab038ed855b2eff15d603796dArgyrios Kyrtzidis      // while, for, and switch statements are local to the if, while, for, or
127f99cb051665d2faab038ed855b2eff15d603796dArgyrios Kyrtzidis      // switch statement (including the controlled statement), and shall not be
128f99cb051665d2faab038ed855b2eff15d603796dArgyrios Kyrtzidis      // redeclared in a subsequent condition of that statement nor in the
129f99cb051665d2faab038ed855b2eff15d603796dArgyrios Kyrtzidis      // outermost block (or, for the if statement, any of the outermost blocks)
130f99cb051665d2faab038ed855b2eff15d603796dArgyrios Kyrtzidis      // of the controlled statement.
131f99cb051665d2faab038ed855b2eff15d603796dArgyrios Kyrtzidis      //
132f99cb051665d2faab038ed855b2eff15d603796dArgyrios Kyrtzidis      assert(S->getParent() && "No TUScope?");
133f99cb051665d2faab038ed855b2eff15d603796dArgyrios Kyrtzidis      if (S->getParent()->getFlags() & Scope::ControlScope)
134d226f65006733ed7f709c3174f22ce33391cb58fJohn McCall        return S->getParent()->isDeclScope(D);
135f99cb051665d2faab038ed855b2eff15d603796dArgyrios Kyrtzidis    }
136f99cb051665d2faab038ed855b2eff15d603796dArgyrios Kyrtzidis    return false;
137f99cb051665d2faab038ed855b2eff15d603796dArgyrios Kyrtzidis  }
13881bebb1e2e6bb05e360f36da098dc7016e8f654bArgyrios Kyrtzidis
139cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor  DeclContext *DCtx = D->getDeclContext()->getRedeclContext();
140cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor  return ExplicitInstantiationOrSpecialization
141cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor           ? Ctx->InEnclosingNamespaceSetOf(DCtx)
142cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor           : Ctx->Equals(DCtx);
14381bebb1e2e6bb05e360f36da098dc7016e8f654bArgyrios Kyrtzidis}
14481bebb1e2e6bb05e360f36da098dc7016e8f654bArgyrios Kyrtzidis
145321f278db3405268e8644eb75f4fcf8900e0d09cArgyrios Kyrtzidis/// AddDecl - Link the decl to its shadowed decl chain.
14600bc645d154f8f30bfbfb2fe508caf087793157cArgyrios Kyrtzidisvoid IdentifierResolver::AddDecl(NamedDecl *D) {
1472def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  DeclarationName Name = D->getDeclName();
1481450ef99896d66ba67e2ddd2798a29be1bf560b8Sebastian Redl  if (IdentifierInfo *II = Name.getAsIdentifierInfo())
1493c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl    II->setIsFromAST(false);
1501450ef99896d66ba67e2ddd2798a29be1bf560b8Sebastian Redl
1512def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  void *Ptr = Name.getFETokenInfo<void>();
152a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner
153a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner  if (!Ptr) {
1542def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor    Name.setFETokenInfo(D);
155a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner    return;
156a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner  }
157a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner
158a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner  IdDeclInfo *IDI;
159a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner
160a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner  if (isDeclPtr(Ptr)) {
1612def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor    Name.setFETokenInfo(NULL);
1622def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor    IDI = &(*IdDeclInfos)[Name];
16300bc645d154f8f30bfbfb2fe508caf087793157cArgyrios Kyrtzidis    NamedDecl *PrevD = static_cast<NamedDecl*>(Ptr);
16400bc645d154f8f30bfbfb2fe508caf087793157cArgyrios Kyrtzidis    IDI->AddDecl(PrevD);
165a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner  } else
166a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner    IDI = toIdDeclInfo(Ptr);
167a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner
16800bc645d154f8f30bfbfb2fe508caf087793157cArgyrios Kyrtzidis  IDI->AddDecl(D);
169a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner}
170a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner
1717cbc558ffda5877ec4d2e432534e3d3d4ac10050Douglas Gregorvoid IdentifierResolver::InsertDecl(iterator Pos, NamedDecl *D) {
1727cbc558ffda5877ec4d2e432534e3d3d4ac10050Douglas Gregor  if (Pos == iterator()) {
1737cbc558ffda5877ec4d2e432534e3d3d4ac10050Douglas Gregor    // Simple case: insert at the beginning of the list (which is the
1747cbc558ffda5877ec4d2e432534e3d3d4ac10050Douglas Gregor    // end of the stored vector).
1757cbc558ffda5877ec4d2e432534e3d3d4ac10050Douglas Gregor    AddDecl(D);
1767cbc558ffda5877ec4d2e432534e3d3d4ac10050Douglas Gregor    return;
1777cbc558ffda5877ec4d2e432534e3d3d4ac10050Douglas Gregor  }
1787cbc558ffda5877ec4d2e432534e3d3d4ac10050Douglas Gregor
1797cbc558ffda5877ec4d2e432534e3d3d4ac10050Douglas Gregor  DeclarationName Name = D->getDeclName();
1807cbc558ffda5877ec4d2e432534e3d3d4ac10050Douglas Gregor  void *Ptr = Name.getFETokenInfo<void>();
1817cbc558ffda5877ec4d2e432534e3d3d4ac10050Douglas Gregor
1827cbc558ffda5877ec4d2e432534e3d3d4ac10050Douglas Gregor  if (isDeclPtr(Ptr)) {
1837cbc558ffda5877ec4d2e432534e3d3d4ac10050Douglas Gregor    // There's only one element, and we want to insert before it in the list.
1847cbc558ffda5877ec4d2e432534e3d3d4ac10050Douglas Gregor    // Just create the storage for these identifiers and insert them in the
1857cbc558ffda5877ec4d2e432534e3d3d4ac10050Douglas Gregor    // opposite order we normally would.
1867cbc558ffda5877ec4d2e432534e3d3d4ac10050Douglas Gregor    assert(isDeclPtr(Ptr) && "Not a single declaration!");
1877cbc558ffda5877ec4d2e432534e3d3d4ac10050Douglas Gregor    Name.setFETokenInfo(NULL);
1887cbc558ffda5877ec4d2e432534e3d3d4ac10050Douglas Gregor    IdDeclInfo *IDI = &(*IdDeclInfos)[Name];
1897cbc558ffda5877ec4d2e432534e3d3d4ac10050Douglas Gregor    NamedDecl *PrevD = static_cast<NamedDecl*>(Ptr);
1907cbc558ffda5877ec4d2e432534e3d3d4ac10050Douglas Gregor    IDI->AddDecl(D);
1917cbc558ffda5877ec4d2e432534e3d3d4ac10050Douglas Gregor    IDI->AddDecl(PrevD);
1927cbc558ffda5877ec4d2e432534e3d3d4ac10050Douglas Gregor    return;
1937cbc558ffda5877ec4d2e432534e3d3d4ac10050Douglas Gregor  }
1947cbc558ffda5877ec4d2e432534e3d3d4ac10050Douglas Gregor
1957cbc558ffda5877ec4d2e432534e3d3d4ac10050Douglas Gregor  // General case: insert the declaration at the appropriate point in the
1967cbc558ffda5877ec4d2e432534e3d3d4ac10050Douglas Gregor  // list, which already has at least two elements.
1977cbc558ffda5877ec4d2e432534e3d3d4ac10050Douglas Gregor  IdDeclInfo *IDI = toIdDeclInfo(Ptr);
1987cbc558ffda5877ec4d2e432534e3d3d4ac10050Douglas Gregor  if (Pos.isIterator())
1997cbc558ffda5877ec4d2e432534e3d3d4ac10050Douglas Gregor    IDI->InsertDecl(Pos.getIterator(), D);
2007cbc558ffda5877ec4d2e432534e3d3d4ac10050Douglas Gregor  else
2017cbc558ffda5877ec4d2e432534e3d3d4ac10050Douglas Gregor    IDI->InsertDecl(IDI->decls_begin(), D);
2027cbc558ffda5877ec4d2e432534e3d3d4ac10050Douglas Gregor}
2037cbc558ffda5877ec4d2e432534e3d3d4ac10050Douglas Gregor
204321f278db3405268e8644eb75f4fcf8900e0d09cArgyrios Kyrtzidis/// RemoveDecl - Unlink the decl from its shadowed decl chain.
205a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner/// The decl must already be part of the decl chain.
206a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattnervoid IdentifierResolver::RemoveDecl(NamedDecl *D) {
207a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner  assert(D && "null param passed");
2082def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  DeclarationName Name = D->getDeclName();
2091450ef99896d66ba67e2ddd2798a29be1bf560b8Sebastian Redl  if (IdentifierInfo *II = Name.getAsIdentifierInfo())
2103c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl    II->setIsFromAST(false);
2111450ef99896d66ba67e2ddd2798a29be1bf560b8Sebastian Redl
2122def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  void *Ptr = Name.getFETokenInfo<void>();
213a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner
214a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner  assert(Ptr && "Didn't find this decl on its identifier's chain!");
215a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner
216a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner  if (isDeclPtr(Ptr)) {
217a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner    assert(D == Ptr && "Didn't find this decl on its identifier's chain!");
2182def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor    Name.setFETokenInfo(NULL);
219a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner    return;
220a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner  }
2211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
22200bc645d154f8f30bfbfb2fe508caf087793157cArgyrios Kyrtzidis  return toIdDeclInfo(Ptr)->RemoveDecl(D);
223a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner}
224a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner
2256393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregorbool IdentifierResolver::ReplaceDecl(NamedDecl *Old, NamedDecl *New) {
2261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  assert(Old->getDeclName() == New->getDeclName() &&
2276393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor         "Cannot replace a decl with another decl of a different name");
2281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2296393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor  DeclarationName Name = Old->getDeclName();
2301450ef99896d66ba67e2ddd2798a29be1bf560b8Sebastian Redl  if (IdentifierInfo *II = Name.getAsIdentifierInfo())
2313c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl    II->setIsFromAST(false);
2321450ef99896d66ba67e2ddd2798a29be1bf560b8Sebastian Redl
2336393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor  void *Ptr = Name.getFETokenInfo<void>();
2346393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor
2356393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor  if (!Ptr)
2366393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor    return false;
2376393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor
2386393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor  if (isDeclPtr(Ptr)) {
2396393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor    if (Ptr == Old) {
2406393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor      Name.setFETokenInfo(New);
2416393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor      return true;
2426393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor    }
2436393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor    return false;
2446393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor  }
2456393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor
2461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return toIdDeclInfo(Ptr)->ReplaceDecl(Old, New);
2476393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor}
2486393519272ce727f4d26e71bbefb5de712274d0eDouglas Gregor
2494c921ae760cbdd9270c16d48417d7d527eb0ceb8Douglas Gregor/// begin - Returns an iterator for decls with name 'Name'.
25000bc645d154f8f30bfbfb2fe508caf087793157cArgyrios KyrtzidisIdentifierResolver::iterator
2514c921ae760cbdd9270c16d48417d7d527eb0ceb8Douglas GregorIdentifierResolver::begin(DeclarationName Name) {
2522def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  void *Ptr = Name.getFETokenInfo<void>();
25390eb539bc3121bdc0e867ab1cd6bdca3b36d961eArgyrios Kyrtzidis  if (!Ptr) return end();
254a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner
2550b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner  if (isDeclPtr(Ptr))
2560b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner    return iterator(static_cast<NamedDecl*>(Ptr));
257a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner
25890eb539bc3121bdc0e867ab1cd6bdca3b36d961eArgyrios Kyrtzidis  IdDeclInfo *IDI = toIdDeclInfo(Ptr);
25900bc645d154f8f30bfbfb2fe508caf087793157cArgyrios Kyrtzidis
260074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor  IdDeclInfo::DeclsTy::iterator I = IDI->decls_end();
26190eb539bc3121bdc0e867ab1cd6bdca3b36d961eArgyrios Kyrtzidis  if (I != IDI->decls_begin())
2624c921ae760cbdd9270c16d48417d7d527eb0ceb8Douglas Gregor    return iterator(I-1);
2630b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner  // No decls found.
2640b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner  return end();
26590eb539bc3121bdc0e867ab1cd6bdca3b36d961eArgyrios Kyrtzidis}
266a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner
2671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpvoid IdentifierResolver::AddDeclToIdentifierChain(IdentifierInfo *II,
268668c1a4fdcc56bdd050256b1688e116fe84b72dbDouglas Gregor                                                  NamedDecl *D) {
2693c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl  II->setIsFromAST(false);
270668c1a4fdcc56bdd050256b1688e116fe84b72dbDouglas Gregor  void *Ptr = II->getFETokenInfo<void>();
271668c1a4fdcc56bdd050256b1688e116fe84b72dbDouglas Gregor
272668c1a4fdcc56bdd050256b1688e116fe84b72dbDouglas Gregor  if (!Ptr) {
273668c1a4fdcc56bdd050256b1688e116fe84b72dbDouglas Gregor    II->setFETokenInfo(D);
274668c1a4fdcc56bdd050256b1688e116fe84b72dbDouglas Gregor    return;
275668c1a4fdcc56bdd050256b1688e116fe84b72dbDouglas Gregor  }
276668c1a4fdcc56bdd050256b1688e116fe84b72dbDouglas Gregor
277668c1a4fdcc56bdd050256b1688e116fe84b72dbDouglas Gregor  IdDeclInfo *IDI;
278668c1a4fdcc56bdd050256b1688e116fe84b72dbDouglas Gregor
279668c1a4fdcc56bdd050256b1688e116fe84b72dbDouglas Gregor  if (isDeclPtr(Ptr)) {
280668c1a4fdcc56bdd050256b1688e116fe84b72dbDouglas Gregor    II->setFETokenInfo(NULL);
281668c1a4fdcc56bdd050256b1688e116fe84b72dbDouglas Gregor    IDI = &(*IdDeclInfos)[II];
282668c1a4fdcc56bdd050256b1688e116fe84b72dbDouglas Gregor    NamedDecl *PrevD = static_cast<NamedDecl*>(Ptr);
283668c1a4fdcc56bdd050256b1688e116fe84b72dbDouglas Gregor    IDI->AddDecl(PrevD);
284668c1a4fdcc56bdd050256b1688e116fe84b72dbDouglas Gregor  } else
285668c1a4fdcc56bdd050256b1688e116fe84b72dbDouglas Gregor    IDI = toIdDeclInfo(Ptr);
286668c1a4fdcc56bdd050256b1688e116fe84b72dbDouglas Gregor
287668c1a4fdcc56bdd050256b1688e116fe84b72dbDouglas Gregor  IDI->AddDecl(D);
288668c1a4fdcc56bdd050256b1688e116fe84b72dbDouglas Gregor}
289668c1a4fdcc56bdd050256b1688e116fe84b72dbDouglas Gregor
29081bebb1e2e6bb05e360f36da098dc7016e8f654bArgyrios Kyrtzidis//===----------------------------------------------------------------------===//
29181bebb1e2e6bb05e360f36da098dc7016e8f654bArgyrios Kyrtzidis// IdDeclInfoMap Implementation
29281bebb1e2e6bb05e360f36da098dc7016e8f654bArgyrios Kyrtzidis//===----------------------------------------------------------------------===//
29381bebb1e2e6bb05e360f36da098dc7016e8f654bArgyrios Kyrtzidis
2942def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor/// Returns the IdDeclInfo associated to the DeclarationName.
295a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner/// It creates a new IdDeclInfo if one was not created before for this id.
29600bc645d154f8f30bfbfb2fe508caf087793157cArgyrios KyrtzidisIdentifierResolver::IdDeclInfo &
2972def48394f6d48bde0dec2b514193c2b533265b5Douglas GregorIdentifierResolver::IdDeclInfoMap::operator[](DeclarationName Name) {
2982def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  void *Ptr = Name.getFETokenInfo<void>();
299a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner
30000bc645d154f8f30bfbfb2fe508caf087793157cArgyrios Kyrtzidis  if (Ptr) return *toIdDeclInfo(Ptr);
301a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner
302eeb1cb49244a67327fce088c1f720da1f8c021a9John McCall  if (CurIndex == POOL_SIZE) {
303eeb1cb49244a67327fce088c1f720da1f8c021a9John McCall    CurPool = new IdDeclInfoPool(CurPool);
304a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner    CurIndex = 0;
305a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner  }
306eeb1cb49244a67327fce088c1f720da1f8c021a9John McCall  IdDeclInfo *IDI = &CurPool->Pool[CurIndex];
3072def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  Name.setFETokenInfo(reinterpret_cast<void*>(
308a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner                              reinterpret_cast<uintptr_t>(IDI) | 0x1)
309a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner                                                                     );
310a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner  ++CurIndex;
311a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner  return *IDI;
312a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner}
3137cd088e519d7e6caa4c4c12db52e0e4ae35d25c2John McCall
3147cd088e519d7e6caa4c4c12db52e0e4ae35d25c2John McCallvoid IdentifierResolver::iterator::incrementSlowCase() {
3157cd088e519d7e6caa4c4c12db52e0e4ae35d25c2John McCall  NamedDecl *D = **this;
3167cd088e519d7e6caa4c4c12db52e0e4ae35d25c2John McCall  void *InfoPtr = D->getDeclName().getFETokenInfo<void>();
3177cd088e519d7e6caa4c4c12db52e0e4ae35d25c2John McCall  assert(!isDeclPtr(InfoPtr) && "Decl with wrong id ?");
3187cd088e519d7e6caa4c4c12db52e0e4ae35d25c2John McCall  IdDeclInfo *Info = toIdDeclInfo(InfoPtr);
3197cd088e519d7e6caa4c4c12db52e0e4ae35d25c2John McCall
3207cd088e519d7e6caa4c4c12db52e0e4ae35d25c2John McCall  BaseIter I = getIterator();
3217cd088e519d7e6caa4c4c12db52e0e4ae35d25c2John McCall  if (I != Info->decls_begin())
3227cd088e519d7e6caa4c4c12db52e0e4ae35d25c2John McCall    *this = iterator(I-1);
3237cd088e519d7e6caa4c4c12db52e0e4ae35d25c2John McCall  else // No more decls.
3247cd088e519d7e6caa4c4c12db52e0e4ae35d25c2John McCall    *this = iterator();
3257cd088e519d7e6caa4c4c12db52e0e4ae35d25c2John McCall}
326