summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
authorAnders Carlsson <andersca@mac.com>2009-09-12 00:00:29 +0000
committerAnders Carlsson <andersca@mac.com>2009-09-12 00:00:29 +0000
commit97c7eda14a38605f727787cd991b0fe1771d217e (patch)
tree0d879146b44517aea69fe607f1db90ab07cb5bb8 /clang
parent80f6ac5a4f1625cdc1d8a79d32bdcf2322f916b3 (diff)
downloadbcm5719-llvm-97c7eda14a38605f727787cd991b0fe1771d217e.tar.gz
bcm5719-llvm-97c7eda14a38605f727787cd991b0fe1771d217e.zip
Fix a crash when generating vtables that contain destructors.
llvm-svn: 81587
Diffstat (limited to 'clang')
-rw-r--r--clang/lib/CodeGen/CGCXX.cpp9
-rw-r--r--clang/test/CodeGenCXX/vtable-cast-crash.cpp21
2 files changed, 25 insertions, 5 deletions
diff --git a/clang/lib/CodeGen/CGCXX.cpp b/clang/lib/CodeGen/CGCXX.cpp
index 742077f3ff4..7def3c78347 100644
--- a/clang/lib/CodeGen/CGCXX.cpp
+++ b/clang/lib/CodeGen/CGCXX.cpp
@@ -993,20 +993,19 @@ public:
++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/clang/test/CodeGenCXX/vtable-cast-crash.cpp b/clang/test/CodeGenCXX/vtable-cast-crash.cpp
new file mode 100644
index 00000000000..a91d9790fe6
--- /dev/null
+++ b/clang/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()
+{
+}
+
OpenPOWER on IntegriCloud