diff options
author | Richard Smith <richard-llvm@metafoo.co.uk> | 2013-12-05 08:30:59 +0000 |
---|---|---|
committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2013-12-05 08:30:59 +0000 |
commit | 8e674ff884113429b53d23b18409caf67aaec1b7 (patch) | |
tree | b719d50f7c584a2e1b142c15e48099af098fd5cd /test/CodeGenCXX/cxx1y-sized-deallocation.cpp | |
parent | 159fac64319694a9ba2105ffe3a5327ed5a26601 (diff) |
PR17983: Fix crasher bug in C++1y mode when performing a non-global array
delete on a class which has no array cookie and has no class-specific operator
new.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@196488 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/CodeGenCXX/cxx1y-sized-deallocation.cpp')
-rw-r--r-- | test/CodeGenCXX/cxx1y-sized-deallocation.cpp | 36 |
1 files changed, 28 insertions, 8 deletions
diff --git a/test/CodeGenCXX/cxx1y-sized-deallocation.cpp b/test/CodeGenCXX/cxx1y-sized-deallocation.cpp index 642e1e07f6..7fd3ece3e0 100644 --- a/test/CodeGenCXX/cxx1y-sized-deallocation.cpp +++ b/test/CodeGenCXX/cxx1y-sized-deallocation.cpp @@ -30,6 +30,8 @@ template<typename T> void del() { ::delete get<T*>(); ::delete[] get<T*>(); + delete get<T*>(); + delete[] get<T*>(); } template void del<A>(); @@ -44,6 +46,9 @@ D::D() {} // CHECK-LABEL: define weak_odr void @_Z3delIiEvv() // CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 4) // CHECK: call void @_ZdaPv(i8* %{{[^ ]*}}) +// +// CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 4) +// CHECK: call void @_ZdaPv(i8* %{{[^ ]*}}) // CHECK-LABEL: define linkonce void @_ZdlPvm(i8* // CHECK: call void @_ZdlPv(i8* %0) @@ -51,12 +56,20 @@ D::D() {} // CHECK-LABEL: define weak_odr void @_Z3delI1BEvv() // CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 4) // CHECK: call void @_ZdaPv(i8* %{{[^ ]*}}) +// +// CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 4) +// CHECK: call void @_ZdaPv(i8* %{{[^ ]*}}) // CHECK-LABEL: define weak_odr void @_Z3delI1CEvv() // CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 1) // CHECK: mul i64 1, %{{[^ ]*}} // CHECK: add i64 %{{[^ ]*}}, 8 // CHECK: call void @_ZdaPvm(i8* %{{[^ ]*}}, i64 %{{[^ ]*}}) +// +// CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 1) +// CHECK: mul i64 1, %{{[^ ]*}} +// CHECK: add i64 %{{[^ ]*}}, 8 +// CHECK: call void @_ZdaPvm(i8* %{{[^ ]*}}, i64 %{{[^ ]*}}) // CHECK-LABEL: define linkonce void @_ZdaPvm(i8* // CHECK: call void @_ZdaPv(i8* %0) @@ -66,25 +79,32 @@ D::D() {} // CHECK: mul i64 8, %{{[^ ]*}} // CHECK: add i64 %{{[^ ]*}}, 8 // CHECK: call void @_ZdaPvm(i8* %{{[^ ]*}}, i64 %{{[^ ]*}}) +// +// CHECK-NOT: Zdl +// CHECK: call void %{{.*}} +// CHECK-NOT: Zdl +// CHECK: mul i64 8, %{{[^ ]*}} +// CHECK: add i64 %{{[^ ]*}}, 8 +// CHECK: call void @_ZdaPvm(i8* %{{[^ ]*}}, i64 %{{[^ ]*}}) // CHECK-LABEL: define weak_odr void @_Z3delI1EEvv() // CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 1) // CHECK: call void @_ZdaPv(i8* %{{[^ ]*}}) +// +// CHECK: call void @_ZN1EdlEPv(i8* %{{[^ ]*}}) +// CHECK: call void @_ZN1EdaEPv(i8* %{{[^ ]*}}) // CHECK-LABEL: define weak_odr void @_Z3delI1FEvv() // CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 1) // CHECK: mul i64 1, %{{[^ ]*}} // CHECK: add i64 %{{[^ ]*}}, 8 // CHECK: call void @_ZdaPvm(i8* %{{[^ ]*}}, i64 %{{[^ ]*}}) +// +// CHECK: call void @_ZN1FdlEPvm(i8* %{{[^ ]*}}, i64 1) +// CHECK: mul i64 1, %{{[^ ]*}} +// CHECK: add i64 %{{[^ ]*}}, 8 +// CHECK: call void @_ZN1FdaEPvm(i8* %{{[^ ]*}}, i64 %{{[^ ]*}}) -// CHECK-LABEL: define void @_Z10member_delv() -// CHECK-NOT: Zdl -// CHECK: call void %{{[^ ]*}}(%{{[^ ]*}}* % -// CHECK-NOT: Zdl -// CHECK: } -void member_del() { - delete get<D*>(); -} // CHECK-LABEL: define linkonce_odr void @_ZN1DD0Ev(%{{[^ ]*}}* %this) // CHECK: call void @_ZdlPvm(i8* %{{[^ ]*}}, i64 8) |