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