mirror of
https://github.com/llvm-mirror/libcxx.git
synced 2025-10-22 16:37:40 +08:00
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:
@@ -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);
|
||||||
|
@@ -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);
|
||||||
|
@@ -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);
|
||||||
|
@@ -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);
|
||||||
|
@@ -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);
|
||||||
|
@@ -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);
|
||||||
|
|
||||||
|
@@ -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);
|
||||||
|
Reference in New Issue
Block a user