1/// From sanitizer_common/TestCases/Linux/new_delete_test.cpp
2// RUN: %clangxx_nsan -fno-sized-deallocation -O0 %s -o %t && %run %t
3// RUN: %clangxx_nsan -fsized-deallocation -O0 %s -o %t && %run %t
4
5#include <cstddef>
6
7namespace std {
8struct nothrow_t {};
9static const nothrow_t nothrow;
10enum class align_val_t : size_t {};
11} // namespace std
12
13void *operator new(size_t);
14void *operator new[](size_t);
15void *operator new(size_t, std::nothrow_t const &);
16void *operator new[](size_t, std::nothrow_t const &);
17void *operator new(size_t, std::align_val_t);
18void *operator new[](size_t, std::align_val_t);
19void *operator new(size_t, std::align_val_t, std::nothrow_t const &);
20void *operator new[](size_t, std::align_val_t, std::nothrow_t const &);
21
22void operator delete(void *) throw();
23void operator delete[](void *) throw();
24void operator delete(void *, std::nothrow_t const &);
25void operator delete[](void *, std::nothrow_t const &);
26void operator delete(void *, size_t) throw();
27void operator delete[](void *, size_t) throw();
28void operator delete(void *, std::align_val_t) throw();
29void operator delete[](void *, std::align_val_t) throw();
30void operator delete(void *, std::align_val_t, std::nothrow_t const &);
31void operator delete[](void *, std::align_val_t, std::nothrow_t const &);
32void operator delete(void *, size_t, std::align_val_t) throw();
33void operator delete[](void *, size_t, std::align_val_t) throw();
34
35template <typename T> inline T *break_optimization(T *arg) {
36 __asm__ __volatile__("" : : "r"(arg) : "memory");
37 return arg;
38}
39
40struct S12 {
41 int a, b, c;
42};
43struct alignas(128) S12_128 {
44 int a, b, c;
45};
46struct alignas(256) S12_256 {
47 int a, b, c;
48};
49struct alignas(512) S1024_512 {
50 char a[1024];
51};
52struct alignas(1024) S1024_1024 {
53 char a[1024];
54};
55
56int main(int argc, char **argv) {
57 delete break_optimization(arg: new S12);
58 operator delete(break_optimization(arg: new S12), std::nothrow);
59 delete[] break_optimization(arg: new S12[100]);
60 operator delete[](break_optimization(arg: new S12[100]), std::nothrow);
61
62 delete break_optimization(arg: new S12_128);
63 operator delete(break_optimization(arg: new S12_128),
64 std::align_val_t(alignof(S12_128)));
65 operator delete(break_optimization(arg: new S12_128),
66 std::align_val_t(alignof(S12_128)), std::nothrow);
67 operator delete(break_optimization(arg: new S12_128), sizeof(S12_128),
68 std::align_val_t(alignof(S12_128)));
69
70 delete[] break_optimization(arg: new S12_128[100]);
71 operator delete[](break_optimization(arg: new S12_128[100]),
72 std::align_val_t(alignof(S12_128)));
73 operator delete[](break_optimization(arg: new S12_128[100]),
74 std::align_val_t(alignof(S12_128)), std::nothrow);
75 operator delete[](break_optimization(arg: new S12_128[100]), sizeof(S12_128[100]),
76 std::align_val_t(alignof(S12_128)));
77}
78

source code of compiler-rt/test/nsan/new_delete_test.cpp