From 97c7eda14a38605f727787cd991b0fe1771d217e Mon Sep 17 00:00:00 2001 From: Anders Carlsson Date: Sat, 12 Sep 2009 00:00:29 +0000 Subject: Fix a crash when generating vtables that contain destructors. llvm-svn: 81587 --- clang/lib/CodeGen/CGCXX.cpp | 9 ++++----- clang/test/CodeGenCXX/vtable-cast-crash.cpp | 21 +++++++++++++++++++++ 2 files changed, 25 insertions(+), 5 deletions(-) create mode 100644 clang/test/CodeGenCXX/vtable-cast-crash.cpp (limited to 'clang') 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(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() +{ +} + -- cgit v1.2.3