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