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 | d787204e6deba24755a84379fe4187afa0ebc053 (patch) | |
tree | 2c8f002b1e16c4c7ffddadf8e6c9569c5c263d36 /clang/lib/CodeGen/CGCXX.cpp | |
parent | 2a50e95da436e452ec1e176ee8676cf82905499b (diff) | |
download | bcm5719-llvm-d787204e6deba24755a84379fe4187afa0ebc053.tar.gz bcm5719-llvm-d787204e6deba24755a84379fe4187afa0ebc053.zip |
When generating the deleting ctor, emit a call to delete.
llvm-svn: 88878
Diffstat (limited to 'clang/lib/CodeGen/CGCXX.cpp')
-rw-r--r-- | clang/lib/CodeGen/CGCXX.cpp | 28 |
1 files changed, 24 insertions, 4 deletions
diff --git a/clang/lib/CodeGen/CGCXX.cpp b/clang/lib/CodeGen/CGCXX.cpp index a8261a5585a..5a0cb1621b8 100644 --- a/clang/lib/CodeGen/CGCXX.cpp +++ b/clang/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, |