diff options
author | Eli Friedman <eli.friedman@gmail.com> | 2009-11-16 05:16:40 +0000 |
---|---|---|
committer | Eli Friedman <eli.friedman@gmail.com> | 2009-11-16 05:16:40 +0000 |
commit | eaea8c4c23b6892c82640c6f67034d9ed4498d45 (patch) | |
tree | 4c4c9042f8f06efe71f7703bdbf8328cfa3b4844 | |
parent | 5e6214b4c7b326a83fbcf55250a95b46bdc0bb8f (diff) |
Implement two-argument form of delete operator.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@88890 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/CodeGen/CGCXXExpr.cpp | 8 | ||||
-rw-r--r-- | test/CodeGenCXX/delete-two-arg.cpp | 6 |
2 files changed, 14 insertions, 0 deletions
diff --git a/lib/CodeGen/CGCXXExpr.cpp b/lib/CodeGen/CGCXXExpr.cpp index 3fbd2b242a..9fb1059e88 100644 --- a/lib/CodeGen/CGCXXExpr.cpp +++ b/lib/CodeGen/CGCXXExpr.cpp @@ -325,6 +325,14 @@ void CodeGenFunction::EmitCXXDeleteExpr(const CXXDeleteExpr *E) { llvm::Value *DeletePtr = Builder.CreateBitCast(Ptr, ConvertType(ArgTy)); DeleteArgs.push_back(std::make_pair(RValue::get(DeletePtr), ArgTy)); + if (DeleteFTy->getNumArgs() == 2) { + QualType SizeTy = DeleteFTy->getArgType(1); + uint64_t SizeVal = getContext().getTypeSize(DeleteTy) / 8; + llvm::Constant *Size = llvm::ConstantInt::get(ConvertType(SizeTy), + SizeVal); + DeleteArgs.push_back(std::make_pair(RValue::get(Size), SizeTy)); + } + // Emit the call to delete. EmitCall(CGM.getTypes().getFunctionInfo(DeleteFTy->getResultType(), DeleteArgs), diff --git a/test/CodeGenCXX/delete-two-arg.cpp b/test/CodeGenCXX/delete-two-arg.cpp new file mode 100644 index 0000000000..57e86c9f62 --- /dev/null +++ b/test/CodeGenCXX/delete-two-arg.cpp @@ -0,0 +1,6 @@ +// RUN: clang-cc %s -o - -emit-llvm -verify | FileCheck %s + +struct A { void operator delete(void*,__typeof(sizeof(int))); int x; }; +void a(A* x) { delete x; } + +// CHECK: call void @_ZN1AdlEPvj(i8* %0, i32 4) |