]> granicus.if.org Git - clang/commitdiff
[MSVC] Crash fix: assigning of overloaded member function pointer caused assertion
authorAlexey Bataev <a.bataev@hotmail.com>
Mon, 10 Aug 2015 04:07:49 +0000 (04:07 +0000)
committerAlexey Bataev <a.bataev@hotmail.com>
Mon, 10 Aug 2015 04:07:49 +0000 (04:07 +0000)
Original class was not marked with inheritance attribute and it causes a crash on codegen.
Differential Revision: http://reviews.llvm.org/D11828

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

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

index fe16fc2df31abe8387bf0f1e6f67a9d4121fa53a..dea9c22b74b70ff4be7e2fadb3716501d8900fc0 100644 (file)
@@ -1397,6 +1397,8 @@ TryStaticMemberPointerUpcast(Sema &Self, ExprResult &SrcExpr, QualType SrcType,
     msg = diag::err_bad_static_cast_member_pointer_nonmp;
     return TC_NotApplicable;
   }
+  if (Self.Context.getTargetInfo().getCXXABI().isMicrosoft())
+    Self.RequireCompleteType(OpRange.getBegin(), SrcType, 0);
 
   // T == T, modulo cv
   if (!Self.Context.hasSameUnqualifiedType(SrcMemPtr->getPointeeType(),
index a509d57194f2cd52c2c557e2d04db192cc0649eb..27a2a5fc9c16924d0a9de6358b543c82533156ec 100644 (file)
@@ -729,3 +729,20 @@ typedef void (D::*DMemPtrTy)();
 // CHECK: @"\01??_9C@pr23878@@$BA@AE" to i8*), i32 0, i32 4
 DMemPtrTy get_memptr() { return &D::f; }
 }
+
+class C {};
+
+typedef void (C::*f)();
+
+class CA : public C {
+public:
+  void OnHelp(void);
+  int OnHelp(int);
+};
+
+// CHECK-LABEL: foo_fun
+void foo_fun() {
+  // CHECK: store i8* bitcast (void (%class.CA*)* @"\01?OnHelp@CA@@QAEXXZ" to i8*), i8**
+  f func = (f)&CA::OnHelp;
+}
+