]> granicus.if.org Git - clang/commitdiff
[MS ABI] Workaround corner-case bug in the ABI for operator delete
authorDavid Majnemer <david.majnemer@gmail.com>
Tue, 30 Jun 2015 03:30:26 +0000 (03:30 +0000)
committerDavid Majnemer <david.majnemer@gmail.com>
Tue, 30 Jun 2015 03:30:26 +0000 (03:30 +0000)
MSVC only genreates array cookies if the class has a destructor.  This
is problematic when having to call T::operator delete[](void *, size_t)
because the second argument's argument is impossible to synthesize
correctly if the class has no destructor (because there will be no array
cookie).

Instead, MSVC passes the size of the class.  Do the same, for
compatibility, instead of crashing.

This fixes PR23990.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@241038 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGExprCXX.cpp
test/CodeGenCXX/microsoft-abi-array-cookies.cpp

index f0f706d7b957dcd26654005adfada4fadef6caf6..c7adccaeeaeaf2bf1e8a44cd53221fb32ab3a053 100644 (file)
@@ -1548,7 +1548,8 @@ namespace {
         // The size of an element, multiplied by the number of elements.
         llvm::Value *Size
           = llvm::ConstantInt::get(SizeTy, ElementTypeSize.getQuantity());
-        Size = CGF.Builder.CreateMul(Size, NumElements);
+        if (NumElements)
+          Size = CGF.Builder.CreateMul(Size, NumElements);
 
         // Plus the size of the cookie if applicable.
         if (!CookieSize.isZero()) {
index 619b1b8a94893b89964fa1501bd883a211b77a31..62ead4fb69d3c5082c234ce578abc4c2a706b937 100644 (file)
@@ -58,4 +58,14 @@ void check_array_cookies_aligned() {
 // CHECK: getelementptr inbounds i8, i8* [[ARRAY_AS_CHAR]], i64 -8
 }
 
+namespace PR23990 {
+struct S {
+  char x[42];
+  void operator delete[](void *p, __SIZE_TYPE__);
+  // CHECK-LABEL: define void @"\01?delete_s@PR23990@@YAXPAUS@1@@Z"(
+  // CHECK: call void @"\01??_VS@PR23990@@SAXPAXI@Z"(i8* {{.*}}, i32 42)
+};
+void delete_s(S *s) { delete[] s; }
+}
+
 // CHECK: attributes [[NUW]] = { nounwind{{.*}} }