diff options
| author | Marshall Clow <mclow.lists@gmail.com> | 2015-05-18 17:48:45 +0000 |
|---|---|---|
| committer | Marshall Clow <mclow.lists@gmail.com> | 2015-05-18 17:48:45 +0000 |
| commit | 0e166e5a9a98ab9112d9d07e9e5c9af300730211 (patch) | |
| tree | 325a941e8a61a930cb6cd2ef0cd4188088a62a65 | |
| parent | 12c41af07c95e3e640f8dfe4699328ef4f1824e6 (diff) | |
| download | bcm5719-llvm-0e166e5a9a98ab9112d9d07e9e5c9af300730211.tar.gz bcm5719-llvm-0e166e5a9a98ab9112d9d07e9e5c9af300730211.zip | |
Fix for LWG Issue 2458: N3778 and new library deallocation signatures.
llvm-svn: 237592
4 files changed, 0 insertions, 238 deletions
diff --git a/libcxx/include/new b/libcxx/include/new index 29c1a839680..11f8fe66717 100644 --- a/libcxx/include/new +++ b/libcxx/include/new @@ -52,16 +52,12 @@ void* operator new(std::size_t size, const std::nothrow_t&) noexcept; // repla void operator delete(void* ptr) noexcept; // replaceable void operator delete(void* ptr, std::size_t size) noexcept; // replaceable, C++14 void operator delete(void* ptr, const std::nothrow_t&) noexcept; // replaceable -void operator delete(void* ptr, std::size_t size, - const std::nothrow_t&) noexcept; // replaceable, C++14 void* operator new[](std::size_t size); // replaceable void* operator new[](std::size_t size, const std::nothrow_t&) noexcept; // replaceable void operator delete[](void* ptr) noexcept; // replaceable void operator delete[](void* ptr, std::size_t size) noexcept; // replaceable, C++14 void operator delete[](void* ptr, const std::nothrow_t&) noexcept; // replaceable -void operator delete[](void* ptr, std::size_t size, - const std::nothrow_t&) noexcept; // replaceable, C++14 void* operator new (std::size_t size, void* ptr) noexcept; void* operator new[](std::size_t size, void* ptr) noexcept; @@ -142,7 +138,6 @@ _LIBCPP_NEW_DELETE_VIS void operator delete(void* __p) _NOEXCEPT; _LIBCPP_NEW_DELETE_VIS void operator delete(void* __p, const std::nothrow_t&) _NOEXCEPT; #if defined(_LIBCPP_BUILDING_NEW) || _LIBCPP_STD_VER >= 14 _LIBCPP_NEW_DELETE_VIS void operator delete(void* __p, std::size_t __sz) _NOEXCEPT; -_LIBCPP_NEW_DELETE_VIS void operator delete(void* __p, std::size_t __sz, const std::nothrow_t&) _NOEXCEPT; #endif _LIBCPP_NEW_DELETE_VIS void* operator new[](std::size_t __sz) @@ -155,7 +150,6 @@ _LIBCPP_NEW_DELETE_VIS void operator delete[](void* __p) _NOEXCEPT; _LIBCPP_NEW_DELETE_VIS void operator delete[](void* __p, const std::nothrow_t&) _NOEXCEPT; #if defined(_LIBCPP_BUILDING_NEW) || _LIBCPP_STD_VER >= 14 _LIBCPP_NEW_DELETE_VIS void operator delete[](void* __p, std::size_t __sz) _NOEXCEPT; -_LIBCPP_NEW_DELETE_VIS void operator delete[](void* __p, std::size_t __sz, const std::nothrow_t&) _NOEXCEPT; #endif inline _LIBCPP_INLINE_VISIBILITY void* operator new (std::size_t, void* __p) _NOEXCEPT {return __p;} diff --git a/libcxx/src/new.cpp b/libcxx/src/new.cpp index c46d073fa99..c28fcb5917c 100644 --- a/libcxx/src/new.cpp +++ b/libcxx/src/new.cpp @@ -140,13 +140,6 @@ operator delete(void* ptr, size_t) _NOEXCEPT _LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS void -operator delete(void* ptr, size_t, const std::nothrow_t& nt) _NOEXCEPT -{ - ::operator delete(ptr, nt); -} - -_LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS -void operator delete[] (void* ptr) _NOEXCEPT { ::operator delete(ptr); @@ -166,13 +159,6 @@ operator delete[] (void* ptr, size_t) _NOEXCEPT ::operator delete[](ptr); } -_LIBCPP_WEAK _LIBCPP_NEW_DELETE_VIS -void -operator delete[] (void* ptr, size_t, const std::nothrow_t& nt) _NOEXCEPT -{ - ::operator delete[](ptr, nt); -} - #endif // !__GLIBCXX__ namespace std diff --git a/libcxx/test/std/language.support/support.dynamic/new.delete/new.delete.array/sized_delete_array_nothrow_replace.pass.cpp b/libcxx/test/std/language.support/support.dynamic/new.delete/new.delete.array/sized_delete_array_nothrow_replace.pass.cpp deleted file mode 100644 index 59e8637f263..00000000000 --- a/libcxx/test/std/language.support/support.dynamic/new.delete/new.delete.array/sized_delete_array_nothrow_replace.pass.cpp +++ /dev/null @@ -1,109 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// 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 nothrow sized operator delete[] replacement. - -// Note that sized delete operator definitions below are simply ignored -// when sized deallocation is not supported, e.g., prior to C++14. - -// UNSUPPORTED: sanitizer-new-delete - -#include <new> -#include <cstddef> -#include <cstdlib> -#include <cassert> -#include <limits> - -int unsized_delete_called = 0; -int unsized_delete_nothrow_called = 0; -int sized_delete_called = 0; -int sized_delete_nothrow_called = 0; - -void operator delete[](void* p) throw() -{ - ++unsized_delete_called; - std::free(p); -} - -void operator delete[](void* p, const std::nothrow_t&) throw() -{ - ++unsized_delete_nothrow_called; - std::free(p); -} - -void operator delete[](void* p, std::size_t) throw() -{ - ++sized_delete_called; - std::free(p); -} - -void operator delete[](void* p, std::size_t, const std::nothrow_t&) throw() -{ - ++sized_delete_nothrow_called; - std::free(p); -} - -int new_handler_called = 0; - -void new_handler() -{ - ++new_handler_called; - std::set_new_handler(0); -} - -bool A_constructed = false; - -struct A -{ - A() {A_constructed = true;} - ~A() {A_constructed = false;} -}; - -struct BadA : public A { - BadA() { throw std::bad_alloc(); } -}; - -int main() -{ - std::set_new_handler(new_handler); - try - { - void*volatile vp = operator new [] (std::numeric_limits<std::size_t>::max(), std::nothrow); - assert(new_handler_called == 1); - assert(vp == 0); - } - catch (...) - { - assert(false); - } - try - { - A* ap = new(std::nothrow) BadA [3]; - assert(false); - } - catch (...) - { - assert(!A_constructed); -#if _LIBCPP_STD_VER >= 14 - // FIXME: Do we need a version of [Expr.Delete]#10 for nothrow - // deallocation functions (selecting sized ones whenever available)? - // It is not required by the standard. If it were, the following would - // be the expected behaviour (instead of the current one): - // assert(!unsized_delete_nothrow_called); - // assert(sized_delete_nothrow_called == 1); - assert(unsized_delete_nothrow_called == 1); - assert(!sized_delete_nothrow_called); -#else // if _LIBCPP_STD_VER < 14 - assert(unsized_delete_nothrow_called == 1); - assert(!sized_delete_nothrow_called); -#endif - assert(!unsized_delete_called); - assert(!sized_delete_called); - } -} diff --git a/libcxx/test/std/language.support/support.dynamic/new.delete/new.delete.single/sized_delete_nothrow_replace.pass.cpp b/libcxx/test/std/language.support/support.dynamic/new.delete/new.delete.single/sized_delete_nothrow_replace.pass.cpp deleted file mode 100644 index 2d39f433b3d..00000000000 --- a/libcxx/test/std/language.support/support.dynamic/new.delete/new.delete.single/sized_delete_nothrow_replace.pass.cpp +++ /dev/null @@ -1,109 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// 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 nothrow sized operator delete replacement. - -// Note that sized delete operator definitions below are simply ignored -// when sized deallocation is not supported, e.g., prior to C++14. - -// UNSUPPORTED: sanitizer-new-delete - -#include <new> -#include <cstddef> -#include <cstdlib> -#include <cassert> -#include <limits> - -int unsized_delete_called = 0; -int unsized_delete_nothrow_called = 0; -int sized_delete_called = 0; -int sized_delete_nothrow_called = 0; - -void operator delete(void* p) throw() -{ - ++unsized_delete_called; - std::free(p); -} - -void operator delete(void* p, const std::nothrow_t&) throw() -{ - ++unsized_delete_nothrow_called; - std::free(p); -} - -void operator delete(void* p, std::size_t) throw() -{ - ++sized_delete_called; - std::free(p); -} - -void operator delete(void* p, std::size_t, const std::nothrow_t&) throw() -{ - ++sized_delete_nothrow_called; - std::free(p); -} - -int new_handler_called = 0; - -void new_handler() -{ - ++new_handler_called; - std::set_new_handler(0); -} - -bool A_constructed = false; - -struct A -{ - A() {A_constructed = true;} - ~A() {A_constructed = false;} -}; - -struct BadA : public A { - BadA() { throw std::bad_alloc(); } -}; - -int main() -{ - std::set_new_handler(new_handler); - try - { - void*volatile vp = operator new (std::numeric_limits<std::size_t>::max(), std::nothrow); - assert(new_handler_called == 1); - assert(vp == 0); - } - catch (...) - { - assert(false); - } - try - { - A* ap = new(std::nothrow) BadA; - assert(false); - } - catch (...) - { - assert(!A_constructed); -#if _LIBCPP_STD_VER >= 14 - // FIXME: Do we need a version of [Expr.Delete]#10 for nothrow - // deallocation functions (selecting sized ones whenever available)? - // It is not required by the standard. If it were, the following would - // be the expected behaviour (instead of the current one): - // assert(!unsized_delete_nothrow_called); - // assert(sized_delete_nothrow_called == 1); - assert(unsized_delete_nothrow_called == 1); - assert(!sized_delete_nothrow_called); -#else // if _LIBCPP_STD_VER < 14 - assert(unsized_delete_nothrow_called == 1); - assert(!sized_delete_nothrow_called); -#endif - assert(!unsized_delete_called); - assert(!sized_delete_called); - } -} |

