diff options
author | Douglas Gregor <dgregor@apple.com> | 2013-03-27 12:51:49 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2013-03-27 12:51:49 +0000 |
commit | 6bed88e9d25fd7e16edf3d95447ba414d9d73d72 (patch) | |
tree | 7f05d5e6ff69ebffbc017043dd186b3e2895e616 | |
parent | 5262dd909a34f4c3e3f061009679fabb77b43ba4 (diff) |
<rdar://problem/13317030> Consider using directives when performing unqualified name lookup into declarations contexts represented by the qualified-id but not in the actual scope hierarchy.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@178136 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Sema/SemaLookup.cpp | 16 | ||||
-rw-r--r-- | test/CXX/basic/basic.lookup/basic.lookup.unqual/p14.cpp | 30 |
2 files changed, 45 insertions, 1 deletions
diff --git a/lib/Sema/SemaLookup.cpp b/lib/Sema/SemaLookup.cpp index ad5b89a43a..0fe3db1901 100644 --- a/lib/Sema/SemaLookup.cpp +++ b/lib/Sema/SemaLookup.cpp @@ -945,6 +945,21 @@ bool Sema::CppLookupName(LookupResult &R, Scope *S) { continue; } + // If this is a file context, we need to perform unqualified name + // lookup considering using directives. + if (Ctx->isFileContext()) { + UnqualUsingDirectiveSet UDirs; + UDirs.visit(Ctx, Ctx); + UDirs.done(); + + if (CppNamespaceLookup(*this, R, Context, Ctx, UDirs)) { + R.resolveKind(); + return true; + } + + continue; + } + // Perform qualified name lookup into this context. // FIXME: In some cases, we know that every name that could be found by // this qualified name lookup will also be on the identifier chain. For @@ -979,7 +994,6 @@ bool Sema::CppLookupName(LookupResult &R, Scope *S) { // Unqualified name lookup in C++ requires looking into scopes // that aren't strictly lexical, and therefore we walk through the // context as well as walking through the scopes. - for (; S; S = S->getParent()) { // Check whether the IdResolver has anything in this scope. bool Found = false; diff --git a/test/CXX/basic/basic.lookup/basic.lookup.unqual/p14.cpp b/test/CXX/basic/basic.lookup/basic.lookup.unqual/p14.cpp index 4ffe538beb..7da3087e7d 100644 --- a/test/CXX/basic/basic.lookup/basic.lookup.unqual/p14.cpp +++ b/test/CXX/basic/basic.lookup/basic.lookup.unqual/p14.cpp @@ -17,3 +17,33 @@ namespace N { int i = 2; N::S N::j = i; N::S N::j2(i); + +// <rdar://problem/13317030> +namespace M { + class X { }; + inline X operator-(int, X); + + template<typename T> + class Y { }; + + typedef Y<float> YFloat; + + namespace yfloat { + YFloat operator-(YFloat, YFloat); + } + using namespace yfloat; +} + +using namespace M; + +namespace M { + +class Other { + void foo(YFloat a, YFloat b); +}; + +} + +void Other::foo(YFloat a, YFloat b) { + YFloat c = a - b; +} |