]> granicus.if.org Git - clang/commitdiff
When tag lookup finds something ambiguous, and we're defining a new
authorDouglas Gregor <dgregor@apple.com>
Wed, 4 May 2011 00:25:33 +0000 (00:25 +0000)
committerDouglas Gregor <dgregor@apple.com>
Wed, 4 May 2011 00:25:33 +0000 (00:25 +0000)
tag, filter out those ambiguous names that we found if they aren't
within the declaration context where this newly-defined tag will be
visible.

This is basically a hack, because we really need to fix the lookup of
tag declarations in this case to not find things it
shouldn't. However, it's better than what we had before, and it fixes
<rdar://problem/9168556>.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@130810 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaDecl.cpp
test/SemaCXX/tag-ambig.cpp [new file with mode: 0644]

index 975a96357481a72e433187e55a288c0392442309..d5112a2f0cc9a114c0e05b81a461e1952ab8faa6 100644 (file)
@@ -6715,6 +6715,19 @@ Decl *Sema::ActOnTag(Scope *S, unsigned TagSpec, TagUseKind TUK,
     // shouldn't be diagnosing.
     LookupName(Previous, S);
 
+    if (Previous.isAmbiguous() && TUK == TUK_Definition) {
+      LookupResult::Filter F = Previous.makeFilter();
+      while (F.hasNext()) {
+        NamedDecl *ND = F.next();
+        if (ND->getDeclContext()->getRedeclContext() != SearchDC)
+          F.erase();
+      }
+      F.done();
+      
+      if (Previous.isAmbiguous())
+        return 0;
+    }
+    
     // Note:  there used to be some attempt at recovery here.
     if (Previous.isAmbiguous())
       return 0;
diff --git a/test/SemaCXX/tag-ambig.cpp b/test/SemaCXX/tag-ambig.cpp
new file mode 100644 (file)
index 0000000..42cb960
--- /dev/null
@@ -0,0 +1,17 @@
+// RUN: %clang_cc1 -fsyntax-only -verify %s
+
+// <rdar://problem/9168556>
+typedef struct Point Point;
+
+namespace NameSpace {
+  class Point;
+}
+
+using namespace NameSpace;
+
+class Test
+{
+public:
+  struct Point { };
+  virtual bool testMethod (Test::Point& p) = 0;
+};