aboutsummaryrefslogtreecommitdiff
path: root/lib/Sema/SemaLookup.cpp
diff options
context:
space:
mode:
authorJohn McCall <rjmccall@apple.com>2009-08-11 06:59:38 +0000
committerJohn McCall <rjmccall@apple.com>2009-08-11 06:59:38 +0000
commit3f9a8a60614b763785d54ad08821745d03a4af70 (patch)
tree4cdd17b3e7e2a8d2f1a65bdc089ea3fa6c95ff24 /lib/Sema/SemaLookup.cpp
parentb98b1991c7ad1eaedb863bdbdd784ec164277675 (diff)
Argument-dependent lookup for friend declarations. Add a new decl type,
FriendFunctionDecl, and create instances as appropriate. The design of FriendFunctionDecl is still somewhat up in the air; you can befriend arbitrary types of functions --- methods, constructors, etc. --- and it's not clear that this representation captures that very well. We'll have a better picture when we start consuming this data in access control. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@78653 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/SemaLookup.cpp')
-rw-r--r--lib/Sema/SemaLookup.cpp29
1 files changed, 9 insertions, 20 deletions
diff --git a/lib/Sema/SemaLookup.cpp b/lib/Sema/SemaLookup.cpp
index ef105374fa..c600f99a40 100644
--- a/lib/Sema/SemaLookup.cpp
+++ b/lib/Sema/SemaLookup.cpp
@@ -1756,28 +1756,17 @@ void Sema::ArgumentDependentLookup(DeclarationName Name,
// associated classes are visible within their respective
// namespaces even if they are not visible during an ordinary
// lookup (11.4).
- //
- // We implement the second clause in the loop below.
- DeclContext::lookup_iterator I, E;
- for (llvm::tie(I, E) = (*NS)->lookup(Name); I != E; ++I)
- CollectFunctionDecl(Functions, *I);
- }
-
- // Look for friend function declarations in associated classes
- // which name functions in associated namespaces.
- for (AssociatedClassSet::iterator AC = AssociatedClasses.begin(),
- ACEnd = AssociatedClasses.end();
- AC != ACEnd; ++AC) {
DeclContext::lookup_iterator I, E;
- for (llvm::tie(I, E) = (*AC)->lookup(Name); I != E; ++I) {
+ for (llvm::tie(I, E) = (*NS)->lookup(Name); I != E; ++I) {
Decl *D = *I;
- if (!D->isInIdentifierNamespace(Decl::IDNS_Friend))
- continue;
-
- DeclContext *DC = D->getDeclContext();
- if (!AssociatedNamespaces.count(DC))
- continue;
-
+ // Only count friend declarations which were declared in
+ // associated classes.
+ if (D->isInIdentifierNamespace(Decl::IDNS_Friend)) {
+ DeclContext *LexDC = D->getLexicalDeclContext();
+ if (!AssociatedClasses.count(cast<CXXRecordDecl>(LexDC)))
+ continue;
+ }
+
CollectFunctionDecl(Functions, D);
}
}