Fix a crash when generating vtables that contain destructors.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@81587 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/CGCXX.cpp b/lib/CodeGen/CGCXX.cpp
index 742077f..7def3c7 100644
--- a/lib/CodeGen/CGCXX.cpp
+++ b/lib/CodeGen/CGCXX.cpp
@@ -993,20 +993,19 @@
            ++mi)
         if (mi->isVirtual()) {
           const CXXMethodDecl *MD = *mi;
-          llvm::Constant *m = wrap(CGM.GetAddrOfFunction(MD, Ptr8Ty));
+          llvm::Constant *m = wrap(CGM.GetAddrOfFunction(MD));
           OverrideMethod(MD, m, MorallyVirtual, Offset);
         }
     }
   }
 
   void AddMethod(const CXXMethodDecl *MD, bool MorallyVirtual, Index_t Offset) {
-    GlobalDecl GD;
+    llvm::Constant *m = 0;
     if (const CXXDestructorDecl *Dtor = dyn_cast<CXXDestructorDecl>(MD))
-      GD = GlobalDecl(Dtor, Dtor_Complete);
+      m = wrap(CGM.GetAddrOfCXXDestructor(Dtor, Dtor_Complete));
     else
-      GD = GlobalDecl(MD);
+      m = wrap(CGM.GetAddrOfFunction(MD));
 
-    llvm::Constant *m = wrap(CGM.GetAddrOfFunction(GD, Ptr8Ty));
     // If we can find a previously allocated slot for this, reuse it.
     if (OverrideMethod(MD, m, MorallyVirtual, Offset))
       return;
diff --git a/test/CodeGenCXX/vtable-cast-crash.cpp b/test/CodeGenCXX/vtable-cast-crash.cpp
new file mode 100644
index 0000000..a91d979
--- /dev/null
+++ b/test/CodeGenCXX/vtable-cast-crash.cpp
@@ -0,0 +1,21 @@
+// RUN: clang-cc -emit-llvm-only %s
+struct A
+{
+A();    
+virtual ~A();
+};
+
+struct B: A
+{
+  B();
+  ~B();
+};
+
+B::B()
+{
+}
+
+B::~B()
+{
+}
+