]> granicus.if.org Git - clang/commitdiff
For member pointer conversions potentially involving derived-to-base
authorDouglas Gregor <dgregor@apple.com>
Tue, 21 Dec 2010 21:40:41 +0000 (21:40 +0000)
committerDouglas Gregor <dgregor@apple.com>
Tue, 21 Dec 2010 21:40:41 +0000 (21:40 +0000)
conversions, make sure that the (possibly) derived type is complete
before looking for base classes.

Finishes the fix for PR8801.

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

lib/Sema/SemaOverload.cpp
test/SemaTemplate/instantiate-local-class.cpp

index 6b370fd36aebcb17043e391f72396208b4cfb2be..a39f12603ce23effc99bc7694a9430147a92f92d 100644 (file)
@@ -1883,9 +1883,10 @@ bool Sema::IsMemberPointerConversion(Expr *From, QualType FromType,
   // where D is derived from B (C++ 4.11p2).
   QualType FromClass(FromTypePtr->getClass(), 0);
   QualType ToClass(ToTypePtr->getClass(), 0);
-  // FIXME: What happens when these are dependent? Is this function even called?
 
-  if (IsDerivedFrom(ToClass, FromClass)) {
+  if (!Context.hasSameUnqualifiedType(FromClass, ToClass) &&
+      !RequireCompleteType(From->getLocStart(), ToClass, PDiag()) &&
+      IsDerivedFrom(ToClass, FromClass)) {
     ConvertedType = Context.getMemberPointerType(FromTypePtr->getPointeeType(),
                                                  ToClass.getTypePtr());
     return true;
index 954fd6508589e19a42a9e34a03d596700d4ed92c..20b62c1e537eb6e7216ab3f4c6f4012886ece803 100644 (file)
@@ -55,11 +55,13 @@ namespace PR8801 {
   template<typename T>
   void foo() {
     class X;
-    int (X::*pmf)(T) = 0;
+    typedef int (X::*pmf_type)();
     class X : public T { };
+    
+    pmf_type pmf = &T::foo;
   }
 
-  struct Y { };
+  struct Y { int foo(); };
 
   template void foo<Y>();
 }