xref: /freebsd/contrib/llvm-project/clang/lib/Sema/IdentifierResolver.cpp (revision 06c3fb2749bda94cb5201f81ffdb8fa6c3161b2e)
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