1*c27415ffSFangrui Song // RUN: %clangxx -fno-sized-deallocation -O0 %s -o %t && %run %t 2*c27415ffSFangrui Song // RUN: %clangxx -fsized-deallocation -O0 %s -o %t && %run %t 374989affSNico Weber 474989affSNico Weber // ubsan does not intercept new/delete. 574989affSNico Weber // UNSUPPORTED: ubsan 674989affSNico Weber 774989affSNico Weber // Check that all new/delete variants are defined and work with supported 874989affSNico Weber // sanitizers. Sanitizer-specific failure modes tests are supposed to go to 9a1e7e401SKazuaki Ishizaki // the particular sanitizer's test suites. 1074989affSNico Weber 1174989affSNico Weber #include <cstddef> 1274989affSNico Weber 1374989affSNico Weber // Define all new/delete to do not depend on the version provided by the 1474989affSNico Weber // platform. The implementation is provided by the sanitizer anyway. 1574989affSNico Weber 1674989affSNico Weber namespace std { 1774989affSNico Weber struct nothrow_t {}; 1874989affSNico Weber static const nothrow_t nothrow; 1974989affSNico Weber enum class align_val_t : size_t {}; 2074989affSNico Weber } // namespace std 2174989affSNico Weber 2274989affSNico Weber void *operator new(size_t); 2374989affSNico Weber void *operator new[](size_t); 2474989affSNico Weber void *operator new(size_t, std::nothrow_t const&); 2574989affSNico Weber void *operator new[](size_t, std::nothrow_t const&); 2674989affSNico Weber void *operator new(size_t, std::align_val_t); 2774989affSNico Weber void *operator new[](size_t, std::align_val_t); 2874989affSNico Weber void *operator new(size_t, std::align_val_t, std::nothrow_t const&); 2974989affSNico Weber void *operator new[](size_t, std::align_val_t, std::nothrow_t const&); 3074989affSNico Weber 3174989affSNico Weber void operator delete(void*) throw(); 3274989affSNico Weber void operator delete[](void*) throw(); 3374989affSNico Weber void operator delete(void*, std::nothrow_t const&); 3474989affSNico Weber void operator delete[](void*, std::nothrow_t const&); 3574989affSNico Weber void operator delete(void*, size_t) throw(); 3674989affSNico Weber void operator delete[](void*, size_t) throw(); 3774989affSNico Weber void operator delete(void*, std::align_val_t) throw(); 3874989affSNico Weber void operator delete[](void*, std::align_val_t) throw(); 3974989affSNico Weber void operator delete(void*, std::align_val_t, std::nothrow_t const&); 4074989affSNico Weber void operator delete[](void*, std::align_val_t, std::nothrow_t const&); 4174989affSNico Weber void operator delete(void*, size_t, std::align_val_t) throw(); 4274989affSNico Weber void operator delete[](void*, size_t, std::align_val_t) throw(); 4374989affSNico Weber 4474989affSNico Weber 4574989affSNico Weber template<typename T> 4674989affSNico Weber inline T* break_optimization(T *arg) { 4774989affSNico Weber __asm__ __volatile__("" : : "r" (arg) : "memory"); 4874989affSNico Weber return arg; 4974989affSNico Weber } 5074989affSNico Weber 5174989affSNico Weber 5274989affSNico Weber struct S12 { int a, b, c; }; 5374989affSNico Weber struct alignas(128) S12_128 { int a, b, c; }; 5474989affSNico Weber struct alignas(256) S12_256 { int a, b, c; }; 5574989affSNico Weber struct alignas(512) S1024_512 { char a[1024]; }; 5674989affSNico Weber struct alignas(1024) S1024_1024 { char a[1024]; }; 5774989affSNico Weber 5874989affSNico Weber 5974989affSNico Weber int main(int argc, char **argv) { 6074989affSNico Weber delete break_optimization(new S12); 6174989affSNico Weber operator delete(break_optimization(new S12), std::nothrow); 6274989affSNico Weber delete [] break_optimization(new S12[100]); 6374989affSNico Weber operator delete[](break_optimization(new S12[100]), std::nothrow); 6474989affSNico Weber 6574989affSNico Weber delete break_optimization(new S12_128); 6674989affSNico Weber operator delete(break_optimization(new S12_128), 6774989affSNico Weber std::align_val_t(alignof(S12_128))); 6874989affSNico Weber operator delete(break_optimization(new S12_128), 6974989affSNico Weber std::align_val_t(alignof(S12_128)), std::nothrow); 7074989affSNico Weber operator delete(break_optimization(new S12_128), sizeof(S12_128), 7174989affSNico Weber std::align_val_t(alignof(S12_128))); 7274989affSNico Weber 7374989affSNico Weber delete [] break_optimization(new S12_128[100]); 7474989affSNico Weber operator delete[](break_optimization(new S12_128[100]), 7574989affSNico Weber std::align_val_t(alignof(S12_128))); 7674989affSNico Weber operator delete[](break_optimization(new S12_128[100]), 7774989affSNico Weber std::align_val_t(alignof(S12_128)), std::nothrow); 7874989affSNico Weber operator delete[](break_optimization(new S12_128[100]), sizeof(S12_128[100]), 7974989affSNico Weber std::align_val_t(alignof(S12_128))); 8074989affSNico Weber } 81