summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
authorEli Friedman <eli.friedman@gmail.com>2009-11-16 05:16:40 +0000
committerEli Friedman <eli.friedman@gmail.com>2009-11-16 05:16:40 +0000
commit011c4c341bd7c3ecded6b113d47058b072747e96 (patch)
tree80394e392dcb98d53aa4cb6d3e8176d9a2d86367 /clang
parent794d4d812799c6db4d9ae2a1cc93b43d2815114b (diff)
downloadbcm5719-llvm-011c4c341bd7c3ecded6b113d47058b072747e96.tar.gz
bcm5719-llvm-011c4c341bd7c3ecded6b113d47058b072747e96.zip
Implement two-argument form of delete operator.
llvm-svn: 88890
Diffstat (limited to 'clang')
-rw-r--r--clang/lib/CodeGen/CGCXXExpr.cpp8
-rw-r--r--clang/test/CodeGenCXX/delete-two-arg.cpp6
2 files changed, 14 insertions, 0 deletions
diff --git a/clang/lib/CodeGen/CGCXXExpr.cpp b/clang/lib/CodeGen/CGCXXExpr.cpp
index 3fbd2b242ab..9fb1059e881 100644
--- a/clang/lib/CodeGen/CGCXXExpr.cpp
+++ b/clang/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/clang/test/CodeGenCXX/delete-two-arg.cpp b/clang/test/CodeGenCXX/delete-two-arg.cpp
new file mode 100644
index 00000000000..57e86c9f624
--- /dev/null
+++ b/clang/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)
OpenPOWER on IntegriCloud