diff options
Diffstat (limited to 'test/std/language.support/support.dynamic/new.delete')
26 files changed, 929 insertions, 57 deletions
diff --git a/test/std/language.support/support.dynamic/new.delete/new.delete.array/delete_align_val_t_replace.pass.cpp b/test/std/language.support/support.dynamic/new.delete/new.delete.array/delete_align_val_t_replace.pass.cpp new file mode 100644 index 000000000000..c88e5b06e675 --- /dev/null +++ b/test/std/language.support/support.dynamic/new.delete/new.delete.array/delete_align_val_t_replace.pass.cpp @@ -0,0 +1,89 @@ +//===----------------------------------------------------------------------===// +// +// 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. +// +//===----------------------------------------------------------------------===// + +// test aligned operator delete replacement. + +// UNSUPPORTED: sanitizer-new-delete, c++98, c++03, c++11, c++14 + +// Older Clang versions do not support this +// XFAIL: clang-3, apple-clang + +// None of the current GCC compilers support this. +// XFAIL: gcc + +#include <new> +#include <cstddef> +#include <cstdlib> +#include <cassert> + +#include "test_macros.h" + +constexpr auto OverAligned = alignof(std::max_align_t) * 2; + +int unsized_delete_called = 0; +int unsized_delete_nothrow_called = 0; +int aligned_delete_called = 0; + +void reset() { + unsized_delete_called = 0; + unsized_delete_nothrow_called = 0; + aligned_delete_called = 0; +} + +void operator delete(void* p) TEST_NOEXCEPT +{ + ++unsized_delete_called; + std::free(p); +} + +void operator delete(void* p, const std::nothrow_t&) TEST_NOEXCEPT +{ + ++unsized_delete_nothrow_called; + std::free(p); +} + +void operator delete [] (void* p, std::align_val_t) TEST_NOEXCEPT +{ + ++aligned_delete_called; + std::free(p); +} + +struct alignas(OverAligned) A {}; +struct alignas(std::max_align_t) B {}; + +B* volatile b; // Escape the memory +A* volatile a; + +int main() +{ + reset(); + { + b = new B[2]; + assert(0 == unsized_delete_called); + assert(0 == unsized_delete_nothrow_called); + assert(0 == aligned_delete_called); + + delete [] b; + assert(1 == unsized_delete_called); + assert(0 == unsized_delete_nothrow_called); + assert(0 == aligned_delete_called); + } + reset(); + { + a = new A[2]; + assert(0 == unsized_delete_called); + assert(0 == unsized_delete_nothrow_called); + assert(0 == aligned_delete_called); + + delete [] a; + assert(0 == unsized_delete_called); + assert(0 == unsized_delete_nothrow_called); + assert(1 == aligned_delete_called); + } +} diff --git a/test/std/language.support/support.dynamic/new.delete/new.delete.array/new_align_val_t.pass.cpp b/test/std/language.support/support.dynamic/new.delete/new.delete.array/new_align_val_t.pass.cpp new file mode 100644 index 000000000000..55c26fa5c4a7 --- /dev/null +++ b/test/std/language.support/support.dynamic/new.delete/new.delete.array/new_align_val_t.pass.cpp @@ -0,0 +1,80 @@ +//===----------------------------------------------------------------------===// +// +// 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 + +// test operator new + +#include <new> +#include <cstddef> +#include <cassert> +#include <cstdint> +#include <limits> + +#include "test_macros.h" + +constexpr auto OverAligned = alignof(std::max_align_t) * 2; + +int new_handler_called = 0; + +void 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(new_handler); + try + { + void* vp = operator new[] (std::numeric_limits<std::size_t>::max(), + static_cast<std::align_val_t>(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<std::uintptr_t>(ap) % OverAligned == 0); + assert(A_constructed == 2); + delete [] ap; + assert(A_constructed == 0); + } + { + test_throw_max_size(); + } +} diff --git a/test/std/language.support/support.dynamic/new.delete/new.delete.array/new_align_val_t_nothrow.pass.cpp b/test/std/language.support/support.dynamic/new.delete/new.delete.array/new_align_val_t_nothrow.pass.cpp new file mode 100644 index 000000000000..28da3093f398 --- /dev/null +++ b/test/std/language.support/support.dynamic/new.delete/new.delete.array/new_align_val_t_nothrow.pass.cpp @@ -0,0 +1,82 @@ +//===----------------------------------------------------------------------===// +// +// 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 turn this into an XFAIL +// UNSUPPORTED: no-aligned-allocation + +// test operator new (nothrow) + +#include <new> +#include <cstddef> +#include <cstdint> +#include <cassert> +#include <limits> + +#include "test_macros.h" + +constexpr auto OverAligned = alignof(std::max_align_t) * 2; + +int new_handler_called = 0; + +void 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_max_alloc() { + std::set_new_handler(new_handler); + auto do_test = []() { + void* vp = operator new [](std::numeric_limits<std::size_t>::max(), + std::align_val_t(OverAligned), + std::nothrow); + assert(new_handler_called == 1); + assert(vp == 0); + }; +#ifndef TEST_HAS_NO_EXCEPTIONS + try + { + do_test(); + } + catch (...) + { + assert(false); + } +#else + do_test(); +#endif +} + +int main() +{ + { + A* ap = new(std::nothrow) A[3]; + assert(ap); + assert(reinterpret_cast<std::uintptr_t>(ap) % OverAligned == 0); + assert(A_constructed == 3); + delete [] ap; + assert(!A_constructed); + } + { + test_max_alloc(); + } +} diff --git a/test/std/language.support/support.dynamic/new.delete/new.delete.array/new_align_val_t_nothrow_replace.pass.cpp b/test/std/language.support/support.dynamic/new.delete/new.delete.array/new_align_val_t_nothrow_replace.pass.cpp new file mode 100644 index 000000000000..03e490e8ed85 --- /dev/null +++ b/test/std/language.support/support.dynamic/new.delete/new.delete.array/new_align_val_t_nothrow_replace.pass.cpp @@ -0,0 +1,83 @@ +//===----------------------------------------------------------------------===// +// +// 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 +// UNSUPPORTED: sanitizer-new-delete + +// XFAIL: no-aligned-allocation + +// test operator new nothrow by replacing only operator new + +#include <new> +#include <cstddef> +#include <cstdlib> +#include <cassert> +#include <limits> + +#include "test_macros.h" + +constexpr auto OverAligned = alignof(std::max_align_t) * 2; + +int A_constructed = 0; + +struct alignas(OverAligned) A +{ + A() {++A_constructed;} + ~A() {--A_constructed;} +}; + +int B_constructed = 0; + +struct B { + std::max_align_t member; + B() { ++B_constructed; } + ~B() { --B_constructed; } +}; + +int new_called = 0; +alignas(OverAligned) char Buff[OverAligned * 3]; + +void* operator new[](std::size_t s, std::align_val_t a) TEST_THROW_SPEC(std::bad_alloc) +{ + assert(!new_called); + assert(s <= sizeof(Buff)); + assert(static_cast<std::size_t>(a) == OverAligned); + ++new_called; + return Buff; +} + +void operator delete[](void* p, std::align_val_t a) TEST_NOEXCEPT +{ + assert(p == Buff); + assert(static_cast<std::size_t>(a) == OverAligned); + assert(new_called); + --new_called; +} + +int main() +{ + { + A* ap = new (std::nothrow) A[2]; + assert(ap); + assert(A_constructed == 2); + assert(new_called); + delete [] ap; + assert(A_constructed == 0); + assert(!new_called); + } + { + B* bp = new (std::nothrow) B[2]; + assert(bp); + assert(B_constructed == 2); + assert(!new_called); + delete [] bp; + assert(!new_called); + assert(!B_constructed); + } +} diff --git a/test/std/language.support/support.dynamic/new.delete/new.delete.array/new_align_val_t_replace.pass.cpp b/test/std/language.support/support.dynamic/new.delete/new.delete.array/new_align_val_t_replace.pass.cpp new file mode 100644 index 000000000000..131deb340d2f --- /dev/null +++ b/test/std/language.support/support.dynamic/new.delete/new.delete.array/new_align_val_t_replace.pass.cpp @@ -0,0 +1,85 @@ +//===----------------------------------------------------------------------===// +// +// 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 +// UNSUPPORTED: sanitizer-new-delete + +// XFAIL: no-aligned-allocation + +// test operator new replacement + +#include <new> +#include <cstddef> +#include <cstdlib> +#include <cstdint> +#include <cassert> +#include <limits> + +#include "test_macros.h" + +constexpr auto OverAligned = alignof(std::max_align_t) * 2; + +int A_constructed = 0; + +struct alignas(OverAligned) A { + A() { ++A_constructed;} + ~A() { --A_constructed;} +}; + + +int B_constructed = 0; + +struct alignas(std::max_align_t) B +{ + std::max_align_t member; + B() { ++B_constructed;} + ~B() { --B_constructed;} +}; + +int new_called = 0; + +alignas(OverAligned) char DummyData[OverAligned * 4]; + +void* operator new[](std::size_t s, std::align_val_t a) TEST_THROW_SPEC(std::bad_alloc) +{ + assert(new_called == 0); // We already allocated + assert(s <= sizeof(DummyData)); + assert(static_cast<std::size_t>(a) == OverAligned); + ++new_called; + return DummyData; +} + +void operator delete[](void* p, std::align_val_t) TEST_NOEXCEPT +{ + assert(new_called == 1); + --new_called; + assert(p == DummyData); +} + + +int main() +{ + { + A* ap = new A[3]; + assert(ap); + assert(A_constructed == 3); + assert(new_called); + delete [] ap; + assert(!A_constructed); + assert(!new_called); + } + { + B* bp = new B[3]; + assert(bp); + assert(B_constructed == 3); + assert(!new_called); + delete [] bp; + assert(!new_called); + } +} diff --git a/test/std/language.support/support.dynamic/new.delete/new.delete.array/new_array.pass.cpp b/test/std/language.support/support.dynamic/new.delete/new.delete.array/new_array.pass.cpp index 55a3200a13b7..dd4ff46bceb9 100644 --- a/test/std/language.support/support.dynamic/new.delete/new.delete.array/new_array.pass.cpp +++ b/test/std/language.support/support.dynamic/new.delete/new.delete.array/new_array.pass.cpp @@ -7,7 +7,6 @@ // //===----------------------------------------------------------------------===// -// XFAIL: libcpp-no-exceptions // test operator new[] // NOTE: asan and msan will not call the new handler. // UNSUPPORTED: sanitizer-new-delete @@ -18,6 +17,8 @@ #include <cassert> #include <limits> +#include "test_macros.h" + int new_handler_called = 0; void new_handler() @@ -36,6 +37,7 @@ struct A int main() { +#ifndef TEST_HAS_NO_EXCEPTIONS std::set_new_handler(new_handler); try { @@ -51,6 +53,7 @@ int main() { assert(false); } +#endif A* ap = new A[3]; assert(ap); assert(A_constructed == 3); diff --git a/test/std/language.support/support.dynamic/new.delete/new.delete.array/new_array_nothrow.pass.cpp b/test/std/language.support/support.dynamic/new.delete/new.delete.array/new_array_nothrow.pass.cpp index 9531b1c37480..2f51b1990436 100644 --- a/test/std/language.support/support.dynamic/new.delete/new.delete.array/new_array_nothrow.pass.cpp +++ b/test/std/language.support/support.dynamic/new.delete/new.delete.array/new_array_nothrow.pass.cpp @@ -7,7 +7,6 @@ // //===----------------------------------------------------------------------===// -// XFAIL: libcpp-no-exceptions // test operator new [] (nothrow) // NOTE: asan and msan will not call the new handler. // UNSUPPORTED: sanitizer-new-delete @@ -18,6 +17,8 @@ #include <cassert> #include <limits> +#include "test_macros.h" + int new_handler_called = 0; void new_handler() @@ -37,16 +38,20 @@ struct A int main() { std::set_new_handler(new_handler); +#ifndef TEST_HAS_NO_EXCEPTIONS try +#endif { void*volatile vp = operator new [] (std::numeric_limits<std::size_t>::max(), std::nothrow); assert(new_handler_called == 1); assert(vp == 0); } +#ifndef TEST_HAS_NO_EXCEPTIONS catch (...) { assert(false); } +#endif A* ap = new(std::nothrow) A[3]; assert(ap); assert(A_constructed == 3); diff --git a/test/std/language.support/support.dynamic/new.delete/new.delete.array/new_array_nothrow_replace.pass.cpp b/test/std/language.support/support.dynamic/new.delete/new.delete.array/new_array_nothrow_replace.pass.cpp index 5887bb0bdf30..53e26c99f92e 100644 --- a/test/std/language.support/support.dynamic/new.delete/new.delete.array/new_array_nothrow_replace.pass.cpp +++ b/test/std/language.support/support.dynamic/new.delete/new.delete.array/new_array_nothrow_replace.pass.cpp @@ -11,19 +11,17 @@ // UNSUPPORTED: sanitizer-new-delete -// TODO Investigate why UBSAN prevents new from calling our replacement. -// XFAIL: ubsan - - #include <new> #include <cstddef> #include <cstdlib> #include <cassert> #include <limits> +#include "test_macros.h" + int new_called = 0; -void* operator new(std::size_t s) throw(std::bad_alloc) +void* operator new(std::size_t s) TEST_THROW_SPEC(std::bad_alloc) { ++new_called; void* ret = std::malloc(s); @@ -31,7 +29,7 @@ void* operator new(std::size_t s) throw(std::bad_alloc) return ret; } -void operator delete(void* p) throw() +void operator delete(void* p) TEST_NOEXCEPT { --new_called; std::free(p); @@ -45,9 +43,11 @@ struct A ~A() {--A_constructed;} }; +A* volatile ap; + int main() { - A* ap = new (std::nothrow) A[3]; + ap = new (std::nothrow) A[3]; assert(ap); assert(A_constructed == 3); assert(new_called); diff --git a/test/std/language.support/support.dynamic/new.delete/new.delete.array/new_array_replace.pass.cpp b/test/std/language.support/support.dynamic/new.delete/new.delete.array/new_array_replace.pass.cpp index 1e78ea8fe267..b0820b14f410 100644 --- a/test/std/language.support/support.dynamic/new.delete/new.delete.array/new_array_replace.pass.cpp +++ b/test/std/language.support/support.dynamic/new.delete/new.delete.array/new_array_replace.pass.cpp @@ -11,9 +11,6 @@ // UNSUPPORTED: sanitizer-new-delete -// TODO Investigate why UBSAN prevents new from calling our replacement. -// XFAIL: ubsan - #include <new> #include <cstddef> @@ -21,9 +18,11 @@ #include <cassert> #include <limits> +#include "test_macros.h" + volatile int new_called = 0; -void* operator new(std::size_t s) throw(std::bad_alloc) +void* operator new(std::size_t s) TEST_THROW_SPEC(std::bad_alloc) { ++new_called; void* ret = std::malloc(s); @@ -31,7 +30,7 @@ void* operator new(std::size_t s) throw(std::bad_alloc) return ret; } -void operator delete(void* p) throw() +void operator delete(void* p) TEST_NOEXCEPT { --new_called; std::free(p); @@ -45,9 +44,11 @@ struct A ~A() {--A_constructed;} }; +A* volatile ap; + int main() { - A* ap = new A[3]; + ap = new A[3]; assert(ap); assert(A_constructed == 3); assert(new_called == 1); diff --git a/test/std/language.support/support.dynamic/new.delete/new.delete.array/sized_delete_array11.pass.cpp b/test/std/language.support/support.dynamic/new.delete/new.delete.array/sized_delete_array11.pass.cpp index 0f7840ca9ef8..3e41b24d292f 100644 --- a/test/std/language.support/support.dynamic/new.delete/new.delete.array/sized_delete_array11.pass.cpp +++ b/test/std/language.support/support.dynamic/new.delete/new.delete.array/sized_delete_array11.pass.cpp @@ -20,23 +20,25 @@ #include <cstdlib> #include <cassert> +#include "test_macros.h" + int unsized_delete_called = 0; int unsized_delete_nothrow_called = 0; int sized_delete_called = 0; -void operator delete[](void* p) throw() +void operator delete[](void* p) TEST_NOEXCEPT { ++unsized_delete_called; std::free(p); } -void operator delete[](void* p, const std::nothrow_t&) throw() +void operator delete[](void* p, const std::nothrow_t&) TEST_NOEXCEPT { ++unsized_delete_nothrow_called; std::free(p); } -void operator delete[](void* p, std::size_t) throw() +void operator delete[](void* p, std::size_t) TEST_NOEXCEPT { ++sized_delete_called; std::free(p); diff --git a/test/std/language.support/support.dynamic/new.delete/new.delete.array/sized_delete_array14.pass.cpp b/test/std/language.support/support.dynamic/new.delete/new.delete.array/sized_delete_array14.pass.cpp index 0e2cc6d8da4e..fb715805083f 100644 --- a/test/std/language.support/support.dynamic/new.delete/new.delete.array/sized_delete_array14.pass.cpp +++ b/test/std/language.support/support.dynamic/new.delete/new.delete.array/sized_delete_array14.pass.cpp @@ -25,23 +25,25 @@ #include <cstdlib> #include <cassert> +#include "test_macros.h" + int unsized_delete_called = 0; int unsized_delete_nothrow_called = 0; int sized_delete_called = 0; -void operator delete[](void* p) throw() +void operator delete[](void* p) TEST_NOEXCEPT { ++unsized_delete_called; std::free(p); } -void operator delete[](void* p, const std::nothrow_t&) throw() +void operator delete[](void* p, const std::nothrow_t&) TEST_NOEXCEPT { ++unsized_delete_nothrow_called; std::free(p); } -void operator delete[](void* p, std::size_t) throw() +void operator delete[](void* p, std::size_t) TEST_NOEXCEPT { ++sized_delete_called; std::free(p); diff --git a/test/std/language.support/support.dynamic/new.delete/new.delete.array/sized_delete_array_calls_unsized_delete_array.pass.cpp b/test/std/language.support/support.dynamic/new.delete/new.delete.array/sized_delete_array_calls_unsized_delete_array.pass.cpp index 6d24aec35ef8..ff55ec74e3cd 100644 --- a/test/std/language.support/support.dynamic/new.delete/new.delete.array/sized_delete_array_calls_unsized_delete_array.pass.cpp +++ b/test/std/language.support/support.dynamic/new.delete/new.delete.array/sized_delete_array_calls_unsized_delete_array.pass.cpp @@ -18,16 +18,18 @@ #include <cstdlib> #include <cassert> +#include "test_macros.h" + int delete_called = 0; int delete_nothrow_called = 0; -void operator delete[](void* p) throw() +void operator delete[](void* p) TEST_NOEXCEPT { ++delete_called; std::free(p); } -void operator delete[](void* p, const std::nothrow_t&) throw() +void operator delete[](void* p, const std::nothrow_t&) TEST_NOEXCEPT { ++delete_nothrow_called; std::free(p); diff --git a/test/std/language.support/support.dynamic/new.delete/new.delete.array/sized_delete_array_fsizeddeallocation.sh.cpp b/test/std/language.support/support.dynamic/new.delete/new.delete.array/sized_delete_array_fsizeddeallocation.sh.cpp index 7dd510b4dac8..5b93540eac57 100644 --- a/test/std/language.support/support.dynamic/new.delete/new.delete.array/sized_delete_array_fsizeddeallocation.sh.cpp +++ b/test/std/language.support/support.dynamic/new.delete/new.delete.array/sized_delete_array_fsizeddeallocation.sh.cpp @@ -33,23 +33,25 @@ #include <cstdlib> #include <cassert> +#include "test_macros.h" + int unsized_delete_called = 0; int unsized_delete_nothrow_called = 0; int sized_delete_called = 0; -void operator delete[](void* p) throw() +void operator delete[](void* p) TEST_NOEXCEPT { ++unsized_delete_called; std::free(p); } -void operator delete[](void* p, const std::nothrow_t&) throw() +void operator delete[](void* p, const std::nothrow_t&) TEST_NOEXCEPT { ++unsized_delete_nothrow_called; std::free(p); } -void operator delete[](void* p, std::size_t) throw() +void operator delete[](void* p, std::size_t) TEST_NOEXCEPT { ++sized_delete_called; std::free(p); diff --git a/test/std/language.support/support.dynamic/new.delete/new.delete.single/delete_align_val_t_replace.pass.cpp b/test/std/language.support/support.dynamic/new.delete/new.delete.single/delete_align_val_t_replace.pass.cpp new file mode 100644 index 000000000000..a5d4df34a85d --- /dev/null +++ b/test/std/language.support/support.dynamic/new.delete/new.delete.single/delete_align_val_t_replace.pass.cpp @@ -0,0 +1,90 @@ +//===----------------------------------------------------------------------===// +// +// 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. +// +//===----------------------------------------------------------------------===// + +// test aligned operator delete replacement. + +// UNSUPPORTED: sanitizer-new-delete, c++98, c++03, c++11, c++14 + +// Older Clang versions do not support this +// XFAIL: clang-3, apple-clang + +// None of the current GCC compilers support this. +// XFAIL: gcc + + +#include <new> +#include <cstddef> +#include <cstdlib> +#include <cassert> + +#include "test_macros.h" + +constexpr auto OverAligned = alignof(std::max_align_t) * 2; + +int unsized_delete_called = 0; +int unsized_delete_nothrow_called = 0; +int aligned_delete_called = 0; + +void reset() { + unsized_delete_called = 0; + unsized_delete_nothrow_called = 0; + aligned_delete_called = 0; +} + +void operator delete(void* p) TEST_NOEXCEPT +{ + ++unsized_delete_called; + std::free(p); +} + +void operator delete(void* p, const std::nothrow_t&) TEST_NOEXCEPT +{ + ++unsized_delete_nothrow_called; + std::free(p); +} + +void operator delete(void* p, std::align_val_t) TEST_NOEXCEPT +{ + ++aligned_delete_called; + std::free(p); +} + +struct alignas(OverAligned) A {}; +struct alignas(std::max_align_t) B {}; + +B* volatile bp; +A* volatile ap; + +int main() +{ + reset(); + { + bp = new B; + assert(0 == unsized_delete_called); + assert(0 == unsized_delete_nothrow_called); + assert(0 == aligned_delete_called); + + delete bp; + assert(1 == unsized_delete_called); + assert(0 == unsized_delete_nothrow_called); + assert(0 == aligned_delete_called); + } + reset(); + { + ap = new A; + assert(0 == unsized_delete_called); + assert(0 == unsized_delete_nothrow_called); + assert(0 == aligned_delete_called); + + delete ap; + assert(0 == unsized_delete_called); + assert(0 == unsized_delete_nothrow_called); + assert(1 == aligned_delete_called); + } +} diff --git a/test/std/language.support/support.dynamic/new.delete/new.delete.single/new.pass.cpp b/test/std/language.support/support.dynamic/new.delete/new.delete.single/new.pass.cpp index 892842a1b9f4..26f7bc392c79 100644 --- a/test/std/language.support/support.dynamic/new.delete/new.delete.single/new.pass.cpp +++ b/test/std/language.support/support.dynamic/new.delete/new.delete.single/new.pass.cpp @@ -7,8 +7,6 @@ // //===----------------------------------------------------------------------===// -// XFAIL: libcpp-no-exceptions - // test operator new // asan and msan will not call the new handler. @@ -19,6 +17,8 @@ #include <cassert> #include <limits> +#include "test_macros.h" + int new_handler_called = 0; void new_handler() @@ -37,6 +37,7 @@ struct A int main() { +#ifndef TEST_HAS_NO_EXCEPTIONS std::set_new_handler(new_handler); try { @@ -52,6 +53,7 @@ int main() { assert(false); } +#endif A* ap = new A; assert(ap); assert(A_constructed); diff --git a/test/std/language.support/support.dynamic/new.delete/new.delete.single/new_align_val_t.pass.cpp b/test/std/language.support/support.dynamic/new.delete/new.delete.single/new_align_val_t.pass.cpp new file mode 100644 index 000000000000..fefae51dac93 --- /dev/null +++ b/test/std/language.support/support.dynamic/new.delete/new.delete.single/new_align_val_t.pass.cpp @@ -0,0 +1,80 @@ +//===----------------------------------------------------------------------===// +// +// 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 turn this into an XFAIL +// UNSUPPORTED: no-aligned-allocation + +// test operator new + +#include <new> +#include <cstddef> +#include <cassert> +#include <cstdint> +#include <limits> + +#include "test_macros.h" + +constexpr auto OverAligned = alignof(std::max_align_t) * 2; + +int new_handler_called = 0; + +void new_handler() +{ + ++new_handler_called; + std::set_new_handler(0); +} + +bool A_constructed = false; + +struct alignas(OverAligned) A +{ + A() {A_constructed = true;} + ~A() {A_constructed = false;} +}; + +void test_throw_max_size() { +#ifndef TEST_HAS_NO_EXCEPTIONS + std::set_new_handler(new_handler); + try + { + void* vp = operator new (std::numeric_limits<std::size_t>::max(), + static_cast<std::align_val_t>(32)); + ((void)vp); + assert(false); + } + catch (std::bad_alloc&) + { + assert(new_handler_called == 1); + } + catch (...) + { + assert(false); + } +#endif +} + +int main() +{ + { + A* ap = new A; + assert(ap); + assert(reinterpret_cast<std::uintptr_t>(ap) % OverAligned == 0); + assert(A_constructed); + delete ap; + assert(!A_constructed); + } + { + test_throw_max_size(); + } +} diff --git a/test/std/language.support/support.dynamic/new.delete/new.delete.single/new_align_val_t_nothrow.pass.cpp b/test/std/language.support/support.dynamic/new.delete/new.delete.single/new_align_val_t_nothrow.pass.cpp new file mode 100644 index 000000000000..ca8503e8854d --- /dev/null +++ b/test/std/language.support/support.dynamic/new.delete/new.delete.single/new_align_val_t_nothrow.pass.cpp @@ -0,0 +1,82 @@ +//===----------------------------------------------------------------------===// +// +// 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 turn this into an XFAIL +// UNSUPPORTED: no-aligned-allocation + +// test operator new (nothrow) + +#include <new> +#include <cstddef> +#include <cstdint> +#include <cassert> +#include <limits> + +#include "test_macros.h" + +constexpr auto OverAligned = alignof(std::max_align_t) * 2; + +int new_handler_called = 0; + +void new_handler() +{ + ++new_handler_called; + std::set_new_handler(0); +} + +bool A_constructed = false; + +struct alignas(OverAligned) A +{ + A() {A_constructed = true;} + ~A() {A_constructed = false;} +}; + +void test_max_alloc() { + std::set_new_handler(new_handler); + auto do_test = []() { + void* vp = operator new (std::numeric_limits<std::size_t>::max(), + std::align_val_t(OverAligned), + std::nothrow); + assert(new_handler_called == 1); + assert(vp == 0); + }; +#ifndef TEST_HAS_NO_EXCEPTIONS + try + { + do_test(); + } + catch (...) + { + assert(false); + } +#else + do_test(); +#endif +} + +int main() +{ + { + A* ap = new(std::nothrow) A; + assert(ap); + assert(reinterpret_cast<std::uintptr_t>(ap) % OverAligned == 0); + assert(A_constructed); + delete ap; + assert(!A_constructed); + } + { + test_max_alloc(); + } +} diff --git a/test/std/language.support/support.dynamic/new.delete/new.delete.single/new_align_val_t_nothrow_replace.pass.cpp b/test/std/language.support/support.dynamic/new.delete/new.delete.single/new_align_val_t_nothrow_replace.pass.cpp new file mode 100644 index 000000000000..9f64c9730166 --- /dev/null +++ b/test/std/language.support/support.dynamic/new.delete/new.delete.single/new_align_val_t_nothrow_replace.pass.cpp @@ -0,0 +1,84 @@ +//===----------------------------------------------------------------------===// +// +// 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 +// UNSUPPORTED: sanitizer-new-delete + +// XFAIL: no-aligned-allocation + +// test operator new nothrow by replacing only operator new + +#include <new> +#include <cstddef> +#include <cstdlib> +#include <cassert> +#include <limits> + +#include "test_macros.h" + +constexpr auto OverAligned = alignof(std::max_align_t) * 2; + +bool A_constructed = false; + +struct alignas(OverAligned) A +{ + A() {A_constructed = true;} + ~A() {A_constructed = false;} +}; + +bool B_constructed = false; + +struct B { + std::max_align_t member; + B() { B_constructed = true; } + ~B() { B_constructed = false; } +}; + +int new_called = 0; +alignas(OverAligned) char Buff[OverAligned * 2]; + +void* operator new(std::size_t s, std::align_val_t a) TEST_THROW_SPEC(std::bad_alloc) +{ + assert(!new_called); + assert(s <= sizeof(Buff)); + assert(static_cast<std::size_t>(a) == OverAligned); + ++new_called; + return Buff; +} + +void operator delete(void* p, std::align_val_t a) TEST_NOEXCEPT +{ + assert(p == Buff); + assert(static_cast<std::size_t>(a) == OverAligned); + assert(new_called); + --new_called; +} + + +int main() +{ + { + A* ap = new (std::nothrow) A; + assert(ap); + assert(A_constructed); + assert(new_called); + delete ap; + assert(!A_constructed); + assert(!new_called); + } + { + B* bp = new (std::nothrow) B; + assert(bp); + assert(B_constructed); + assert(!new_called); + delete bp; + assert(!new_called); + assert(!B_constructed); + } +} diff --git a/test/std/language.support/support.dynamic/new.delete/new.delete.single/new_align_val_t_replace.pass.cpp b/test/std/language.support/support.dynamic/new.delete/new.delete.single/new_align_val_t_replace.pass.cpp new file mode 100644 index 000000000000..df3e4c1560a9 --- /dev/null +++ b/test/std/language.support/support.dynamic/new.delete/new.delete.single/new_align_val_t_replace.pass.cpp @@ -0,0 +1,85 @@ +//===----------------------------------------------------------------------===// +// +// 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 +// UNSUPPORTED: sanitizer-new-delete + +// XFAIL: no-aligned-allocation + +// test operator new replacement + +#include <new> +#include <cstddef> +#include <cstdlib> +#include <cstdint> +#include <cassert> +#include <limits> + +#include "test_macros.h" + +constexpr auto OverAligned = alignof(std::max_align_t) * 2; + +bool A_constructed = false; + +struct alignas(OverAligned) A { + A() {A_constructed = true;} + ~A() {A_constructed = false;} +}; + + +bool B_constructed = false; + +struct alignas(std::max_align_t) B +{ + std::max_align_t member; + B() {B_constructed = true;} + ~B() {B_constructed = false;} +}; + +int new_called = 0; + +alignas(OverAligned) char DummyData[OverAligned]; + +void* operator new(std::size_t s, std::align_val_t a) TEST_THROW_SPEC(std::bad_alloc) +{ + assert(new_called == 0); // We already allocated + assert(s <= sizeof(DummyData)); + assert(static_cast<std::size_t>(a) == OverAligned); + ++new_called; + return DummyData; +} + +void operator delete(void* p, std::align_val_t) TEST_NOEXCEPT +{ + assert(new_called == 1); + --new_called; + assert(p == DummyData); +} + + +int main() +{ + { + A* ap = new A; + assert(ap); + assert(A_constructed); + assert(new_called); + delete ap; + assert(!A_constructed); + assert(!new_called); + } + { + B* bp = new B; + assert(bp); + assert(B_constructed); + assert(!new_called); + delete bp; + assert(!new_called); + } +} diff --git a/test/std/language.support/support.dynamic/new.delete/new.delete.single/new_nothrow.pass.cpp b/test/std/language.support/support.dynamic/new.delete/new.delete.single/new_nothrow.pass.cpp index c2f5830495d2..757e8ae18a47 100644 --- a/test/std/language.support/support.dynamic/new.delete/new.delete.single/new_nothrow.pass.cpp +++ b/test/std/language.support/support.dynamic/new.delete/new.delete.single/new_nothrow.pass.cpp @@ -7,7 +7,6 @@ // //===----------------------------------------------------------------------===// -// XFAIL: libcpp-no-exceptions // test operator new (nothrow) // asan and msan will not call the new handler. @@ -18,6 +17,8 @@ #include <cassert> #include <limits> +#include "test_macros.h" + int new_handler_called = 0; void new_handler() @@ -37,16 +38,20 @@ struct A int main() { std::set_new_handler(new_handler); +#ifndef TEST_HAS_NO_EXCEPTIONS try +#endif { void* vp = operator new (std::numeric_limits<std::size_t>::max(), std::nothrow); assert(new_handler_called == 1); assert(vp == 0); } +#ifndef TEST_HAS_NO_EXCEPTIONS catch (...) { assert(false); } +#endif A* ap = new(std::nothrow) A; assert(ap); assert(A_constructed); diff --git a/test/std/language.support/support.dynamic/new.delete/new.delete.single/new_nothrow_replace.pass.cpp b/test/std/language.support/support.dynamic/new.delete/new.delete.single/new_nothrow_replace.pass.cpp index eb8319bac2f7..dbc64bace332 100644 --- a/test/std/language.support/support.dynamic/new.delete/new.delete.single/new_nothrow_replace.pass.cpp +++ b/test/std/language.support/support.dynamic/new.delete/new.delete.single/new_nothrow_replace.pass.cpp @@ -11,18 +11,17 @@ // UNSUPPORTED: sanitizer-new-delete -// TODO Investigate why UBSAN prevents nothrow new from calling our replacement. -// XFAIL: ubsan - #include <new> #include <cstddef> #include <cstdlib> #include <cassert> #include <limits> +#include "test_macros.h" + int new_called = 0; -void* operator new(std::size_t s) throw(std::bad_alloc) +void* operator new(std::size_t s) TEST_THROW_SPEC(std::bad_alloc) { ++new_called; void* ret = std::malloc(s); @@ -30,7 +29,7 @@ void* operator new(std::size_t s) throw(std::bad_alloc) return ret; } -void operator delete(void* p) throw() +void operator delete(void* p) TEST_NOEXCEPT { --new_called; std::free(p); @@ -44,9 +43,11 @@ struct A ~A() {A_constructed = false;} }; +A* volatile ap; + int main() { - A* ap = new (std::nothrow) A; + ap = new (std::nothrow) A; assert(ap); assert(A_constructed); assert(new_called); diff --git a/test/std/language.support/support.dynamic/new.delete/new.delete.single/new_replace.pass.cpp b/test/std/language.support/support.dynamic/new.delete/new.delete.single/new_replace.pass.cpp index 6056ed7bb0b3..ad15b49483d0 100644 --- a/test/std/language.support/support.dynamic/new.delete/new.delete.single/new_replace.pass.cpp +++ b/test/std/language.support/support.dynamic/new.delete/new.delete.single/new_replace.pass.cpp @@ -17,9 +17,11 @@ #include <cassert> #include <limits> +#include "test_macros.h" + int new_called = 0; -void* operator new(std::size_t s) throw(std::bad_alloc) +void* operator new(std::size_t s) TEST_THROW_SPEC(std::bad_alloc) { ++new_called; void* ret = std::malloc(s); @@ -27,7 +29,7 @@ void* operator new(std::size_t s) throw(std::bad_alloc) return ret; } -void operator delete(void* p) throw() +void operator delete(void* p) TEST_NOEXCEPT { --new_called; std::free(p); diff --git a/test/std/language.support/support.dynamic/new.delete/new.delete.single/sized_delete11.pass.cpp b/test/std/language.support/support.dynamic/new.delete/new.delete.single/sized_delete11.pass.cpp index e4064e2ab510..7369c362fce2 100644 --- a/test/std/language.support/support.dynamic/new.delete/new.delete.single/sized_delete11.pass.cpp +++ b/test/std/language.support/support.dynamic/new.delete/new.delete.single/sized_delete11.pass.cpp @@ -20,23 +20,25 @@ #include <cstdlib> #include <cassert> +#include "test_macros.h" + int unsized_delete_called = 0; int unsized_delete_nothrow_called = 0; int sized_delete_called = 0; -void operator delete(void* p) throw() +void operator delete(void* p) TEST_NOEXCEPT { ++unsized_delete_called; std::free(p); } -void operator delete(void* p, const std::nothrow_t&) throw() +void operator delete(void* p, const std::nothrow_t&) TEST_NOEXCEPT { ++unsized_delete_nothrow_called; std::free(p); } -void operator delete(void* p, std::size_t) throw() +void operator delete(void* p, std::size_t) TEST_NOEXCEPT { ++sized_delete_called; std::free(p); diff --git a/test/std/language.support/support.dynamic/new.delete/new.delete.single/sized_delete14.pass.cpp b/test/std/language.support/support.dynamic/new.delete/new.delete.single/sized_delete14.pass.cpp index 5d9ddd4f0526..6c91f5ceda86 100644 --- a/test/std/language.support/support.dynamic/new.delete/new.delete.single/sized_delete14.pass.cpp +++ b/test/std/language.support/support.dynamic/new.delete/new.delete.single/sized_delete14.pass.cpp @@ -25,23 +25,25 @@ #include <cstdlib> #include <cassert> +#include "test_macros.h" + int unsized_delete_called = 0; int unsized_delete_nothrow_called = 0; int sized_delete_called = 0; -void operator delete(void* p) throw() +void operator delete(void* p) TEST_NOEXCEPT { ++unsized_delete_called; std::free(p); } -void operator delete(void* p, const std::nothrow_t&) throw() +void operator delete(void* p, const std::nothrow_t&) TEST_NOEXCEPT { ++unsized_delete_nothrow_called; std::free(p); } -void operator delete(void* p, std::size_t) throw() +void operator delete(void* p, std::size_t) TEST_NOEXCEPT { ++sized_delete_called; std::free(p); diff --git a/test/std/language.support/support.dynamic/new.delete/new.delete.single/sized_delete_calls_unsized_delete.pass.cpp b/test/std/language.support/support.dynamic/new.delete/new.delete.single/sized_delete_calls_unsized_delete.pass.cpp index f656d1cd712a..cb093f3637ce 100644 --- a/test/std/language.support/support.dynamic/new.delete/new.delete.single/sized_delete_calls_unsized_delete.pass.cpp +++ b/test/std/language.support/support.dynamic/new.delete/new.delete.single/sized_delete_calls_unsized_delete.pass.cpp @@ -13,33 +13,33 @@ // UNSUPPORTED: sanitizer-new-delete -// TODO Investigate why UBSAN prevents new from calling our replacement. -// XFAIL: ubsan - - #include <new> #include <cstddef> #include <cstdlib> #include <cassert> +#include "test_macros.h" + int delete_called = 0; int delete_nothrow_called = 0; -void operator delete(void* p) throw() +void operator delete(void* p) TEST_NOEXCEPT { ++delete_called; std::free(p); } -void operator delete(void* p, const std::nothrow_t&) throw() +void operator delete(void* p, const std::nothrow_t&) TEST_NOEXCEPT { ++delete_nothrow_called; std::free(p); } +int* volatile x; + int main() { - int *x = new int(42); + x = new int(42); assert(0 == delete_called); assert(0 == delete_nothrow_called); diff --git a/test/std/language.support/support.dynamic/new.delete/new.delete.single/sized_delete_fsizeddeallocation.sh.cpp b/test/std/language.support/support.dynamic/new.delete/new.delete.single/sized_delete_fsizeddeallocation.sh.cpp index 24d33e210f57..1b6de2367e10 100644 --- a/test/std/language.support/support.dynamic/new.delete/new.delete.single/sized_delete_fsizeddeallocation.sh.cpp +++ b/test/std/language.support/support.dynamic/new.delete/new.delete.single/sized_delete_fsizeddeallocation.sh.cpp @@ -14,9 +14,6 @@ // UNSUPPORTED: sanitizer-new-delete -// TODO Investigate why UBSAN prevents new from calling our replacement. -// XFAIL: ubsan - // NOTE: Only clang-3.7 and GCC 5.1 and greater support -fsized-deallocation. // REQUIRES: fsized-deallocation @@ -36,31 +33,35 @@ #include <cstdlib> #include <cassert> +#include "test_macros.h" + int unsized_delete_called = 0; int unsized_delete_nothrow_called = 0; int sized_delete_called = 0; -void operator delete(void* p) throw() +void operator delete(void* p) TEST_NOEXCEPT { ++unsized_delete_called; std::free(p); } -void operator delete(void* p, const std::nothrow_t&) throw() +void operator delete(void* p, const std::nothrow_t&) TEST_NOEXCEPT { ++unsized_delete_nothrow_called; std::free(p); } -void operator delete(void* p, std::size_t) throw() +void operator delete(void* p, std::size_t) TEST_NOEXCEPT { ++sized_delete_called; std::free(p); } +int* volatile x; + int main() { - int *x = new int(42); + x = new int(42); assert(0 == sized_delete_called); assert(0 == unsized_delete_called); assert(0 == unsized_delete_nothrow_called); |
