]> granicus.if.org Git - clang/commitdiff
When performing the lookup in the current scope for a member access to
authorDouglas Gregor <dgregor@apple.com>
Wed, 10 Aug 2011 21:59:45 +0000 (21:59 +0000)
committerDouglas Gregor <dgregor@apple.com>
Wed, 10 Aug 2011 21:59:45 +0000 (21:59 +0000)
a member template, e.g.,

  x.f<int>

if we have found a template in the type of x, but the lookup in the
current scope is ambiguous, just ignore the lookup in the current
scope.  Fixes <rdar://problem/9915664>.

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

lib/Sema/SemaTemplate.cpp
test/CXX/basic/basic.lookup/basic.lookup.classref/p1.cpp

index e960452e06a04348a4d40d426db44e6bb838fd4a..ded352047a1ba30fb40893114d7434c3dab87843 100644 (file)
@@ -344,10 +344,12 @@ void Sema::LookupTemplateName(LookupResult &Found,
     if (FoundOuter.empty()) {
       //   - if the name is not found, the name found in the class of the
       //     object expression is used, otherwise
-    } else if (!FoundOuter.getAsSingle<ClassTemplateDecl>()) {
+    } else if (!FoundOuter.getAsSingle<ClassTemplateDecl>() ||
+               FoundOuter.isAmbiguous()) {
       //   - if the name is found in the context of the entire
       //     postfix-expression and does not name a class template, the name
       //     found in the class of the object expression is used, otherwise
+      FoundOuter.clear();
     } else if (!Found.isSuppressingDiagnostics()) {
       //   - if the name found is a class template, it must refer to the same
       //     entity as the one found in the class of the object expression,
index 3fde0daa96cfb1da76e9b3be541daebed20a8cf9..c35af1def208501607dedcbdf9663df38472732d 100644 (file)
@@ -44,3 +44,21 @@ void resolves_to_different() {
     v.set<double>(3.2);
   }
 }
+
+namespace rdar9915664 {
+  struct A {
+    template<typename T> void a();
+  };
+
+  struct B : A { };
+
+  struct C : A { };
+
+  struct D : B, C {
+    A &getA() { return static_cast<B&>(*this); }
+
+    void test_a() {
+      getA().a<int>();
+    }
+  };
+}