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 16 17// None of the current GCC compilers support this. 18// XFAIL: gcc 19 20 21#include <new> 22#include <cstddef> 23#include <cstdlib> 24#include <cassert> 25 26#include "test_macros.h" 27 28constexpr auto OverAligned = alignof(std::max_align_t) * 2; 29 30int unsized_delete_called = 0; 31int unsized_delete_nothrow_called = 0; 32int aligned_delete_called = 0; 33 34void reset() { 35 unsized_delete_called = 0; 36 unsized_delete_nothrow_called = 0; 37 aligned_delete_called = 0; 38} 39 40void operator delete(void* p) TEST_NOEXCEPT 41{ 42 ++unsized_delete_called; 43 std::free(p); 44} 45 46void operator delete(void* p, const std::nothrow_t&) TEST_NOEXCEPT 47{ 48 ++unsized_delete_nothrow_called; 49 std::free(p); 50} 51 52void operator delete(void* p, std::align_val_t) TEST_NOEXCEPT 53{ 54 ++aligned_delete_called; 55 std::free(p); 56} 57 58struct alignas(OverAligned) A {}; 59struct alignas(std::max_align_t) B {}; 60 61B* volatile bp; 62A* volatile ap; 63 64int main() 65{ 66 reset(); 67 { 68 bp = new B; 69 assert(0 == unsized_delete_called); 70 assert(0 == unsized_delete_nothrow_called); 71 assert(0 == aligned_delete_called); 72 73 delete bp; 74 assert(1 == unsized_delete_called); 75 assert(0 == unsized_delete_nothrow_called); 76 assert(0 == aligned_delete_called); 77 } 78 reset(); 79 { 80 ap = new A; 81 assert(0 == unsized_delete_called); 82 assert(0 == unsized_delete_nothrow_called); 83 assert(0 == aligned_delete_called); 84 85 delete ap; 86 assert(0 == unsized_delete_called); 87 assert(0 == unsized_delete_nothrow_called); 88 assert(1 == aligned_delete_called); 89 } 90} 91