r178136 - <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.

Douglas Gregor dgregor at apple.com
Wed Mar 27 05:51:50 PDT 2013


Author: dgregor
Date: Wed Mar 27 07:51:49 2013
New Revision: 178136

URL: http://llvm.org/viewvc/llvm-project?rev=178136&view=rev
Log:
<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.

Modified:
    cfe/trunk/lib/Sema/SemaLookup.cpp
    cfe/trunk/test/CXX/basic/basic.lookup/basic.lookup.unqual/p14.cpp

Modified: cfe/trunk/lib/Sema/SemaLookup.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaLookup.cpp?rev=178136&r1=178135&r2=178136&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaLookup.cpp (original)
+++ cfe/trunk/lib/Sema/SemaLookup.cpp Wed Mar 27 07:51:49 2013
@@ -945,6 +945,21 @@ bool Sema::CppLookupName(LookupResult &R
           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
   // 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;

Modified: cfe/trunk/test/CXX/basic/basic.lookup/basic.lookup.unqual/p14.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/basic/basic.lookup/basic.lookup.unqual/p14.cpp?rev=178136&r1=178135&r2=178136&view=diff
==============================================================================
--- cfe/trunk/test/CXX/basic/basic.lookup/basic.lookup.unqual/p14.cpp (original)
+++ cfe/trunk/test/CXX/basic/basic.lookup/basic.lookup.unqual/p14.cpp Wed Mar 27 07:51:49 2013
@@ -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;
+}





More information about the cfe-commits mailing list