]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - test/std/language.support/support.dynamic/new.delete/new.delete.single/sized_delete14.pass.cpp
Vendor import of libc++ trunk r351319 (just before the release_80
[FreeBSD/FreeBSD.git] / test / std / language.support / support.dynamic / new.delete / new.delete.single / sized_delete14.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 // test sized operator delete replacement.
11
12 // UNSUPPORTED: sanitizer-new-delete, c++98, c++03, c++11
13
14 // NOTE: Clang does not enable sized-deallocation in C++14 and beyond by
15 // default. It is only enabled when -fsized-deallocation is given.
16 // (except clang-3.6 which temporarily enabled sized-deallocation)
17 // UNSUPPORTED: clang, apple-clang
18
19 // NOTE: GCC 4.9.1 does not support sized-deallocation in C++14. However
20 // GCC 5.1 does.
21 // XFAIL: gcc-4.7, gcc-4.8, gcc-4.9
22
23 #include <new>
24 #include <cstddef>
25 #include <cstdlib>
26 #include <cassert>
27
28 #include "test_macros.h"
29
30 int unsized_delete_called = 0;
31 int unsized_delete_nothrow_called = 0;
32 int sized_delete_called = 0;
33
34 void operator delete(void* p) TEST_NOEXCEPT
35 {
36     ++unsized_delete_called;
37     std::free(p);
38 }
39
40 void operator delete(void* p, const std::nothrow_t&) TEST_NOEXCEPT
41 {
42     ++unsized_delete_nothrow_called;
43     std::free(p);
44 }
45
46 void operator delete(void* p, std::size_t) TEST_NOEXCEPT
47 {
48     ++sized_delete_called;
49     std::free(p);
50 }
51
52 int main()
53 {
54     int *x = new int(42);
55     DoNotOptimize(x);
56     assert(0 == unsized_delete_called);
57     assert(0 == unsized_delete_nothrow_called);
58     assert(0 == sized_delete_called);
59
60     delete x;
61     DoNotOptimize(x);
62     assert(0 == unsized_delete_called);
63     assert(1 == sized_delete_called);
64     assert(0 == unsized_delete_nothrow_called);
65 }