1//===----------------------------------------------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9// test sized operator delete replacement.
10
11// Note that sized delete operator definitions below are simply ignored
12// when sized deallocation is not supported, e.g., prior to C++14.
13
14// REQUIRES: c++03 || c++11
15// UNSUPPORTED: sanitizer-new-delete
16
17#include <new>
18#include <cstddef>
19#include <cstdlib>
20#include <cassert>
21
22#include "test_macros.h"
23
24int unsized_delete_called = 0;
25int unsized_delete_nothrow_called = 0;
26int sized_delete_called = 0;
27
28void operator delete(void* p) TEST_NOEXCEPT
29{
30 ++unsized_delete_called;
31 std::free(p);
32}
33
34void operator delete(void* p, const std::nothrow_t&) TEST_NOEXCEPT
35{
36 ++unsized_delete_nothrow_called;
37 std::free(p);
38}
39
40void operator delete(void* p, std::size_t) TEST_NOEXCEPT
41{
42 ++sized_delete_called;
43 std::free(p);
44}
45
46int main(int, char**)
47{
48 int *x = new int(42);
49 DoNotOptimize(x);
50 assert(0 == unsized_delete_called);
51 assert(0 == unsized_delete_nothrow_called);
52 assert(0 == sized_delete_called);
53
54 delete x;
55 DoNotOptimize(x);
56 assert(1 == unsized_delete_called);
57 assert(0 == sized_delete_called);
58 assert(0 == unsized_delete_nothrow_called);
59
60 return 0;
61}
62

source code of libcxx/test/std/language.support/support.dynamic/new.delete/new.delete.single/sized_delete11.pass.cpp