diff options
| author | Anders Carlsson <andersca@mac.com> | 2009-09-12 00:00:29 +0000 |
|---|---|---|
| committer | Anders Carlsson <andersca@mac.com> | 2009-09-12 00:00:29 +0000 |
| commit | 97c7eda14a38605f727787cd991b0fe1771d217e (patch) | |
| tree | 0d879146b44517aea69fe607f1db90ab07cb5bb8 /clang | |
| parent | 80f6ac5a4f1625cdc1d8a79d32bdcf2322f916b3 (diff) | |
| download | bcm5719-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.cpp | 9 | ||||
| -rw-r--r-- | clang/test/CodeGenCXX/vtable-cast-crash.cpp | 21 |
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() +{ +} + |

