[MS ABI] Lock-in the derived memptr rep. for base-to-derived conversions
authorDavid Majnemer <david.majnemer@gmail.com>
Fri, 12 Jun 2015 17:55:44 +0000 (17:55 +0000)
committerDavid Majnemer <david.majnemer@gmail.com>
Fri, 12 Jun 2015 17:55:44 +0000 (17:55 +0000)
We would get this right in the case where an explicit cast was formed
but not when we were performing an implicit conversion.

This fixes PR23828.

llvm-svn: 239625

clang/lib/Sema/SemaExprCXX.cpp
clang/test/CodeGenCXX/microsoft-abi-member-pointers.cpp

index ef72097..6c839f3 100644 (file)
@@ -3290,10 +3290,10 @@ Sema::PerformImplicitConversion(Expr *From, QualType ToType,
 
     // We may not have been able to figure out what this member pointer resolved
     // to up until this exact point.  Attempt to lock-in it's inheritance model.
-    QualType FromType = From->getType();
-    if (FromType->isMemberPointerType())
-      if (Context.getTargetInfo().getCXXABI().isMicrosoft())
-        RequireCompleteType(From->getExprLoc(), FromType, 0);
+    if (Context.getTargetInfo().getCXXABI().isMicrosoft()) {
+      RequireCompleteType(From->getExprLoc(), From->getType(), 0);
+      RequireCompleteType(From->getExprLoc(), ToType, 0);
+    }
 
     From = ImpCastExprToType(From, ToType, Kind, VK_RValue, &BasePath, CCK)
              .get();
index c12ceae..cf9da81 100644 (file)
@@ -678,6 +678,17 @@ static_assert(sizeof(int A::*) == 12, "");
 // CHECK-LABEL: define void @"\01?test@pr20007_pragma2@@YAXXZ"
 }
 
+namespace pr23823 {
+struct Base { void Method(); };
+struct Child : Base {};
+void use(void (Child::*const &)());
+void f() { use(&Child::Method); }
+#pragma pointers_to_members(full_generality, virtual_inheritance)
+static_assert(sizeof(int Base::*) == 4, "");
+static_assert(sizeof(int Child::*) == 4, "");
+#pragma pointers_to_members(best_case)
+}
+
 namespace pr19987 {
 template <typename T>
 struct S {