]> granicus.if.org Git - clang/commitdiff
Implement two-argument form of delete operator.
authorEli Friedman <eli.friedman@gmail.com>
Mon, 16 Nov 2009 05:16:40 +0000 (05:16 +0000)
committerEli Friedman <eli.friedman@gmail.com>
Mon, 16 Nov 2009 05:16:40 +0000 (05:16 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@88890 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGCXXExpr.cpp
test/CodeGenCXX/delete-two-arg.cpp [new file with mode: 0644]

index 3fbd2b242abcf8b2a74361c1d0a2db173ccc5734..9fb1059e8813d1c5aab841a410cfbbf00bdd90f7 100644 (file)
@@ -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 (file)
index 0000000..57e86c9
--- /dev/null
@@ -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)