Home | History | Annotate | Download | only in new.delete.single
      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 // Note that sized delete operator definitions below are simply ignored
     13 // when sized deallocation is not supported, e.g., prior to C++14.
     14 
     15 // UNSUPPORTED: c++14, c++17, c++2a
     16 // UNSUPPORTED: sanitizer-new-delete
     17 
     18 #include <new>
     19 #include <cstddef>
     20 #include <cstdlib>
     21 #include <cassert>
     22 
     23 #include "test_macros.h"
     24 
     25 int unsized_delete_called = 0;
     26 int unsized_delete_nothrow_called = 0;
     27 int sized_delete_called = 0;
     28 
     29 void operator delete(void* p) TEST_NOEXCEPT
     30 {
     31     ++unsized_delete_called;
     32     std::free(p);
     33 }
     34 
     35 void operator delete(void* p, const std::nothrow_t&) TEST_NOEXCEPT
     36 {
     37     ++unsized_delete_nothrow_called;
     38     std::free(p);
     39 }
     40 
     41 void operator delete(void* p, std::size_t) TEST_NOEXCEPT
     42 {
     43     ++sized_delete_called;
     44     std::free(p);
     45 }
     46 
     47 int *volatile x;
     48 
     49 int main()
     50 {
     51     x = new int(42);
     52     assert(0 == unsized_delete_called);
     53     assert(0 == unsized_delete_nothrow_called);
     54     assert(0 == sized_delete_called);
     55 
     56     delete x;
     57     assert(1 == unsized_delete_called);
     58     assert(0 == sized_delete_called);
     59     assert(0 == unsized_delete_nothrow_called);
     60 }
     61