summaryrefslogtreecommitdiffstats
path: root/clang/lib/AST/DeclBase.cpp
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2008-12-23 21:05:05 +0000
committerDouglas Gregor <dgregor@apple.com>2008-12-23 21:05:05 +0000
commit8b9ccca5e5f18910c83b7f12754e8bf446e06b27 (patch)
tree436d1fb99b0b8f3a1b83985a1e425917cc5cbbab /clang/lib/AST/DeclBase.cpp
parent8a35adf3a59e469dee9f63d72ac63261d3ae5289 (diff)
downloadbcm5719-llvm-8b9ccca5e5f18910c83b7f12754e8bf446e06b27.tar.gz
bcm5719-llvm-8b9ccca5e5f18910c83b7f12754e8bf446e06b27.zip
Don't push OverloadedFunctionDecls onto the chain of declarations
attached to an identifier. Instead, all overloaded functions will be pushed into scope, and we'll synthesize an OverloadedFunctionDecl on the fly when we need it. llvm-svn: 61386
Diffstat (limited to 'clang/lib/AST/DeclBase.cpp')
-rw-r--r--clang/lib/AST/DeclBase.cpp33
1 files changed, 10 insertions, 23 deletions
diff --git a/clang/lib/AST/DeclBase.cpp b/clang/lib/AST/DeclBase.cpp
index 87ebf85b41d..c6b3c53cc42 100644
--- a/clang/lib/AST/DeclBase.cpp
+++ b/clang/lib/AST/DeclBase.cpp
@@ -17,6 +17,8 @@
#include "clang/AST/ASTContext.h"
#include "clang/AST/Type.h"
#include "llvm/ADT/DenseMap.h"
+#include <algorithm>
+#include <functional>
#include <vector>
using namespace clang;
@@ -543,19 +545,6 @@ void DeclContext::insert(ASTContext &Context, ScopedDecl *D) {
insertImpl(D);
}
-static bool isRedeclarationOf(ScopedDecl *D, ScopedDecl *OldD) {
- assert(D->getDeclName() == OldD->getDeclName() && "Declaration name mismatch");
-
- if (FunctionDecl *FD = dyn_cast<FunctionDecl>(D))
- // For function declarations, we keep track of redeclarations.
- return FD->getPreviousDeclaration() == OldD;
-
- // For non-function declarations, if the declarations are of the
- // same kind then this must be a redeclaration, or semantic analysis
- // would not have given us the new declaration.
- return D->getKind() == OldD->getKind();
-}
-
void DeclContext::insertImpl(ScopedDecl *D) {
bool MayBeRedeclaration = true;
@@ -591,7 +580,7 @@ void DeclContext::insertImpl(ScopedDecl *D) {
if (Array[LastMatch]->getDeclName() != D->getDeclName())
break;
- if (isRedeclarationOf(D, Array[LastMatch])) {
+ if (D->declarationReplaces(Array[LastMatch])) {
// D is a redeclaration of an existing element in the
// array. Replace that element with D.
Array[LastMatch] = D;
@@ -640,15 +629,13 @@ void DeclContext::insertImpl(ScopedDecl *D) {
if (Pos != Map->end()) {
if (MayBeRedeclaration) {
// Determine if this declaration is actually a redeclaration.
- for (std::vector<ScopedDecl *>::iterator I = Pos->second.begin(),
- IEnd = Pos->second.end();
- I != IEnd; ++I) {
- if (isRedeclarationOf(D, *I)) {
- // D is a redeclaration of *I. Replace *I with D and we're
- // done.
- *I = D;
- return;
- }
+ std::vector<ScopedDecl *>::iterator Redecl
+ = std::find_if(Pos->second.begin(), Pos->second.end(),
+ std::bind1st(std::mem_fun(&ScopedDecl::declarationReplaces),
+ D));
+ if (Redecl != Pos->second.end()) {
+ *Redecl = D;
+ return;
}
}
OpenPOWER on IntegriCloud