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