Prevent new/delete replacement tests from being optimized away.

git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@284289 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Eric Fiselier
2016-10-14 22:47:08 +00:00
parent e630058e90
commit 9ffd1d56b4
7 changed files with 31 additions and 37 deletions

View File

@@ -15,10 +15,7 @@
// XFAIL: clang-3, apple-clang // XFAIL: clang-3, apple-clang
// None of the current GCC compilers support this. // None of the current GCC compilers support this.
// XFAIL: gcc-4, gcc-5, gcc-6 // XFAIL: gcc
// TODO Investigate why UBSAN prevents new from calling our replacement.
// XFAIL: ubsan
#include <new> #include <new>
#include <cstddef> #include <cstddef>
@@ -58,28 +55,31 @@ void operator delete [] (void* p, std::align_val_t a) throw()
struct alignas(OverAligned) A {}; struct alignas(OverAligned) A {};
struct alignas(std::max_align_t) B {}; struct alignas(std::max_align_t) B {};
B* volatile b; // Escape the memory
A* volatile a;
int main() int main()
{ {
reset(); reset();
{ {
B *x = new B[2]; b = new B[2];
assert(0 == unsized_delete_called); assert(0 == unsized_delete_called);
assert(0 == unsized_delete_nothrow_called); assert(0 == unsized_delete_nothrow_called);
assert(0 == aligned_delete_called); assert(0 == aligned_delete_called);
delete [] x; delete [] b;
assert(1 == unsized_delete_called); assert(1 == unsized_delete_called);
assert(0 == unsized_delete_nothrow_called); assert(0 == unsized_delete_nothrow_called);
assert(0 == aligned_delete_called); assert(0 == aligned_delete_called);
} }
reset(); reset();
{ {
A *x = new A[2]; a = new A[2];
assert(0 == unsized_delete_called); assert(0 == unsized_delete_called);
assert(0 == unsized_delete_nothrow_called); assert(0 == unsized_delete_nothrow_called);
assert(0 == aligned_delete_called); assert(0 == aligned_delete_called);
delete [] x; delete [] a;
assert(0 == unsized_delete_called); assert(0 == unsized_delete_called);
assert(0 == unsized_delete_nothrow_called); assert(0 == unsized_delete_nothrow_called);
assert(1 == aligned_delete_called); assert(1 == aligned_delete_called);

View File

@@ -11,10 +11,6 @@
// UNSUPPORTED: sanitizer-new-delete // UNSUPPORTED: sanitizer-new-delete
// TODO Investigate why UBSAN prevents new from calling our replacement.
// XFAIL: ubsan
#include <new> #include <new>
#include <cstddef> #include <cstddef>
#include <cstdlib> #include <cstdlib>
@@ -45,9 +41,11 @@ struct A
~A() {--A_constructed;} ~A() {--A_constructed;}
}; };
A* volatile ap;
int main() int main()
{ {
A* ap = new (std::nothrow) A[3]; ap = new (std::nothrow) A[3];
assert(ap); assert(ap);
assert(A_constructed == 3); assert(A_constructed == 3);
assert(new_called); assert(new_called);

View File

@@ -11,9 +11,6 @@
// UNSUPPORTED: sanitizer-new-delete // UNSUPPORTED: sanitizer-new-delete
// TODO Investigate why UBSAN prevents new from calling our replacement.
// XFAIL: ubsan
#include <new> #include <new>
#include <cstddef> #include <cstddef>
@@ -45,9 +42,11 @@ struct A
~A() {--A_constructed;} ~A() {--A_constructed;}
}; };
A* volatile ap;
int main() int main()
{ {
A* ap = new A[3]; ap = new A[3];
assert(ap); assert(ap);
assert(A_constructed == 3); assert(A_constructed == 3);
assert(new_called == 1); assert(new_called == 1);

View File

@@ -15,10 +15,8 @@
// XFAIL: clang-3, apple-clang // XFAIL: clang-3, apple-clang
// None of the current GCC compilers support this. // None of the current GCC compilers support this.
// XFAIL: gcc-4, gcc-5, gcc-6 // XFAIL: gcc
// TODO Investigate why UBSAN prevents new from calling our replacement.
// XFAIL: ubsan
#include <new> #include <new>
#include <cstddef> #include <cstddef>
@@ -58,28 +56,31 @@ void operator delete(void* p, std::align_val_t a) throw()
struct alignas(OverAligned) A {}; struct alignas(OverAligned) A {};
struct alignas(std::max_align_t) B {}; struct alignas(std::max_align_t) B {};
B* volatile bp;
A* volatile ap;
int main() int main()
{ {
reset(); reset();
{ {
B *x = new B; bp = new B;
assert(0 == unsized_delete_called); assert(0 == unsized_delete_called);
assert(0 == unsized_delete_nothrow_called); assert(0 == unsized_delete_nothrow_called);
assert(0 == aligned_delete_called); assert(0 == aligned_delete_called);
delete x; delete bp;
assert(1 == unsized_delete_called); assert(1 == unsized_delete_called);
assert(0 == unsized_delete_nothrow_called); assert(0 == unsized_delete_nothrow_called);
assert(0 == aligned_delete_called); assert(0 == aligned_delete_called);
} }
reset(); reset();
{ {
A *x = new A; ap = new A;
assert(0 == unsized_delete_called); assert(0 == unsized_delete_called);
assert(0 == unsized_delete_nothrow_called); assert(0 == unsized_delete_nothrow_called);
assert(0 == aligned_delete_called); assert(0 == aligned_delete_called);
delete x; delete ap;
assert(0 == unsized_delete_called); assert(0 == unsized_delete_called);
assert(0 == unsized_delete_nothrow_called); assert(0 == unsized_delete_nothrow_called);
assert(1 == aligned_delete_called); assert(1 == aligned_delete_called);

View File

@@ -11,9 +11,6 @@
// UNSUPPORTED: sanitizer-new-delete // UNSUPPORTED: sanitizer-new-delete
// TODO Investigate why UBSAN prevents nothrow new from calling our replacement.
// XFAIL: ubsan
#include <new> #include <new>
#include <cstddef> #include <cstddef>
#include <cstdlib> #include <cstdlib>
@@ -44,9 +41,11 @@ struct A
~A() {A_constructed = false;} ~A() {A_constructed = false;}
}; };
A* volatile ap;
int main() int main()
{ {
A* ap = new (std::nothrow) A; ap = new (std::nothrow) A;
assert(ap); assert(ap);
assert(A_constructed); assert(A_constructed);
assert(new_called); assert(new_called);

View File

@@ -13,10 +13,6 @@
// UNSUPPORTED: sanitizer-new-delete // UNSUPPORTED: sanitizer-new-delete
// TODO Investigate why UBSAN prevents new from calling our replacement.
// XFAIL: ubsan
#include <new> #include <new>
#include <cstddef> #include <cstddef>
#include <cstdlib> #include <cstdlib>
@@ -37,9 +33,11 @@ void operator delete(void* p, const std::nothrow_t&) throw()
std::free(p); std::free(p);
} }
int* volatile x;
int main() int main()
{ {
int *x = new int(42); x = new int(42);
assert(0 == delete_called); assert(0 == delete_called);
assert(0 == delete_nothrow_called); assert(0 == delete_nothrow_called);

View File

@@ -14,9 +14,6 @@
// UNSUPPORTED: sanitizer-new-delete // UNSUPPORTED: sanitizer-new-delete
// TODO Investigate why UBSAN prevents new from calling our replacement.
// XFAIL: ubsan
// NOTE: Only clang-3.7 and GCC 5.1 and greater support -fsized-deallocation. // NOTE: Only clang-3.7 and GCC 5.1 and greater support -fsized-deallocation.
// REQUIRES: fsized-deallocation // REQUIRES: fsized-deallocation
@@ -58,9 +55,11 @@ void operator delete(void* p, std::size_t) throw()
std::free(p); std::free(p);
} }
int* volatile x;
int main() int main()
{ {
int *x = new int(42); x = new int(42);
assert(0 == sized_delete_called); assert(0 == sized_delete_called);
assert(0 == unsized_delete_called); assert(0 == unsized_delete_called);
assert(0 == unsized_delete_nothrow_called); assert(0 == unsized_delete_nothrow_called);