//===----------------------------------------------------------------------===// // // The LLVM Compiler Infrastructure // // This file is dual licensed under the MIT and the University of Illinois Open // Source Licenses. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // UNSUPPORTED: c++98, c++03, c++11, c++14 // asan and msan will not call the new handler. // UNSUPPORTED: sanitizer-new-delete // FIXME change this to XFAIL. // UNSUPPORTED: no-aligned-allocation // XFAIL: with_system_cxx_lib=macosx10.12 // XFAIL: with_system_cxx_lib=macosx10.11 // XFAIL: with_system_cxx_lib=macosx10.10 // XFAIL: with_system_cxx_lib=macosx10.9 // XFAIL: with_system_cxx_lib=macosx10.7 // XFAIL: with_system_cxx_lib=macosx10.8 // On Windows libc++ doesn't provide its own definitions for new/delete // but instead depends on the ones in VCRuntime. However VCRuntime does not // yet provide aligned new/delete definitions so this test fails to link. // XFAIL: LIBCXX-WINDOWS-FIXME // test operator new #include #include #include #include #include #include "test_macros.h" constexpr auto OverAligned = alignof(std::max_align_t) * 2; int new_handler_called = 0; void my_new_handler() { ++new_handler_called; std::set_new_handler(0); } int A_constructed = 0; struct alignas(OverAligned) A { A() { ++A_constructed;} ~A() { --A_constructed;} }; void test_throw_max_size() { #ifndef TEST_HAS_NO_EXCEPTIONS std::set_new_handler(my_new_handler); try { void* vp = operator new[] (std::numeric_limits::max(), static_cast(32)); ((void)vp); assert(false); } catch (std::bad_alloc&) { assert(new_handler_called == 1); } catch (...) { assert(false); } #endif } int main() { { A* ap = new A[2]; assert(ap); assert(reinterpret_cast(ap) % OverAligned == 0); assert(A_constructed == 2); delete [] ap; assert(A_constructed == 0); } { test_throw_max_size(); } }