1 //===----------------------------------------------------------------------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is dual licensed under the MIT and the University of Illinois Open 6 // Source Licenses. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 // test aligned operator delete replacement. 11 12 // UNSUPPORTED: sanitizer-new-delete, c++98, c++03, c++11, c++14 13 14 // Older Clang versions do not support this 15 // XFAIL: clang-3, apple-clang-7, apple-clang-8 16 17 // None of the current GCC compilers support this. 18 // XFAIL: gcc-5, gcc-6 19 20 // XFAIL: with_system_cxx_lib=macosx10.12 21 // XFAIL: with_system_cxx_lib=macosx10.11 22 // XFAIL: with_system_cxx_lib=macosx10.10 23 // XFAIL: with_system_cxx_lib=macosx10.9 24 // XFAIL: with_system_cxx_lib=macosx10.7 25 // XFAIL: with_system_cxx_lib=macosx10.8 26 27 // On Windows libc++ doesn't provide its own definitions for new/delete 28 // but instead depends on the ones in VCRuntime. However VCRuntime does not 29 // yet provide aligned new/delete definitions so this test fails to compile/link. 30 // XFAIL: LIBCXX-WINDOWS-FIXME 31 32 #include <new> 33 #include <cstddef> 34 #include <cstdlib> 35 #include <cassert> 36 37 #include "test_macros.h" 38 39 constexpr auto OverAligned = alignof(std::max_align_t) * 2; 40 41 int unsized_delete_called = 0; 42 int unsized_delete_nothrow_called = 0; 43 int aligned_delete_called = 0; 44 45 void reset() { 46 unsized_delete_called = 0; 47 unsized_delete_nothrow_called = 0; 48 aligned_delete_called = 0; 49 } 50 51 void operator delete(void* p) TEST_NOEXCEPT 52 { 53 ++unsized_delete_called; 54 std::free(p); 55 } 56 57 void operator delete(void* p, const std::nothrow_t&) TEST_NOEXCEPT 58 { 59 ++unsized_delete_nothrow_called; 60 std::free(p); 61 } 62 63 void operator delete [] (void* p, std::align_val_t) TEST_NOEXCEPT 64 { 65 ++aligned_delete_called; 66 std::free(p); 67 } 68 69 struct alignas(OverAligned) A {}; 70 struct alignas(std::max_align_t) B {}; 71 72 B* volatile b; // Escape the memory 73 A* volatile a; 74 75 int main() 76 { 77 reset(); 78 { 79 b = new B[2]; 80 assert(0 == unsized_delete_called); 81 assert(0 == unsized_delete_nothrow_called); 82 assert(0 == aligned_delete_called); 83 84 delete [] b; 85 assert(1 == unsized_delete_called); 86 assert(0 == unsized_delete_nothrow_called); 87 assert(0 == aligned_delete_called); 88 } 89 reset(); 90 { 91 a = new A[2]; 92 assert(0 == unsized_delete_called); 93 assert(0 == unsized_delete_nothrow_called); 94 assert(0 == aligned_delete_called); 95 96 delete [] a; 97 assert(0 == unsized_delete_called); 98 assert(0 == unsized_delete_nothrow_called); 99 assert(1 == aligned_delete_called); 100 } 101 } 102