10b57cec5SDimitry Andric //===- IdentifierResolver.cpp - Lexical Scope Name lookup -----------------===// 20b57cec5SDimitry Andric // 30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 60b57cec5SDimitry Andric // 70b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 80b57cec5SDimitry Andric // 90b57cec5SDimitry Andric // This file implements the IdentifierResolver class, which is used for lexical 100b57cec5SDimitry Andric // scoped lookup, based on declaration names. 110b57cec5SDimitry Andric // 120b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 130b57cec5SDimitry Andric 140b57cec5SDimitry Andric #include "clang/Sema/IdentifierResolver.h" 150b57cec5SDimitry Andric #include "clang/AST/Decl.h" 160b57cec5SDimitry Andric #include "clang/AST/DeclBase.h" 170b57cec5SDimitry Andric #include "clang/AST/DeclarationName.h" 180b57cec5SDimitry Andric #include "clang/Basic/IdentifierTable.h" 190b57cec5SDimitry Andric #include "clang/Basic/LangOptions.h" 200b57cec5SDimitry Andric #include "clang/Lex/ExternalPreprocessorSource.h" 210b57cec5SDimitry Andric #include "clang/Lex/Preprocessor.h" 220b57cec5SDimitry Andric #include "clang/Sema/Scope.h" 230b57cec5SDimitry Andric #include "llvm/Support/ErrorHandling.h" 240b57cec5SDimitry Andric #include <cassert> 250b57cec5SDimitry Andric #include <cstdint> 260b57cec5SDimitry Andric 270b57cec5SDimitry Andric using namespace clang; 280b57cec5SDimitry Andric 290b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 300b57cec5SDimitry Andric // IdDeclInfoMap class 310b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 320b57cec5SDimitry Andric 330b57cec5SDimitry Andric /// IdDeclInfoMap - Associates IdDeclInfos with declaration names. 340b57cec5SDimitry Andric /// Allocates 'pools' (vectors of IdDeclInfos) to avoid allocating each 350b57cec5SDimitry Andric /// individual IdDeclInfo to heap. 360b57cec5SDimitry Andric class IdentifierResolver::IdDeclInfoMap { 370b57cec5SDimitry Andric static const unsigned int POOL_SIZE = 512; 380b57cec5SDimitry Andric 390b57cec5SDimitry Andric /// We use our own linked-list implementation because it is sadly 400b57cec5SDimitry Andric /// impossible to add something to a pre-C++0x STL container without 410b57cec5SDimitry Andric /// a completely unnecessary copy. 420b57cec5SDimitry Andric struct IdDeclInfoPool { 430b57cec5SDimitry Andric IdDeclInfoPool *Next; 440b57cec5SDimitry Andric IdDeclInfo Pool[POOL_SIZE]; 450b57cec5SDimitry Andric 460b57cec5SDimitry Andric IdDeclInfoPool(IdDeclInfoPool *Next) : Next(Next) {} 470b57cec5SDimitry Andric }; 480b57cec5SDimitry Andric 490b57cec5SDimitry Andric IdDeclInfoPool *CurPool = nullptr; 500b57cec5SDimitry Andric unsigned int CurIndex = POOL_SIZE; 510b57cec5SDimitry Andric 520b57cec5SDimitry Andric public: 530b57cec5SDimitry Andric IdDeclInfoMap() = default; 540b57cec5SDimitry Andric 550b57cec5SDimitry Andric ~IdDeclInfoMap() { 560b57cec5SDimitry Andric IdDeclInfoPool *Cur = CurPool; 570b57cec5SDimitry Andric while (IdDeclInfoPool *P = Cur) { 580b57cec5SDimitry Andric Cur = Cur->Next; 590b57cec5SDimitry Andric delete P; 600b57cec5SDimitry Andric } 610b57cec5SDimitry Andric } 620b57cec5SDimitry Andric 630b57cec5SDimitry Andric /// Returns the IdDeclInfo associated to the DeclarationName. 640b57cec5SDimitry Andric /// It creates a new IdDeclInfo if one was not created before for this id. 650b57cec5SDimitry Andric IdDeclInfo &operator[](DeclarationName Name); 660b57cec5SDimitry Andric }; 670b57cec5SDimitry Andric 680b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 690b57cec5SDimitry Andric // IdDeclInfo Implementation 700b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 710b57cec5SDimitry Andric 720b57cec5SDimitry Andric /// RemoveDecl - Remove the decl from the scope chain. 730b57cec5SDimitry Andric /// The decl must already be part of the decl chain. 740b57cec5SDimitry Andric void IdentifierResolver::IdDeclInfo::RemoveDecl(NamedDecl *D) { 750b57cec5SDimitry Andric for (DeclsTy::iterator I = Decls.end(); I != Decls.begin(); --I) { 760b57cec5SDimitry Andric if (D == *(I-1)) { 770b57cec5SDimitry Andric Decls.erase(I-1); 780b57cec5SDimitry Andric return; 790b57cec5SDimitry Andric } 800b57cec5SDimitry Andric } 810b57cec5SDimitry Andric 820b57cec5SDimitry Andric llvm_unreachable("Didn't find this decl on its identifier's chain!"); 830b57cec5SDimitry Andric } 840b57cec5SDimitry Andric 850b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 860b57cec5SDimitry Andric // IdentifierResolver Implementation 870b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 880b57cec5SDimitry Andric 890b57cec5SDimitry Andric IdentifierResolver::IdentifierResolver(Preprocessor &PP) 900b57cec5SDimitry Andric : LangOpt(PP.getLangOpts()), PP(PP), IdDeclInfos(new IdDeclInfoMap) {} 910b57cec5SDimitry Andric 920b57cec5SDimitry Andric IdentifierResolver::~IdentifierResolver() { 930b57cec5SDimitry Andric delete IdDeclInfos; 940b57cec5SDimitry Andric } 950b57cec5SDimitry Andric 960b57cec5SDimitry Andric /// isDeclInScope - If 'Ctx' is a function/method, isDeclInScope returns true 970b57cec5SDimitry Andric /// if 'D' is in Scope 'S', otherwise 'S' is ignored and isDeclInScope returns 980b57cec5SDimitry Andric /// true if 'D' belongs to the given declaration context. 990b57cec5SDimitry Andric bool IdentifierResolver::isDeclInScope(Decl *D, DeclContext *Ctx, Scope *S, 1000b57cec5SDimitry Andric bool AllowInlineNamespace) const { 1010b57cec5SDimitry Andric Ctx = Ctx->getRedeclContext(); 102bdd1243dSDimitry Andric // The names for HLSL cbuffer/tbuffers only used by the CPU-side 103bdd1243dSDimitry Andric // reflection API which supports querying bindings. It will not have name 104bdd1243dSDimitry Andric // conflict with other Decls. 105bdd1243dSDimitry Andric if (LangOpt.HLSL && isa<HLSLBufferDecl>(D)) 106bdd1243dSDimitry Andric return false; 1070b57cec5SDimitry Andric if (Ctx->isFunctionOrMethod() || (S && S->isFunctionPrototypeScope())) { 1080b57cec5SDimitry Andric // Ignore the scopes associated within transparent declaration contexts. 1090b57cec5SDimitry Andric while (S->getEntity() && S->getEntity()->isTransparentContext()) 1100b57cec5SDimitry Andric S = S->getParent(); 1110b57cec5SDimitry Andric 1120b57cec5SDimitry Andric if (S->isDeclScope(D)) 1130b57cec5SDimitry Andric return true; 1140b57cec5SDimitry Andric if (LangOpt.CPlusPlus) { 1150b57cec5SDimitry Andric // C++ 3.3.2p3: 1160b57cec5SDimitry Andric // The name declared in a catch exception-declaration is local to the 1170b57cec5SDimitry Andric // handler and shall not be redeclared in the outermost block of the 1180b57cec5SDimitry Andric // handler. 1190b57cec5SDimitry Andric // C++ 3.3.2p4: 1200b57cec5SDimitry Andric // Names declared in the for-init-statement, and in the condition of if, 1210b57cec5SDimitry Andric // while, for, and switch statements are local to the if, while, for, or 1220b57cec5SDimitry Andric // switch statement (including the controlled statement), and shall not be 1230b57cec5SDimitry Andric // redeclared in a subsequent condition of that statement nor in the 1240b57cec5SDimitry Andric // outermost block (or, for the if statement, any of the outermost blocks) 1250b57cec5SDimitry Andric // of the controlled statement. 1260b57cec5SDimitry Andric // 1270b57cec5SDimitry Andric assert(S->getParent() && "No TUScope?"); 12881ad6265SDimitry Andric // If the current decl is in a lambda, we shouldn't consider this is a 12981ad6265SDimitry Andric // redefinition as lambda has its own scope. 13081ad6265SDimitry Andric if (S->getParent()->isControlScope() && !S->isFunctionScope()) { 1310b57cec5SDimitry Andric S = S->getParent(); 1320b57cec5SDimitry Andric if (S->isDeclScope(D)) 1330b57cec5SDimitry Andric return true; 1340b57cec5SDimitry Andric } 13581ad6265SDimitry Andric if (S->isFnTryCatchScope()) 1360b57cec5SDimitry Andric return S->getParent()->isDeclScope(D); 1370b57cec5SDimitry Andric } 1380b57cec5SDimitry Andric return false; 1390b57cec5SDimitry Andric } 1400b57cec5SDimitry Andric 1410b57cec5SDimitry Andric // FIXME: If D is a local extern declaration, this check doesn't make sense; 1420b57cec5SDimitry Andric // we should be checking its lexical context instead in that case, because 1430b57cec5SDimitry Andric // that is its scope. 1440b57cec5SDimitry Andric DeclContext *DCtx = D->getDeclContext()->getRedeclContext(); 1450b57cec5SDimitry Andric return AllowInlineNamespace ? Ctx->InEnclosingNamespaceSetOf(DCtx) 1460b57cec5SDimitry Andric : Ctx->Equals(DCtx); 1470b57cec5SDimitry Andric } 1480b57cec5SDimitry Andric 1490b57cec5SDimitry Andric /// AddDecl - Link the decl to its shadowed decl chain. 1500b57cec5SDimitry Andric void IdentifierResolver::AddDecl(NamedDecl *D) { 1510b57cec5SDimitry Andric DeclarationName Name = D->getDeclName(); 1520b57cec5SDimitry Andric if (IdentifierInfo *II = Name.getAsIdentifierInfo()) 1530b57cec5SDimitry Andric updatingIdentifier(*II); 1540b57cec5SDimitry Andric 1550b57cec5SDimitry Andric void *Ptr = Name.getFETokenInfo(); 1560b57cec5SDimitry Andric 1570b57cec5SDimitry Andric if (!Ptr) { 1580b57cec5SDimitry Andric Name.setFETokenInfo(D); 1590b57cec5SDimitry Andric return; 1600b57cec5SDimitry Andric } 1610b57cec5SDimitry Andric 1620b57cec5SDimitry Andric IdDeclInfo *IDI; 1630b57cec5SDimitry Andric 1640b57cec5SDimitry Andric if (isDeclPtr(Ptr)) { 1650b57cec5SDimitry Andric Name.setFETokenInfo(nullptr); 1660b57cec5SDimitry Andric IDI = &(*IdDeclInfos)[Name]; 1670b57cec5SDimitry Andric NamedDecl *PrevD = static_cast<NamedDecl*>(Ptr); 1680b57cec5SDimitry Andric IDI->AddDecl(PrevD); 1690b57cec5SDimitry Andric } else 1700b57cec5SDimitry Andric IDI = toIdDeclInfo(Ptr); 1710b57cec5SDimitry Andric 1720b57cec5SDimitry Andric IDI->AddDecl(D); 1730b57cec5SDimitry Andric } 1740b57cec5SDimitry Andric 1750b57cec5SDimitry Andric void IdentifierResolver::InsertDeclAfter(iterator Pos, NamedDecl *D) { 1760b57cec5SDimitry Andric DeclarationName Name = D->getDeclName(); 1770b57cec5SDimitry Andric if (IdentifierInfo *II = Name.getAsIdentifierInfo()) 1780b57cec5SDimitry Andric updatingIdentifier(*II); 1790b57cec5SDimitry Andric 1800b57cec5SDimitry Andric void *Ptr = Name.getFETokenInfo(); 1810b57cec5SDimitry Andric 1820b57cec5SDimitry Andric if (!Ptr) { 1830b57cec5SDimitry Andric AddDecl(D); 1840b57cec5SDimitry Andric return; 1850b57cec5SDimitry Andric } 1860b57cec5SDimitry Andric 1870b57cec5SDimitry Andric if (isDeclPtr(Ptr)) { 1880b57cec5SDimitry Andric // We only have a single declaration: insert before or after it, 1890b57cec5SDimitry Andric // as appropriate. 1900b57cec5SDimitry Andric if (Pos == iterator()) { 1910b57cec5SDimitry Andric // Add the new declaration before the existing declaration. 1920b57cec5SDimitry Andric NamedDecl *PrevD = static_cast<NamedDecl*>(Ptr); 1930b57cec5SDimitry Andric RemoveDecl(PrevD); 1940b57cec5SDimitry Andric AddDecl(D); 1950b57cec5SDimitry Andric AddDecl(PrevD); 1960b57cec5SDimitry Andric } else { 1970b57cec5SDimitry Andric // Add new declaration after the existing declaration. 1980b57cec5SDimitry Andric AddDecl(D); 1990b57cec5SDimitry Andric } 2000b57cec5SDimitry Andric 2010b57cec5SDimitry Andric return; 2020b57cec5SDimitry Andric } 2030b57cec5SDimitry Andric 2040b57cec5SDimitry Andric // General case: insert the declaration at the appropriate point in the 2050b57cec5SDimitry Andric // list, which already has at least two elements. 2060b57cec5SDimitry Andric IdDeclInfo *IDI = toIdDeclInfo(Ptr); 2070b57cec5SDimitry Andric if (Pos.isIterator()) { 2080b57cec5SDimitry Andric IDI->InsertDecl(Pos.getIterator() + 1, D); 2090b57cec5SDimitry Andric } else 2100b57cec5SDimitry Andric IDI->InsertDecl(IDI->decls_begin(), D); 2110b57cec5SDimitry Andric } 2120b57cec5SDimitry Andric 2130b57cec5SDimitry Andric /// RemoveDecl - Unlink the decl from its shadowed decl chain. 2140b57cec5SDimitry Andric /// The decl must already be part of the decl chain. 2150b57cec5SDimitry Andric void IdentifierResolver::RemoveDecl(NamedDecl *D) { 2160b57cec5SDimitry Andric assert(D && "null param passed"); 2170b57cec5SDimitry Andric DeclarationName Name = D->getDeclName(); 2180b57cec5SDimitry Andric if (IdentifierInfo *II = Name.getAsIdentifierInfo()) 2190b57cec5SDimitry Andric updatingIdentifier(*II); 2200b57cec5SDimitry Andric 2210b57cec5SDimitry Andric void *Ptr = Name.getFETokenInfo(); 2220b57cec5SDimitry Andric 2230b57cec5SDimitry Andric assert(Ptr && "Didn't find this decl on its identifier's chain!"); 2240b57cec5SDimitry Andric 2250b57cec5SDimitry Andric if (isDeclPtr(Ptr)) { 2260b57cec5SDimitry Andric assert(D == Ptr && "Didn't find this decl on its identifier's chain!"); 2270b57cec5SDimitry Andric Name.setFETokenInfo(nullptr); 2280b57cec5SDimitry Andric return; 2290b57cec5SDimitry Andric } 2300b57cec5SDimitry Andric 2310b57cec5SDimitry Andric return toIdDeclInfo(Ptr)->RemoveDecl(D); 2320b57cec5SDimitry Andric } 2330b57cec5SDimitry Andric 234*06c3fb27SDimitry Andric llvm::iterator_range<IdentifierResolver::iterator> 235*06c3fb27SDimitry Andric IdentifierResolver::decls(DeclarationName Name) { 236*06c3fb27SDimitry Andric return {begin(Name), end()}; 237*06c3fb27SDimitry Andric } 238*06c3fb27SDimitry Andric 239*06c3fb27SDimitry Andric IdentifierResolver::iterator IdentifierResolver::begin(DeclarationName Name) { 2400b57cec5SDimitry Andric if (IdentifierInfo *II = Name.getAsIdentifierInfo()) 2410b57cec5SDimitry Andric readingIdentifier(*II); 2420b57cec5SDimitry Andric 2430b57cec5SDimitry Andric void *Ptr = Name.getFETokenInfo(); 2440b57cec5SDimitry Andric if (!Ptr) return end(); 2450b57cec5SDimitry Andric 2460b57cec5SDimitry Andric if (isDeclPtr(Ptr)) 2470b57cec5SDimitry Andric return iterator(static_cast<NamedDecl*>(Ptr)); 2480b57cec5SDimitry Andric 2490b57cec5SDimitry Andric IdDeclInfo *IDI = toIdDeclInfo(Ptr); 2500b57cec5SDimitry Andric 2510b57cec5SDimitry Andric IdDeclInfo::DeclsTy::iterator I = IDI->decls_end(); 2520b57cec5SDimitry Andric if (I != IDI->decls_begin()) 2530b57cec5SDimitry Andric return iterator(I-1); 2540b57cec5SDimitry Andric // No decls found. 2550b57cec5SDimitry Andric return end(); 2560b57cec5SDimitry Andric } 2570b57cec5SDimitry Andric 2580b57cec5SDimitry Andric namespace { 2590b57cec5SDimitry Andric 2600b57cec5SDimitry Andric enum DeclMatchKind { 2610b57cec5SDimitry Andric DMK_Different, 2620b57cec5SDimitry Andric DMK_Replace, 2630b57cec5SDimitry Andric DMK_Ignore 2640b57cec5SDimitry Andric }; 2650b57cec5SDimitry Andric 2660b57cec5SDimitry Andric } // namespace 2670b57cec5SDimitry Andric 2680b57cec5SDimitry Andric /// Compare two declarations to see whether they are different or, 2690b57cec5SDimitry Andric /// if they are the same, whether the new declaration should replace the 2700b57cec5SDimitry Andric /// existing declaration. 2710b57cec5SDimitry Andric static DeclMatchKind compareDeclarations(NamedDecl *Existing, NamedDecl *New) { 2720b57cec5SDimitry Andric // If the declarations are identical, ignore the new one. 2730b57cec5SDimitry Andric if (Existing == New) 2740b57cec5SDimitry Andric return DMK_Ignore; 2750b57cec5SDimitry Andric 2760b57cec5SDimitry Andric // If the declarations have different kinds, they're obviously different. 2770b57cec5SDimitry Andric if (Existing->getKind() != New->getKind()) 2780b57cec5SDimitry Andric return DMK_Different; 2790b57cec5SDimitry Andric 2800b57cec5SDimitry Andric // If the declarations are redeclarations of each other, keep the newest one. 2810b57cec5SDimitry Andric if (Existing->getCanonicalDecl() == New->getCanonicalDecl()) { 2820b57cec5SDimitry Andric // If we're adding an imported declaration, don't replace another imported 2830b57cec5SDimitry Andric // declaration. 2840b57cec5SDimitry Andric if (Existing->isFromASTFile() && New->isFromASTFile()) 2850b57cec5SDimitry Andric return DMK_Different; 2860b57cec5SDimitry Andric 2870b57cec5SDimitry Andric // If either of these is the most recent declaration, use it. 2880b57cec5SDimitry Andric Decl *MostRecent = Existing->getMostRecentDecl(); 2890b57cec5SDimitry Andric if (Existing == MostRecent) 2900b57cec5SDimitry Andric return DMK_Ignore; 2910b57cec5SDimitry Andric 2920b57cec5SDimitry Andric if (New == MostRecent) 2930b57cec5SDimitry Andric return DMK_Replace; 2940b57cec5SDimitry Andric 2950b57cec5SDimitry Andric // If the existing declaration is somewhere in the previous declaration 2960b57cec5SDimitry Andric // chain of the new declaration, then prefer the new declaration. 297bdd1243dSDimitry Andric for (auto *RD : New->redecls()) { 2980b57cec5SDimitry Andric if (RD == Existing) 2990b57cec5SDimitry Andric return DMK_Replace; 3000b57cec5SDimitry Andric 3010b57cec5SDimitry Andric if (RD->isCanonicalDecl()) 3020b57cec5SDimitry Andric break; 3030b57cec5SDimitry Andric } 3040b57cec5SDimitry Andric 3050b57cec5SDimitry Andric return DMK_Ignore; 3060b57cec5SDimitry Andric } 3070b57cec5SDimitry Andric 3080b57cec5SDimitry Andric return DMK_Different; 3090b57cec5SDimitry Andric } 3100b57cec5SDimitry Andric 3110b57cec5SDimitry Andric bool IdentifierResolver::tryAddTopLevelDecl(NamedDecl *D, DeclarationName Name){ 3120b57cec5SDimitry Andric if (IdentifierInfo *II = Name.getAsIdentifierInfo()) 3130b57cec5SDimitry Andric readingIdentifier(*II); 3140b57cec5SDimitry Andric 3150b57cec5SDimitry Andric void *Ptr = Name.getFETokenInfo(); 3160b57cec5SDimitry Andric 3170b57cec5SDimitry Andric if (!Ptr) { 3180b57cec5SDimitry Andric Name.setFETokenInfo(D); 3190b57cec5SDimitry Andric return true; 3200b57cec5SDimitry Andric } 3210b57cec5SDimitry Andric 3220b57cec5SDimitry Andric IdDeclInfo *IDI; 3230b57cec5SDimitry Andric 3240b57cec5SDimitry Andric if (isDeclPtr(Ptr)) { 3250b57cec5SDimitry Andric NamedDecl *PrevD = static_cast<NamedDecl*>(Ptr); 3260b57cec5SDimitry Andric 3270b57cec5SDimitry Andric switch (compareDeclarations(PrevD, D)) { 3280b57cec5SDimitry Andric case DMK_Different: 3290b57cec5SDimitry Andric break; 3300b57cec5SDimitry Andric 3310b57cec5SDimitry Andric case DMK_Ignore: 3320b57cec5SDimitry Andric return false; 3330b57cec5SDimitry Andric 3340b57cec5SDimitry Andric case DMK_Replace: 3350b57cec5SDimitry Andric Name.setFETokenInfo(D); 3360b57cec5SDimitry Andric return true; 3370b57cec5SDimitry Andric } 3380b57cec5SDimitry Andric 3390b57cec5SDimitry Andric Name.setFETokenInfo(nullptr); 3400b57cec5SDimitry Andric IDI = &(*IdDeclInfos)[Name]; 3410b57cec5SDimitry Andric 3420b57cec5SDimitry Andric // If the existing declaration is not visible in translation unit scope, 3430b57cec5SDimitry Andric // then add the new top-level declaration first. 3440b57cec5SDimitry Andric if (!PrevD->getDeclContext()->getRedeclContext()->isTranslationUnit()) { 3450b57cec5SDimitry Andric IDI->AddDecl(D); 3460b57cec5SDimitry Andric IDI->AddDecl(PrevD); 3470b57cec5SDimitry Andric } else { 3480b57cec5SDimitry Andric IDI->AddDecl(PrevD); 3490b57cec5SDimitry Andric IDI->AddDecl(D); 3500b57cec5SDimitry Andric } 3510b57cec5SDimitry Andric return true; 3520b57cec5SDimitry Andric } 3530b57cec5SDimitry Andric 3540b57cec5SDimitry Andric IDI = toIdDeclInfo(Ptr); 3550b57cec5SDimitry Andric 3560b57cec5SDimitry Andric // See whether this declaration is identical to any existing declarations. 3570b57cec5SDimitry Andric // If not, find the right place to insert it. 3580b57cec5SDimitry Andric for (IdDeclInfo::DeclsTy::iterator I = IDI->decls_begin(), 3590b57cec5SDimitry Andric IEnd = IDI->decls_end(); 3600b57cec5SDimitry Andric I != IEnd; ++I) { 3610b57cec5SDimitry Andric 3620b57cec5SDimitry Andric switch (compareDeclarations(*I, D)) { 3630b57cec5SDimitry Andric case DMK_Different: 3640b57cec5SDimitry Andric break; 3650b57cec5SDimitry Andric 3660b57cec5SDimitry Andric case DMK_Ignore: 3670b57cec5SDimitry Andric return false; 3680b57cec5SDimitry Andric 3690b57cec5SDimitry Andric case DMK_Replace: 3700b57cec5SDimitry Andric *I = D; 3710b57cec5SDimitry Andric return true; 3720b57cec5SDimitry Andric } 3730b57cec5SDimitry Andric 3740b57cec5SDimitry Andric if (!(*I)->getDeclContext()->getRedeclContext()->isTranslationUnit()) { 3750b57cec5SDimitry Andric // We've found a declaration that is not visible from the translation 3760b57cec5SDimitry Andric // unit (it's in an inner scope). Insert our declaration here. 3770b57cec5SDimitry Andric IDI->InsertDecl(I, D); 3780b57cec5SDimitry Andric return true; 3790b57cec5SDimitry Andric } 3800b57cec5SDimitry Andric } 3810b57cec5SDimitry Andric 3820b57cec5SDimitry Andric // Add the declaration to the end. 3830b57cec5SDimitry Andric IDI->AddDecl(D); 3840b57cec5SDimitry Andric return true; 3850b57cec5SDimitry Andric } 3860b57cec5SDimitry Andric 3870b57cec5SDimitry Andric void IdentifierResolver::readingIdentifier(IdentifierInfo &II) { 3880b57cec5SDimitry Andric if (II.isOutOfDate()) 3890b57cec5SDimitry Andric PP.getExternalSource()->updateOutOfDateIdentifier(II); 3900b57cec5SDimitry Andric } 3910b57cec5SDimitry Andric 3920b57cec5SDimitry Andric void IdentifierResolver::updatingIdentifier(IdentifierInfo &II) { 3930b57cec5SDimitry Andric if (II.isOutOfDate()) 3940b57cec5SDimitry Andric PP.getExternalSource()->updateOutOfDateIdentifier(II); 3950b57cec5SDimitry Andric 3960b57cec5SDimitry Andric if (II.isFromAST()) 3970b57cec5SDimitry Andric II.setFETokenInfoChangedSinceDeserialization(); 3980b57cec5SDimitry Andric } 3990b57cec5SDimitry Andric 4000b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 4010b57cec5SDimitry Andric // IdDeclInfoMap Implementation 4020b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 4030b57cec5SDimitry Andric 4040b57cec5SDimitry Andric /// Returns the IdDeclInfo associated to the DeclarationName. 4050b57cec5SDimitry Andric /// It creates a new IdDeclInfo if one was not created before for this id. 4060b57cec5SDimitry Andric IdentifierResolver::IdDeclInfo & 4070b57cec5SDimitry Andric IdentifierResolver::IdDeclInfoMap::operator[](DeclarationName Name) { 4080b57cec5SDimitry Andric void *Ptr = Name.getFETokenInfo(); 4090b57cec5SDimitry Andric 4100b57cec5SDimitry Andric if (Ptr) return *toIdDeclInfo(Ptr); 4110b57cec5SDimitry Andric 4120b57cec5SDimitry Andric if (CurIndex == POOL_SIZE) { 4130b57cec5SDimitry Andric CurPool = new IdDeclInfoPool(CurPool); 4140b57cec5SDimitry Andric CurIndex = 0; 4150b57cec5SDimitry Andric } 4160b57cec5SDimitry Andric IdDeclInfo *IDI = &CurPool->Pool[CurIndex]; 4170b57cec5SDimitry Andric Name.setFETokenInfo(reinterpret_cast<void*>( 4180b57cec5SDimitry Andric reinterpret_cast<uintptr_t>(IDI) | 0x1) 4190b57cec5SDimitry Andric ); 4200b57cec5SDimitry Andric ++CurIndex; 4210b57cec5SDimitry Andric return *IDI; 4220b57cec5SDimitry Andric } 4230b57cec5SDimitry Andric 4240b57cec5SDimitry Andric void IdentifierResolver::iterator::incrementSlowCase() { 4250b57cec5SDimitry Andric NamedDecl *D = **this; 4260b57cec5SDimitry Andric void *InfoPtr = D->getDeclName().getFETokenInfo(); 4270b57cec5SDimitry Andric assert(!isDeclPtr(InfoPtr) && "Decl with wrong id ?"); 4280b57cec5SDimitry Andric IdDeclInfo *Info = toIdDeclInfo(InfoPtr); 4290b57cec5SDimitry Andric 4300b57cec5SDimitry Andric BaseIter I = getIterator(); 4310b57cec5SDimitry Andric if (I != Info->decls_begin()) 4320b57cec5SDimitry Andric *this = iterator(I-1); 4330b57cec5SDimitry Andric else // No more decls. 4340b57cec5SDimitry Andric *this = iterator(); 4350b57cec5SDimitry Andric } 436