Home | History | Annotate | Download | only in new.delete.array
      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 aligned operator delete replacement.
     11 
     12 // UNSUPPORTED: sanitizer-new-delete, c++98, c++03, c++11, c++14
     13 
     14 // Older Clang versions do not support this
     15 // XFAIL: clang-3, apple-clang-7, apple-clang-8
     16 
     17 // None of the current GCC compilers support this.
     18 // XFAIL: gcc-5, gcc-6
     19 
     20 // XFAIL: with_system_cxx_lib=macosx10.12
     21 // XFAIL: with_system_cxx_lib=macosx10.11
     22 // XFAIL: with_system_cxx_lib=macosx10.10
     23 // XFAIL: with_system_cxx_lib=macosx10.9
     24 // XFAIL: with_system_cxx_lib=macosx10.7
     25 // XFAIL: with_system_cxx_lib=macosx10.8
     26 
     27 // On Windows libc++ doesn't provide its own definitions for new/delete
     28 // but instead depends on the ones in VCRuntime. However VCRuntime does not
     29 // yet provide aligned new/delete definitions so this test fails to compile/link.
     30 // XFAIL: LIBCXX-WINDOWS-FIXME
     31 
     32 #include <new>
     33 #include <cstddef>
     34 #include <cstdlib>
     35 #include <cassert>
     36 
     37 #include "test_macros.h"
     38 
     39 constexpr auto OverAligned = alignof(std::max_align_t) * 2;
     40 
     41 int unsized_delete_called = 0;
     42 int unsized_delete_nothrow_called = 0;
     43 int aligned_delete_called = 0;
     44 
     45 void reset() {
     46     unsized_delete_called = 0;
     47     unsized_delete_nothrow_called = 0;
     48     aligned_delete_called = 0;
     49 }
     50 
     51 void operator delete(void* p) TEST_NOEXCEPT
     52 {
     53     ++unsized_delete_called;
     54     std::free(p);
     55 }
     56 
     57 void operator delete(void* p, const std::nothrow_t&) TEST_NOEXCEPT
     58 {
     59     ++unsized_delete_nothrow_called;
     60     std::free(p);
     61 }
     62 
     63 void operator delete [] (void* p, std::align_val_t) TEST_NOEXCEPT
     64 {
     65     ++aligned_delete_called;
     66     std::free(p);
     67 }
     68 
     69 struct alignas(OverAligned) A {};
     70 struct alignas(std::max_align_t) B {};
     71 
     72 B* volatile b; // Escape the memory
     73 A* volatile a;
     74 
     75 int main()
     76 {
     77     reset();
     78     {
     79         b = new B[2];
     80         assert(0 == unsized_delete_called);
     81         assert(0 == unsized_delete_nothrow_called);
     82         assert(0 == aligned_delete_called);
     83 
     84         delete [] b;
     85         assert(1 == unsized_delete_called);
     86         assert(0 == unsized_delete_nothrow_called);
     87         assert(0 == aligned_delete_called);
     88     }
     89     reset();
     90     {
     91         a = new A[2];
     92         assert(0 == unsized_delete_called);
     93         assert(0 == unsized_delete_nothrow_called);
     94         assert(0 == aligned_delete_called);
     95 
     96         delete [] a;
     97         assert(0 == unsized_delete_called);
     98         assert(0 == unsized_delete_nothrow_called);
     99         assert(1 == aligned_delete_called);
    100     }
    101 }
    102