summaryrefslogtreecommitdiffstats
path: root/clang/lib/CodeGen/CGCXX.cpp
diff options
context:
space:
mode:
authorFariborz Jahanian <fjahanian@apple.com>2009-11-13 22:29:45 +0000
committerFariborz Jahanian <fjahanian@apple.com>2009-11-13 22:29:45 +0000
commitebea00581283314330a709a08b333e8a092ceb5a (patch)
treebe18593c20b74801ebb2eedfd35989f633806d34 /clang/lib/CodeGen/CGCXX.cpp
parent6e9901494788dffd7e300dec5c3fbbd756d738c0 (diff)
downloadbcm5719-llvm-ebea00581283314330a709a08b333e8a092ceb5a.tar.gz
bcm5719-llvm-ebea00581283314330a709a08b333e8a092ceb5a.zip
Code gen. For virtual destructor call on array objects
(still part of pr5472). llvm-svn: 88712
Diffstat (limited to 'clang/lib/CodeGen/CGCXX.cpp')
-rw-r--r--clang/lib/CodeGen/CGCXX.cpp11
1 files changed, 10 insertions, 1 deletions
diff --git a/clang/lib/CodeGen/CGCXX.cpp b/clang/lib/CodeGen/CGCXX.cpp
index c23ad597649..bcb0b5c5c3b 100644
--- a/clang/lib/CodeGen/CGCXX.cpp
+++ b/clang/lib/CodeGen/CGCXX.cpp
@@ -567,7 +567,16 @@ CodeGenFunction::EmitCXXAggrDestructorCall(const CXXDestructorDecl *D,
Counter = Builder.CreateLoad(IndexPtr);
Counter = Builder.CreateSub(Counter, One);
llvm::Value *Address = Builder.CreateInBoundsGEP(This, Counter, "arrayidx");
- EmitCXXDestructorCall(D, Dtor_Complete, Address);
+ if (D->isVirtual()) {
+ const llvm::Type *Ty =
+ CGM.getTypes().GetFunctionType(CGM.getTypes().getFunctionInfo(D),
+ /*isVariadic=*/false);
+
+ llvm::Value *Callee = BuildVirtualCall(D, Dtor_Deleting, Address, Ty);
+ EmitCXXMemberCall(D, Callee, Address, 0, 0);
+ }
+ else
+ EmitCXXDestructorCall(D, Dtor_Complete, Address);
EmitBlock(ContinueBlock);
OpenPOWER on IntegriCloud