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 // 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 *volatile x;
     53 
     54 int main()
     55 {
     56     x = new int(42);
     57     assert(0 == unsized_delete_called);
     58     assert(0 == unsized_delete_nothrow_called);
     59     assert(0 == sized_delete_called);
     60 
     61     delete x;
     62     assert(0 == unsized_delete_called);
     63     assert(1 == sized_delete_called);
     64     assert(0 == unsized_delete_nothrow_called);
     65 }
     66