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