]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - test/std/language.support/support.dynamic/new.delete/new.delete.array/new_align_val_t_replace.pass.cpp
Vendor import of libc++ trunk r290819:
[FreeBSD/FreeBSD.git] / test / std / language.support / support.dynamic / new.delete / new.delete.array / new_align_val_t_replace.pass.cpp
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 // UNSUPPORTED: c++98, c++03, c++11, c++14
11 // UNSUPPORTED: sanitizer-new-delete
12
13 // XFAIL: no-aligned-allocation
14
15 // test operator new replacement
16
17 #include <new>
18 #include <cstddef>
19 #include <cstdlib>
20 #include <cstdint>
21 #include <cassert>
22 #include <limits>
23
24 #include "test_macros.h"
25
26 constexpr auto OverAligned = alignof(std::max_align_t) * 2;
27
28 int A_constructed = 0;
29
30 struct alignas(OverAligned) A {
31     A() { ++A_constructed;}
32     ~A() { --A_constructed;}
33 };
34
35
36 int B_constructed = 0;
37
38 struct alignas(std::max_align_t) B
39 {
40     std::max_align_t member;
41     B() { ++B_constructed;}
42     ~B() { --B_constructed;}
43 };
44
45 int new_called = 0;
46
47 alignas(OverAligned) char DummyData[OverAligned * 4];
48
49 void* operator new[](std::size_t s, std::align_val_t a) TEST_THROW_SPEC(std::bad_alloc)
50 {
51     assert(new_called == 0); // We already allocated
52     assert(s <= sizeof(DummyData));
53     assert(static_cast<std::size_t>(a) == OverAligned);
54     ++new_called;
55     return DummyData;
56 }
57
58 void  operator delete[](void* p, std::align_val_t) TEST_NOEXCEPT
59 {
60     assert(new_called == 1);
61     --new_called;
62     assert(p == DummyData);
63 }
64
65
66 int main()
67 {
68     {
69         A* ap = new A[3];
70         assert(ap);
71         assert(A_constructed == 3);
72         assert(new_called);
73         delete [] ap;
74         assert(!A_constructed);
75         assert(!new_called);
76     }
77     {
78         B* bp = new B[3];
79         assert(bp);
80         assert(B_constructed == 3);
81         assert(!new_called);
82         delete [] bp;
83         assert(!new_called);
84     }
85 }