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/AST/Decl.h"
17f99cb051665d2faab038ed855b2eff15d603796dArgyrios Kyrtzidis#include "clang/Basic/LangOptions.h"
18eee242ff426bf79149f221798966e58688383c1eDouglas Gregor#include "clang/Lex/ExternalPreprocessorSource.h"
19eee242ff426bf79149f221798966e58688383c1eDouglas Gregor#include "clang/Lex/Preprocessor.h"
2055fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Sema/Scope.h"
21a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner
22a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattnerusing namespace clang;
23a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner
2481bebb1e2e6bb05e360f36da098dc7016e8f654bArgyrios Kyrtzidis//===----------------------------------------------------------------------===//
2581bebb1e2e6bb05e360f36da098dc7016e8f654bArgyrios Kyrtzidis// IdDeclInfoMap class
2681bebb1e2e6bb05e360f36da098dc7016e8f654bArgyrios Kyrtzidis//===----------------------------------------------------------------------===//
27a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner
282def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor/// IdDeclInfoMap - Associates IdDeclInfos with declaration names.
29321f278db3405268e8644eb75f4fcf8900e0d09cArgyrios Kyrtzidis/// Allocates 'pools' (vectors of IdDeclInfos) to avoid allocating each
30a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner/// individual IdDeclInfo to heap.
3100bc645d154f8f30bfbfb2fe508caf087793157cArgyrios Kyrtzidisclass IdentifierResolver::IdDeclInfoMap {
32eeb1cb49244a67327fce088c1f720da1f8c021a9John McCall  static const unsigned int POOL_SIZE = 512;
33eeb1cb49244a67327fce088c1f720da1f8c021a9John McCall
34eeb1cb49244a67327fce088c1f720da1f8c021a9John McCall  /// We use our own linked-list implementation because it is sadly
35eeb1cb49244a67327fce088c1f720da1f8c021a9John McCall  /// impossible to add something to a pre-C++0x STL container without
36eeb1cb49244a67327fce088c1f720da1f8c021a9John McCall  /// a completely unnecessary copy.
37eeb1cb49244a67327fce088c1f720da1f8c021a9John McCall  struct IdDeclInfoPool {
38eeb1cb49244a67327fce088c1f720da1f8c021a9John McCall    IdDeclInfoPool(IdDeclInfoPool *Next) : Next(Next) {}
39eeb1cb49244a67327fce088c1f720da1f8c021a9John McCall
40eeb1cb49244a67327fce088c1f720da1f8c021a9John McCall    IdDeclInfoPool *Next;
41eeb1cb49244a67327fce088c1f720da1f8c021a9John McCall    IdDeclInfo Pool[POOL_SIZE];
42eeb1cb49244a67327fce088c1f720da1f8c021a9John McCall  };
43eeb1cb49244a67327fce088c1f720da1f8c021a9John McCall
44eeb1cb49244a67327fce088c1f720da1f8c021a9John McCall  IdDeclInfoPool *CurPool;
45a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner  unsigned int CurIndex;
461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
47a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattnerpublic:
486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  IdDeclInfoMap() : CurPool(nullptr), CurIndex(POOL_SIZE) {}
49eeb1cb49244a67327fce088c1f720da1f8c021a9John McCall
50eeb1cb49244a67327fce088c1f720da1f8c021a9John McCall  ~IdDeclInfoMap() {
51eeb1cb49244a67327fce088c1f720da1f8c021a9John McCall    IdDeclInfoPool *Cur = CurPool;
52eeb1cb49244a67327fce088c1f720da1f8c021a9John McCall    while (IdDeclInfoPool *P = Cur) {
53eeb1cb49244a67327fce088c1f720da1f8c021a9John McCall      Cur = Cur->Next;
54eeb1cb49244a67327fce088c1f720da1f8c021a9John McCall      delete P;
55eeb1cb49244a67327fce088c1f720da1f8c021a9John McCall    }
56eeb1cb49244a67327fce088c1f720da1f8c021a9John McCall  }
57a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner
582def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  /// Returns the IdDeclInfo associated to the DeclarationName.
59a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner  /// It creates a new IdDeclInfo if one was not created before for this id.
602def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  IdDeclInfo &operator[](DeclarationName Name);
61a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner};
62a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner
637bc198fb47a498e327a9ceb2d17612dcb3d15095Argyrios Kyrtzidis
6481bebb1e2e6bb05e360f36da098dc7016e8f654bArgyrios Kyrtzidis//===----------------------------------------------------------------------===//
6581bebb1e2e6bb05e360f36da098dc7016e8f654bArgyrios Kyrtzidis// IdDeclInfo Implementation
6681bebb1e2e6bb05e360f36da098dc7016e8f654bArgyrios Kyrtzidis//===----------------------------------------------------------------------===//
6781bebb1e2e6bb05e360f36da098dc7016e8f654bArgyrios Kyrtzidis
6881bebb1e2e6bb05e360f36da098dc7016e8f654bArgyrios Kyrtzidis/// RemoveDecl - Remove the decl from the scope chain.
6981bebb1e2e6bb05e360f36da098dc7016e8f654bArgyrios Kyrtzidis/// The decl must already be part of the decl chain.
7081bebb1e2e6bb05e360f36da098dc7016e8f654bArgyrios Kyrtzidisvoid IdentifierResolver::IdDeclInfo::RemoveDecl(NamedDecl *D) {
7181bebb1e2e6bb05e360f36da098dc7016e8f654bArgyrios Kyrtzidis  for (DeclsTy::iterator I = Decls.end(); I != Decls.begin(); --I) {
7281bebb1e2e6bb05e360f36da098dc7016e8f654bArgyrios Kyrtzidis    if (D == *(I-1)) {
7381bebb1e2e6bb05e360f36da098dc7016e8f654bArgyrios Kyrtzidis      Decls.erase(I-1);
7481bebb1e2e6bb05e360f36da098dc7016e8f654bArgyrios Kyrtzidis      return;
7581bebb1e2e6bb05e360f36da098dc7016e8f654bArgyrios Kyrtzidis    }
7681bebb1e2e6bb05e360f36da098dc7016e8f654bArgyrios Kyrtzidis  }
7781bebb1e2e6bb05e360f36da098dc7016e8f654bArgyrios Kyrtzidis
78b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie  llvm_unreachable("Didn't find this decl on its identifier's chain!");
7981bebb1e2e6bb05e360f36da098dc7016e8f654bArgyrios Kyrtzidis}
8081bebb1e2e6bb05e360f36da098dc7016e8f654bArgyrios Kyrtzidis
8181bebb1e2e6bb05e360f36da098dc7016e8f654bArgyrios Kyrtzidis//===----------------------------------------------------------------------===//
8281bebb1e2e6bb05e360f36da098dc7016e8f654bArgyrios Kyrtzidis// IdentifierResolver Implementation
8381bebb1e2e6bb05e360f36da098dc7016e8f654bArgyrios Kyrtzidis//===----------------------------------------------------------------------===//
8481bebb1e2e6bb05e360f36da098dc7016e8f654bArgyrios Kyrtzidis
85eee242ff426bf79149f221798966e58688383c1eDouglas GregorIdentifierResolver::IdentifierResolver(Preprocessor &PP)
864e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie  : LangOpt(PP.getLangOpts()), PP(PP),
87eee242ff426bf79149f221798966e58688383c1eDouglas Gregor    IdDeclInfos(new IdDeclInfoMap) {
88eb7c388bc7ce19fffb8b4b440cee0173297e8490Argyrios Kyrtzidis}
89eee242ff426bf79149f221798966e58688383c1eDouglas Gregor
907bc198fb47a498e327a9ceb2d17612dcb3d15095Argyrios KyrtzidisIdentifierResolver::~IdentifierResolver() {
9100bc645d154f8f30bfbfb2fe508caf087793157cArgyrios Kyrtzidis  delete IdDeclInfos;
927bc198fb47a498e327a9ceb2d17612dcb3d15095Argyrios Kyrtzidis}
93a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner
9481bebb1e2e6bb05e360f36da098dc7016e8f654bArgyrios Kyrtzidis/// isDeclInScope - If 'Ctx' is a function/method, isDeclInScope returns true
9581bebb1e2e6bb05e360f36da098dc7016e8f654bArgyrios Kyrtzidis/// if 'D' is in Scope 'S', otherwise 'S' is ignored and isDeclInScope returns
9681bebb1e2e6bb05e360f36da098dc7016e8f654bArgyrios Kyrtzidis/// true if 'D' belongs to the given declaration context.
97355a1660d6a3c66546dfd2476b60fa7a19b70ee3Nico Weberbool IdentifierResolver::isDeclInScope(Decl *D, DeclContext *Ctx, Scope *S,
98651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                       bool AllowInlineNamespace) const {
997a126a474fdde06382b315b4e3d8ef0a21d4dc31Sebastian Redl  Ctx = Ctx->getRedeclContext();
100074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor
10116f1f717af196b1448258857b2e6dcfe144b39d0James Molloy  if (Ctx->isFunctionOrMethod() || S->isFunctionPrototypeScope()) {
102074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor    // Ignore the scopes associated within transparent declaration contexts.
103f0d5861d2db5e3075bd722ff7874e88c4bfedaaeTed Kremenek    while (S->getEntity() && S->getEntity()->isTransparentContext())
104074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor      S = S->getParent();
105074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor
106d226f65006733ed7f709c3174f22ce33391cb58fJohn McCall    if (S->isDeclScope(D))
107f99cb051665d2faab038ed855b2eff15d603796dArgyrios Kyrtzidis      return true;
108f99cb051665d2faab038ed855b2eff15d603796dArgyrios Kyrtzidis    if (LangOpt.CPlusPlus) {
109a0fd8652f3302d0f39ed9849b521ee5b76597b0aSebastian Redl      // C++ 3.3.2p3:
110a0fd8652f3302d0f39ed9849b521ee5b76597b0aSebastian Redl      // The name declared in a catch exception-declaration is local to the
111a0fd8652f3302d0f39ed9849b521ee5b76597b0aSebastian Redl      // handler and shall not be redeclared in the outermost block of the
112a0fd8652f3302d0f39ed9849b521ee5b76597b0aSebastian Redl      // handler.
113f99cb051665d2faab038ed855b2eff15d603796dArgyrios Kyrtzidis      // C++ 3.3.2p4:
114f99cb051665d2faab038ed855b2eff15d603796dArgyrios Kyrtzidis      // Names declared in the for-init-statement, and in the condition of if,
115f99cb051665d2faab038ed855b2eff15d603796dArgyrios Kyrtzidis      // while, for, and switch statements are local to the if, while, for, or
116f99cb051665d2faab038ed855b2eff15d603796dArgyrios Kyrtzidis      // switch statement (including the controlled statement), and shall not be
117f99cb051665d2faab038ed855b2eff15d603796dArgyrios Kyrtzidis      // redeclared in a subsequent condition of that statement nor in the
118f99cb051665d2faab038ed855b2eff15d603796dArgyrios Kyrtzidis      // outermost block (or, for the if statement, any of the outermost blocks)
119f99cb051665d2faab038ed855b2eff15d603796dArgyrios Kyrtzidis      // of the controlled statement.
120f99cb051665d2faab038ed855b2eff15d603796dArgyrios Kyrtzidis      //
121f99cb051665d2faab038ed855b2eff15d603796dArgyrios Kyrtzidis      assert(S->getParent() && "No TUScope?");
122c4027c82ad4a61f2da1b893ac8fe47bf11e5d50dDavid Blaikie      if (S->getParent()->getFlags() & Scope::ControlScope) {
1233a9fefed0749f7a293379156c22a24509c24cc3eDavid Blaikie        S = S->getParent();
1243a9fefed0749f7a293379156c22a24509c24cc3eDavid Blaikie        if (S->isDeclScope(D))
1253a9fefed0749f7a293379156c22a24509c24cc3eDavid Blaikie          return true;
126c4027c82ad4a61f2da1b893ac8fe47bf11e5d50dDavid Blaikie      }
1273a9fefed0749f7a293379156c22a24509c24cc3eDavid Blaikie      if (S->getFlags() & Scope::FnTryCatchScope)
1283a9fefed0749f7a293379156c22a24509c24cc3eDavid Blaikie        return S->getParent()->isDeclScope(D);
129f99cb051665d2faab038ed855b2eff15d603796dArgyrios Kyrtzidis    }
130f99cb051665d2faab038ed855b2eff15d603796dArgyrios Kyrtzidis    return false;
131f99cb051665d2faab038ed855b2eff15d603796dArgyrios Kyrtzidis  }
13281bebb1e2e6bb05e360f36da098dc7016e8f654bArgyrios Kyrtzidis
133cc20945c787a56abe418947fc6a2c520bcec66c0Douglas Gregor  DeclContext *DCtx = D->getDeclContext()->getRedeclContext();
134651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return AllowInlineNamespace ? Ctx->InEnclosingNamespaceSetOf(DCtx)
135651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                              : Ctx->Equals(DCtx);
13681bebb1e2e6bb05e360f36da098dc7016e8f654bArgyrios Kyrtzidis}
13781bebb1e2e6bb05e360f36da098dc7016e8f654bArgyrios Kyrtzidis
138321f278db3405268e8644eb75f4fcf8900e0d09cArgyrios Kyrtzidis/// AddDecl - Link the decl to its shadowed decl chain.
13900bc645d154f8f30bfbfb2fe508caf087793157cArgyrios Kyrtzidisvoid IdentifierResolver::AddDecl(NamedDecl *D) {
1402def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  DeclarationName Name = D->getDeclName();
1411450ef99896d66ba67e2ddd2798a29be1bf560b8Sebastian Redl  if (IdentifierInfo *II = Name.getAsIdentifierInfo())
142eee242ff426bf79149f221798966e58688383c1eDouglas Gregor    updatingIdentifier(*II);
1431450ef99896d66ba67e2ddd2798a29be1bf560b8Sebastian Redl
1442def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  void *Ptr = Name.getFETokenInfo<void>();
145a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner
146a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner  if (!Ptr) {
1472def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor    Name.setFETokenInfo(D);
148a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner    return;
149a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner  }
150a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner
151a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner  IdDeclInfo *IDI;
152a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner
153a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner  if (isDeclPtr(Ptr)) {
1546bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    Name.setFETokenInfo(nullptr);
1552def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor    IDI = &(*IdDeclInfos)[Name];
15600bc645d154f8f30bfbfb2fe508caf087793157cArgyrios Kyrtzidis    NamedDecl *PrevD = static_cast<NamedDecl*>(Ptr);
15700bc645d154f8f30bfbfb2fe508caf087793157cArgyrios Kyrtzidis    IDI->AddDecl(PrevD);
158a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner  } else
159a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner    IDI = toIdDeclInfo(Ptr);
160a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner
16100bc645d154f8f30bfbfb2fe508caf087793157cArgyrios Kyrtzidis  IDI->AddDecl(D);
162a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner}
163a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner
164250e7a74d5a23db5bd7202ecb0bb4a8fef6016b4Douglas Gregorvoid IdentifierResolver::InsertDeclAfter(iterator Pos, NamedDecl *D) {
1657cbc558ffda5877ec4d2e432534e3d3d4ac10050Douglas Gregor  DeclarationName Name = D->getDeclName();
166eee242ff426bf79149f221798966e58688383c1eDouglas Gregor  if (IdentifierInfo *II = Name.getAsIdentifierInfo())
167eee242ff426bf79149f221798966e58688383c1eDouglas Gregor    updatingIdentifier(*II);
168eee242ff426bf79149f221798966e58688383c1eDouglas Gregor
1697cbc558ffda5877ec4d2e432534e3d3d4ac10050Douglas Gregor  void *Ptr = Name.getFETokenInfo<void>();
1707cbc558ffda5877ec4d2e432534e3d3d4ac10050Douglas Gregor
171fa7b8ced6f3318879b39f44b5ace8346e979826eDouglas Gregor  if (!Ptr) {
172250e7a74d5a23db5bd7202ecb0bb4a8fef6016b4Douglas Gregor    AddDecl(D);
1737cbc558ffda5877ec4d2e432534e3d3d4ac10050Douglas Gregor    return;
1747cbc558ffda5877ec4d2e432534e3d3d4ac10050Douglas Gregor  }
1757cbc558ffda5877ec4d2e432534e3d3d4ac10050Douglas Gregor
176fa7b8ced6f3318879b39f44b5ace8346e979826eDouglas Gregor  if (isDeclPtr(Ptr)) {
177fa7b8ced6f3318879b39f44b5ace8346e979826eDouglas Gregor    // We only have a single declaration: insert before or after it,
178fa7b8ced6f3318879b39f44b5ace8346e979826eDouglas Gregor    // as appropriate.
179fa7b8ced6f3318879b39f44b5ace8346e979826eDouglas Gregor    if (Pos == iterator()) {
180fa7b8ced6f3318879b39f44b5ace8346e979826eDouglas Gregor      // Add the new declaration before the existing declaration.
181fa7b8ced6f3318879b39f44b5ace8346e979826eDouglas Gregor      NamedDecl *PrevD = static_cast<NamedDecl*>(Ptr);
182fa7b8ced6f3318879b39f44b5ace8346e979826eDouglas Gregor      RemoveDecl(PrevD);
183fa7b8ced6f3318879b39f44b5ace8346e979826eDouglas Gregor      AddDecl(D);
184fa7b8ced6f3318879b39f44b5ace8346e979826eDouglas Gregor      AddDecl(PrevD);
185fa7b8ced6f3318879b39f44b5ace8346e979826eDouglas Gregor    } else {
186fa7b8ced6f3318879b39f44b5ace8346e979826eDouglas Gregor      // Add new declaration after the existing declaration.
187fa7b8ced6f3318879b39f44b5ace8346e979826eDouglas Gregor      AddDecl(D);
188fa7b8ced6f3318879b39f44b5ace8346e979826eDouglas Gregor    }
189fa7b8ced6f3318879b39f44b5ace8346e979826eDouglas Gregor
190fa7b8ced6f3318879b39f44b5ace8346e979826eDouglas Gregor    return;
191fa7b8ced6f3318879b39f44b5ace8346e979826eDouglas Gregor  }
192fa7b8ced6f3318879b39f44b5ace8346e979826eDouglas Gregor
1937cbc558ffda5877ec4d2e432534e3d3d4ac10050Douglas Gregor  // General case: insert the declaration at the appropriate point in the
1947cbc558ffda5877ec4d2e432534e3d3d4ac10050Douglas Gregor  // list, which already has at least two elements.
1957cbc558ffda5877ec4d2e432534e3d3d4ac10050Douglas Gregor  IdDeclInfo *IDI = toIdDeclInfo(Ptr);
196250e7a74d5a23db5bd7202ecb0bb4a8fef6016b4Douglas Gregor  if (Pos.isIterator()) {
197250e7a74d5a23db5bd7202ecb0bb4a8fef6016b4Douglas Gregor    IDI->InsertDecl(Pos.getIterator() + 1, D);
198250e7a74d5a23db5bd7202ecb0bb4a8fef6016b4Douglas Gregor  } else
1997cbc558ffda5877ec4d2e432534e3d3d4ac10050Douglas Gregor    IDI->InsertDecl(IDI->decls_begin(), D);
2007cbc558ffda5877ec4d2e432534e3d3d4ac10050Douglas Gregor}
2017cbc558ffda5877ec4d2e432534e3d3d4ac10050Douglas Gregor
202321f278db3405268e8644eb75f4fcf8900e0d09cArgyrios Kyrtzidis/// RemoveDecl - Unlink the decl from its shadowed decl chain.
203a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner/// The decl must already be part of the decl chain.
204a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattnervoid IdentifierResolver::RemoveDecl(NamedDecl *D) {
205a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner  assert(D && "null param passed");
2062def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  DeclarationName Name = D->getDeclName();
2071450ef99896d66ba67e2ddd2798a29be1bf560b8Sebastian Redl  if (IdentifierInfo *II = Name.getAsIdentifierInfo())
208eee242ff426bf79149f221798966e58688383c1eDouglas Gregor    updatingIdentifier(*II);
2091450ef99896d66ba67e2ddd2798a29be1bf560b8Sebastian Redl
2102def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  void *Ptr = Name.getFETokenInfo<void>();
211a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner
212a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner  assert(Ptr && "Didn't find this decl on its identifier's chain!");
213a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner
214a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner  if (isDeclPtr(Ptr)) {
215a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner    assert(D == Ptr && "Didn't find this decl on its identifier's chain!");
2166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    Name.setFETokenInfo(nullptr);
217a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner    return;
218a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner  }
2191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
22000bc645d154f8f30bfbfb2fe508caf087793157cArgyrios Kyrtzidis  return toIdDeclInfo(Ptr)->RemoveDecl(D);
221a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner}
222a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner
2234c921ae760cbdd9270c16d48417d7d527eb0ceb8Douglas Gregor/// begin - Returns an iterator for decls with name 'Name'.
22400bc645d154f8f30bfbfb2fe508caf087793157cArgyrios KyrtzidisIdentifierResolver::iterator
2254c921ae760cbdd9270c16d48417d7d527eb0ceb8Douglas GregorIdentifierResolver::begin(DeclarationName Name) {
226eee242ff426bf79149f221798966e58688383c1eDouglas Gregor  if (IdentifierInfo *II = Name.getAsIdentifierInfo())
227eee242ff426bf79149f221798966e58688383c1eDouglas Gregor    readingIdentifier(*II);
228eee242ff426bf79149f221798966e58688383c1eDouglas Gregor
2292def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  void *Ptr = Name.getFETokenInfo<void>();
23090eb539bc3121bdc0e867ab1cd6bdca3b36d961eArgyrios Kyrtzidis  if (!Ptr) return end();
231a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner
2320b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner  if (isDeclPtr(Ptr))
2330b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner    return iterator(static_cast<NamedDecl*>(Ptr));
234a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner
23590eb539bc3121bdc0e867ab1cd6bdca3b36d961eArgyrios Kyrtzidis  IdDeclInfo *IDI = toIdDeclInfo(Ptr);
23600bc645d154f8f30bfbfb2fe508caf087793157cArgyrios Kyrtzidis
237074149e11baf5f7db12f84efd5c34ba6e35d5cdfDouglas Gregor  IdDeclInfo::DeclsTy::iterator I = IDI->decls_end();
23890eb539bc3121bdc0e867ab1cd6bdca3b36d961eArgyrios Kyrtzidis  if (I != IDI->decls_begin())
2394c921ae760cbdd9270c16d48417d7d527eb0ceb8Douglas Gregor    return iterator(I-1);
2400b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner  // No decls found.
2410b2b6e1cb1573bb295c0a65813dc4df8d57f305bChris Lattner  return end();
24290eb539bc3121bdc0e867ab1cd6bdca3b36d961eArgyrios Kyrtzidis}
243a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner
244eee242ff426bf79149f221798966e58688383c1eDouglas Gregornamespace {
245eee242ff426bf79149f221798966e58688383c1eDouglas Gregor  enum DeclMatchKind {
246eee242ff426bf79149f221798966e58688383c1eDouglas Gregor    DMK_Different,
247eee242ff426bf79149f221798966e58688383c1eDouglas Gregor    DMK_Replace,
248eee242ff426bf79149f221798966e58688383c1eDouglas Gregor    DMK_Ignore
249eee242ff426bf79149f221798966e58688383c1eDouglas Gregor  };
250eee242ff426bf79149f221798966e58688383c1eDouglas Gregor}
251668c1a4fdcc56bdd050256b1688e116fe84b72dbDouglas Gregor
252eee242ff426bf79149f221798966e58688383c1eDouglas Gregor/// \brief Compare two declarations to see whether they are different or,
253eee242ff426bf79149f221798966e58688383c1eDouglas Gregor/// if they are the same, whether the new declaration should replace the
254eee242ff426bf79149f221798966e58688383c1eDouglas Gregor/// existing declaration.
255eee242ff426bf79149f221798966e58688383c1eDouglas Gregorstatic DeclMatchKind compareDeclarations(NamedDecl *Existing, NamedDecl *New) {
256eee242ff426bf79149f221798966e58688383c1eDouglas Gregor  // If the declarations are identical, ignore the new one.
257eee242ff426bf79149f221798966e58688383c1eDouglas Gregor  if (Existing == New)
258eee242ff426bf79149f221798966e58688383c1eDouglas Gregor    return DMK_Ignore;
259eee242ff426bf79149f221798966e58688383c1eDouglas Gregor
260eee242ff426bf79149f221798966e58688383c1eDouglas Gregor  // If the declarations have different kinds, they're obviously different.
261eee242ff426bf79149f221798966e58688383c1eDouglas Gregor  if (Existing->getKind() != New->getKind())
262eee242ff426bf79149f221798966e58688383c1eDouglas Gregor    return DMK_Different;
263eee242ff426bf79149f221798966e58688383c1eDouglas Gregor
264eee242ff426bf79149f221798966e58688383c1eDouglas Gregor  // If the declarations are redeclarations of each other, keep the newest one.
265eee242ff426bf79149f221798966e58688383c1eDouglas Gregor  if (Existing->getCanonicalDecl() == New->getCanonicalDecl()) {
266f4e955b694be22926f5ceb41e55d319ce9ff4aabDouglas Gregor    // If either of these is the most recent declaration, use it.
267f4e955b694be22926f5ceb41e55d319ce9ff4aabDouglas Gregor    Decl *MostRecent = Existing->getMostRecentDecl();
268f4e955b694be22926f5ceb41e55d319ce9ff4aabDouglas Gregor    if (Existing == MostRecent)
269f4e955b694be22926f5ceb41e55d319ce9ff4aabDouglas Gregor      return DMK_Ignore;
270f4e955b694be22926f5ceb41e55d319ce9ff4aabDouglas Gregor
271f4e955b694be22926f5ceb41e55d319ce9ff4aabDouglas Gregor    if (New == MostRecent)
272f4e955b694be22926f5ceb41e55d319ce9ff4aabDouglas Gregor      return DMK_Replace;
273f4e955b694be22926f5ceb41e55d319ce9ff4aabDouglas Gregor
274eee242ff426bf79149f221798966e58688383c1eDouglas Gregor    // If the existing declaration is somewhere in the previous declaration
275eee242ff426bf79149f221798966e58688383c1eDouglas Gregor    // chain of the new declaration, then prefer the new declaration.
276651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    for (auto RD : New->redecls()) {
277651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      if (RD == Existing)
278eee242ff426bf79149f221798966e58688383c1eDouglas Gregor        return DMK_Replace;
279eee242ff426bf79149f221798966e58688383c1eDouglas Gregor
280eee242ff426bf79149f221798966e58688383c1eDouglas Gregor      if (RD->isCanonicalDecl())
281eee242ff426bf79149f221798966e58688383c1eDouglas Gregor        break;
282eee242ff426bf79149f221798966e58688383c1eDouglas Gregor    }
283eee242ff426bf79149f221798966e58688383c1eDouglas Gregor
284eee242ff426bf79149f221798966e58688383c1eDouglas Gregor    return DMK_Ignore;
285668c1a4fdcc56bdd050256b1688e116fe84b72dbDouglas Gregor  }
286eee242ff426bf79149f221798966e58688383c1eDouglas Gregor
287eee242ff426bf79149f221798966e58688383c1eDouglas Gregor  return DMK_Different;
288eee242ff426bf79149f221798966e58688383c1eDouglas Gregor}
289668c1a4fdcc56bdd050256b1688e116fe84b72dbDouglas Gregor
290eee242ff426bf79149f221798966e58688383c1eDouglas Gregorbool IdentifierResolver::tryAddTopLevelDecl(NamedDecl *D, DeclarationName Name){
291eee242ff426bf79149f221798966e58688383c1eDouglas Gregor  if (IdentifierInfo *II = Name.getAsIdentifierInfo())
2925d5051f3e79bf754134ccdf7a1dc7778cd80c73eDouglas Gregor    readingIdentifier(*II);
293eee242ff426bf79149f221798966e58688383c1eDouglas Gregor
294eee242ff426bf79149f221798966e58688383c1eDouglas Gregor  void *Ptr = Name.getFETokenInfo<void>();
295eee242ff426bf79149f221798966e58688383c1eDouglas Gregor
296eee242ff426bf79149f221798966e58688383c1eDouglas Gregor  if (!Ptr) {
297eee242ff426bf79149f221798966e58688383c1eDouglas Gregor    Name.setFETokenInfo(D);
298eee242ff426bf79149f221798966e58688383c1eDouglas Gregor    return true;
299eee242ff426bf79149f221798966e58688383c1eDouglas Gregor  }
300eee242ff426bf79149f221798966e58688383c1eDouglas Gregor
301668c1a4fdcc56bdd050256b1688e116fe84b72dbDouglas Gregor  IdDeclInfo *IDI;
302eee242ff426bf79149f221798966e58688383c1eDouglas Gregor
303668c1a4fdcc56bdd050256b1688e116fe84b72dbDouglas Gregor  if (isDeclPtr(Ptr)) {
304668c1a4fdcc56bdd050256b1688e116fe84b72dbDouglas Gregor    NamedDecl *PrevD = static_cast<NamedDecl*>(Ptr);
305eee242ff426bf79149f221798966e58688383c1eDouglas Gregor
306eee242ff426bf79149f221798966e58688383c1eDouglas Gregor    switch (compareDeclarations(PrevD, D)) {
307eee242ff426bf79149f221798966e58688383c1eDouglas Gregor    case DMK_Different:
308eee242ff426bf79149f221798966e58688383c1eDouglas Gregor      break;
309eee242ff426bf79149f221798966e58688383c1eDouglas Gregor
310eee242ff426bf79149f221798966e58688383c1eDouglas Gregor    case DMK_Ignore:
311eee242ff426bf79149f221798966e58688383c1eDouglas Gregor      return false;
312eee242ff426bf79149f221798966e58688383c1eDouglas Gregor
313eee242ff426bf79149f221798966e58688383c1eDouglas Gregor    case DMK_Replace:
314eee242ff426bf79149f221798966e58688383c1eDouglas Gregor      Name.setFETokenInfo(D);
315eee242ff426bf79149f221798966e58688383c1eDouglas Gregor      return true;
316eee242ff426bf79149f221798966e58688383c1eDouglas Gregor    }
3176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
3186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    Name.setFETokenInfo(nullptr);
319eee242ff426bf79149f221798966e58688383c1eDouglas Gregor    IDI = &(*IdDeclInfos)[Name];
320eee242ff426bf79149f221798966e58688383c1eDouglas Gregor
321eee242ff426bf79149f221798966e58688383c1eDouglas Gregor    // If the existing declaration is not visible in translation unit scope,
322eee242ff426bf79149f221798966e58688383c1eDouglas Gregor    // then add the new top-level declaration first.
323eee242ff426bf79149f221798966e58688383c1eDouglas Gregor    if (!PrevD->getDeclContext()->getRedeclContext()->isTranslationUnit()) {
324eee242ff426bf79149f221798966e58688383c1eDouglas Gregor      IDI->AddDecl(D);
325eee242ff426bf79149f221798966e58688383c1eDouglas Gregor      IDI->AddDecl(PrevD);
326eee242ff426bf79149f221798966e58688383c1eDouglas Gregor    } else {
327eee242ff426bf79149f221798966e58688383c1eDouglas Gregor      IDI->AddDecl(PrevD);
328eee242ff426bf79149f221798966e58688383c1eDouglas Gregor      IDI->AddDecl(D);
329eee242ff426bf79149f221798966e58688383c1eDouglas Gregor    }
330eee242ff426bf79149f221798966e58688383c1eDouglas Gregor    return true;
331eee242ff426bf79149f221798966e58688383c1eDouglas Gregor  }
332eee242ff426bf79149f221798966e58688383c1eDouglas Gregor
333eee242ff426bf79149f221798966e58688383c1eDouglas Gregor  IDI = toIdDeclInfo(Ptr);
334668c1a4fdcc56bdd050256b1688e116fe84b72dbDouglas Gregor
335eee242ff426bf79149f221798966e58688383c1eDouglas Gregor  // See whether this declaration is identical to any existing declarations.
336eee242ff426bf79149f221798966e58688383c1eDouglas Gregor  // If not, find the right place to insert it.
337eee242ff426bf79149f221798966e58688383c1eDouglas Gregor  for (IdDeclInfo::DeclsTy::iterator I = IDI->decls_begin(),
338eee242ff426bf79149f221798966e58688383c1eDouglas Gregor                                  IEnd = IDI->decls_end();
339eee242ff426bf79149f221798966e58688383c1eDouglas Gregor       I != IEnd; ++I) {
340eee242ff426bf79149f221798966e58688383c1eDouglas Gregor
341eee242ff426bf79149f221798966e58688383c1eDouglas Gregor    switch (compareDeclarations(*I, D)) {
342eee242ff426bf79149f221798966e58688383c1eDouglas Gregor    case DMK_Different:
343eee242ff426bf79149f221798966e58688383c1eDouglas Gregor      break;
344eee242ff426bf79149f221798966e58688383c1eDouglas Gregor
345eee242ff426bf79149f221798966e58688383c1eDouglas Gregor    case DMK_Ignore:
346eee242ff426bf79149f221798966e58688383c1eDouglas Gregor      return false;
347eee242ff426bf79149f221798966e58688383c1eDouglas Gregor
348eee242ff426bf79149f221798966e58688383c1eDouglas Gregor    case DMK_Replace:
349eee242ff426bf79149f221798966e58688383c1eDouglas Gregor      *I = D;
350eee242ff426bf79149f221798966e58688383c1eDouglas Gregor      return true;
351eee242ff426bf79149f221798966e58688383c1eDouglas Gregor    }
352eee242ff426bf79149f221798966e58688383c1eDouglas Gregor
353eee242ff426bf79149f221798966e58688383c1eDouglas Gregor    if (!(*I)->getDeclContext()->getRedeclContext()->isTranslationUnit()) {
354eee242ff426bf79149f221798966e58688383c1eDouglas Gregor      // We've found a declaration that is not visible from the translation
355eee242ff426bf79149f221798966e58688383c1eDouglas Gregor      // unit (it's in an inner scope). Insert our declaration here.
356eee242ff426bf79149f221798966e58688383c1eDouglas Gregor      IDI->InsertDecl(I, D);
357eee242ff426bf79149f221798966e58688383c1eDouglas Gregor      return true;
358eee242ff426bf79149f221798966e58688383c1eDouglas Gregor    }
359eee242ff426bf79149f221798966e58688383c1eDouglas Gregor  }
360eee242ff426bf79149f221798966e58688383c1eDouglas Gregor
361eee242ff426bf79149f221798966e58688383c1eDouglas Gregor  // Add the declaration to the end.
362668c1a4fdcc56bdd050256b1688e116fe84b72dbDouglas Gregor  IDI->AddDecl(D);
363eee242ff426bf79149f221798966e58688383c1eDouglas Gregor  return true;
364eee242ff426bf79149f221798966e58688383c1eDouglas Gregor}
365eee242ff426bf79149f221798966e58688383c1eDouglas Gregor
366eee242ff426bf79149f221798966e58688383c1eDouglas Gregorvoid IdentifierResolver::readingIdentifier(IdentifierInfo &II) {
367eee242ff426bf79149f221798966e58688383c1eDouglas Gregor  if (II.isOutOfDate())
368eee242ff426bf79149f221798966e58688383c1eDouglas Gregor    PP.getExternalSource()->updateOutOfDateIdentifier(II);
369eee242ff426bf79149f221798966e58688383c1eDouglas Gregor}
370eee242ff426bf79149f221798966e58688383c1eDouglas Gregor
371eee242ff426bf79149f221798966e58688383c1eDouglas Gregorvoid IdentifierResolver::updatingIdentifier(IdentifierInfo &II) {
372eee242ff426bf79149f221798966e58688383c1eDouglas Gregor  if (II.isOutOfDate())
373eee242ff426bf79149f221798966e58688383c1eDouglas Gregor    PP.getExternalSource()->updateOutOfDateIdentifier(II);
374eee242ff426bf79149f221798966e58688383c1eDouglas Gregor
375eee242ff426bf79149f221798966e58688383c1eDouglas Gregor  if (II.isFromAST())
376eee242ff426bf79149f221798966e58688383c1eDouglas Gregor    II.setChangedSinceDeserialization();
377668c1a4fdcc56bdd050256b1688e116fe84b72dbDouglas Gregor}
378668c1a4fdcc56bdd050256b1688e116fe84b72dbDouglas Gregor
37981bebb1e2e6bb05e360f36da098dc7016e8f654bArgyrios Kyrtzidis//===----------------------------------------------------------------------===//
38081bebb1e2e6bb05e360f36da098dc7016e8f654bArgyrios Kyrtzidis// IdDeclInfoMap Implementation
38181bebb1e2e6bb05e360f36da098dc7016e8f654bArgyrios Kyrtzidis//===----------------------------------------------------------------------===//
38281bebb1e2e6bb05e360f36da098dc7016e8f654bArgyrios Kyrtzidis
3832def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor/// Returns the IdDeclInfo associated to the DeclarationName.
384a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner/// It creates a new IdDeclInfo if one was not created before for this id.
38500bc645d154f8f30bfbfb2fe508caf087793157cArgyrios KyrtzidisIdentifierResolver::IdDeclInfo &
3862def48394f6d48bde0dec2b514193c2b533265b5Douglas GregorIdentifierResolver::IdDeclInfoMap::operator[](DeclarationName Name) {
3872def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  void *Ptr = Name.getFETokenInfo<void>();
388a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner
38900bc645d154f8f30bfbfb2fe508caf087793157cArgyrios Kyrtzidis  if (Ptr) return *toIdDeclInfo(Ptr);
390a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner
391eeb1cb49244a67327fce088c1f720da1f8c021a9John McCall  if (CurIndex == POOL_SIZE) {
392eeb1cb49244a67327fce088c1f720da1f8c021a9John McCall    CurPool = new IdDeclInfoPool(CurPool);
393a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner    CurIndex = 0;
394a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner  }
395eeb1cb49244a67327fce088c1f720da1f8c021a9John McCall  IdDeclInfo *IDI = &CurPool->Pool[CurIndex];
3962def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  Name.setFETokenInfo(reinterpret_cast<void*>(
397a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner                              reinterpret_cast<uintptr_t>(IDI) | 0x1)
398a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner                                                                     );
399a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner  ++CurIndex;
400a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner  return *IDI;
401a2f42b1d18db7a6e05314b04532a6643e1ffba0fChris Lattner}
4027cd088e519d7e6caa4c4c12db52e0e4ae35d25c2John McCall
4037cd088e519d7e6caa4c4c12db52e0e4ae35d25c2John McCallvoid IdentifierResolver::iterator::incrementSlowCase() {
4047cd088e519d7e6caa4c4c12db52e0e4ae35d25c2John McCall  NamedDecl *D = **this;
4057cd088e519d7e6caa4c4c12db52e0e4ae35d25c2John McCall  void *InfoPtr = D->getDeclName().getFETokenInfo<void>();
4067cd088e519d7e6caa4c4c12db52e0e4ae35d25c2John McCall  assert(!isDeclPtr(InfoPtr) && "Decl with wrong id ?");
4077cd088e519d7e6caa4c4c12db52e0e4ae35d25c2John McCall  IdDeclInfo *Info = toIdDeclInfo(InfoPtr);
4087cd088e519d7e6caa4c4c12db52e0e4ae35d25c2John McCall
4097cd088e519d7e6caa4c4c12db52e0e4ae35d25c2John McCall  BaseIter I = getIterator();
4107cd088e519d7e6caa4c4c12db52e0e4ae35d25c2John McCall  if (I != Info->decls_begin())
4117cd088e519d7e6caa4c4c12db52e0e4ae35d25c2John McCall    *this = iterator(I-1);
4127cd088e519d7e6caa4c4c12db52e0e4ae35d25c2John McCall  else // No more decls.
4137cd088e519d7e6caa4c4c12db52e0e4ae35d25c2John McCall    *this = iterator();
4147cd088e519d7e6caa4c4c12db52e0e4ae35d25c2John McCall}
415