diff options
| author | Douglas Gregor <dgregor@apple.com> | 2009-03-02 00:19:53 +0000 |
|---|---|---|
| committer | Douglas Gregor <dgregor@apple.com> | 2009-03-02 00:19:53 +0000 |
| commit | 5a80bd15044647ff15e12bd7b1605d82e2d0cd97 (patch) | |
| tree | fd0d3d411b0366d80cd0daef039eaef2b4f17a11 /clang/lib/Sema/IdentifierResolver.cpp | |
| parent | a9e981225e050a02c79c68537779b36289d2115b (diff) | |
| download | bcm5719-llvm-5a80bd15044647ff15e12bd7b1605d82e2d0cd97.tar.gz bcm5719-llvm-5a80bd15044647ff15e12bd7b1605d82e2d0cd97.zip | |
Rework the way we find locally-scoped external declarations when we
need them to evaluate redeclarations or call a function that hasn't
already been declared. We now keep a DenseMap of these locally-scoped
declarations so that they are not visible but can be quickly found,
e.g., when we're looking for previous declarations or before we go
ahead and implicitly declare a function that's being called. Fixes
PR3672.
llvm-svn: 65792
Diffstat (limited to 'clang/lib/Sema/IdentifierResolver.cpp')
| -rw-r--r-- | clang/lib/Sema/IdentifierResolver.cpp | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/clang/lib/Sema/IdentifierResolver.cpp b/clang/lib/Sema/IdentifierResolver.cpp index 6efedb4895e..609c8723959 100644 --- a/clang/lib/Sema/IdentifierResolver.cpp +++ b/clang/lib/Sema/IdentifierResolver.cpp @@ -75,6 +75,18 @@ void IdentifierResolver::IdDeclInfo::RemoveDecl(NamedDecl *D) { assert(0 && "Didn't find this decl on its identifier's chain!"); } +bool +IdentifierResolver::IdDeclInfo::ReplaceDecl(NamedDecl *Old, NamedDecl *New) { + for (DeclsTy::iterator I = Decls.end(); I != Decls.begin(); --I) { + if (Old == *(I-1)) { + *(I - 1) = New; + return true; + } + } + + return false; +} + //===----------------------------------------------------------------------===// // IdentifierResolver Implementation @@ -192,6 +204,27 @@ void IdentifierResolver::RemoveDecl(NamedDecl *D) { return toIdDeclInfo(Ptr)->RemoveDecl(D); } +bool IdentifierResolver::ReplaceDecl(NamedDecl *Old, NamedDecl *New) { + assert(Old->getDeclName() == New->getDeclName() && + "Cannot replace a decl with another decl of a different name"); + + DeclarationName Name = Old->getDeclName(); + void *Ptr = Name.getFETokenInfo<void>(); + + if (!Ptr) + return false; + + if (isDeclPtr(Ptr)) { + if (Ptr == Old) { + Name.setFETokenInfo(New); + return true; + } + return false; + } + + return toIdDeclInfo(Ptr)->ReplaceDecl(Old, New); +} + /// begin - Returns an iterator for decls with name 'Name'. IdentifierResolver::iterator IdentifierResolver::begin(DeclarationName Name) { |

