diff options
author | Anders Carlsson <andersca@mac.com> | 2009-11-15 23:03:25 +0000 |
---|---|---|
committer | Anders Carlsson <andersca@mac.com> | 2009-11-15 23:03:25 +0000 |
commit | bc0d83b86646faaf411cb40a3aacbc5dbe3e9bd0 (patch) | |
tree | 8464ebf096ff0e63f2a65e019a4330eab4498a77 /lib/CodeGen/CGCXX.cpp | |
parent | 6d7013940a37f03fd324ef438ff984a5369013b0 (diff) |
When generating the deleting ctor, emit a call to delete.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@88878 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/CGCXX.cpp')
-rw-r--r-- | lib/CodeGen/CGCXX.cpp | 28 |
1 files changed, 24 insertions, 4 deletions
diff --git a/lib/CodeGen/CGCXX.cpp b/lib/CodeGen/CGCXX.cpp index a8261a5585..5a0cb1621b 100644 --- a/lib/CodeGen/CGCXX.cpp +++ b/lib/CodeGen/CGCXX.cpp @@ -1712,16 +1712,36 @@ void CodeGenFunction::EmitDtorEpilogue(const CXXDestructorDecl *DD, continue; DestructedBases.push_back(BaseClassDecl); } - if (DestructedBases.empty()) - return; - for (int i = DestructedBases.size() -1; i >= 0; --i) { - CXXRecordDecl *BaseClassDecl = DestructedBases[i]; + + for (int i = DestructedBases.size(); i > 0; --i) { + CXXRecordDecl *BaseClassDecl = DestructedBases[i - 1]; llvm::Value *V = GetAddressCXXOfBaseClass(LoadCXXThis(), ClassDecl,BaseClassDecl, /*NullCheckValue=*/false); EmitCXXDestructorCall(BaseClassDecl->getDestructor(getContext()), Dtor_Complete, V); } + + if (DtorType == Dtor_Deleting) { + const FunctionDecl *DeleteFD = DD->getOperatorDelete(); + assert(DeleteFD && "deleting dtor did not have a delete operator!"); + + const FunctionProtoType *DeleteFTy = + DeleteFD->getType()->getAs<FunctionProtoType>(); + + CallArgList DeleteArgs; + + QualType ArgTy = DeleteFTy->getArgType(0); + llvm::Value *DeletePtr = Builder.CreateBitCast(LoadCXXThis(), + ConvertType(ArgTy)); + DeleteArgs.push_back(std::make_pair(RValue::get(DeletePtr), ArgTy)); + + // Emit the call to delete. + EmitCall(CGM.getTypes().getFunctionInfo(DeleteFTy->getResultType(), + DeleteArgs), + CGM.GetAddrOfFunction(DeleteFD), + DeleteArgs, DeleteFD); + } } void CodeGenFunction::SynthesizeDefaultDestructor(const CXXDestructorDecl *Dtor, |