summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarshall Clow <mclow.lists@gmail.com>2015-05-18 17:48:45 +0000
committerMarshall Clow <mclow.lists@gmail.com>2015-05-18 17:48:45 +0000
commit0e166e5a9a98ab9112d9d07e9e5c9af300730211 (patch)
tree325a941e8a61a930cb6cd2ef0cd4188088a62a65
parent12c41af07c95e3e640f8dfe4699328ef4f1824e6 (diff)
downloadbcm5719-llvm-0e166e5a9a98ab9112d9d07e9e5c9af300730211.tar.gz
bcm5719-llvm-0e166e5a9a98ab9112d9d07e9e5c9af300730211.zip
Fix for LWG Issue 2458: N3778 and new library deallocation signatures.
llvm-svn: 237592
-rw-r--r--libcxx/include/new6
-rw-r--r--libcxx/src/new.cpp14
-rw-r--r--libcxx/test/std/language.support/support.dynamic/new.delete/new.delete.array/sized_delete_array_nothrow_replace.pass.cpp109
-rw-r--r--libcxx/test/std/language.support/support.dynamic/new.delete/new.delete.single/sized_delete_nothrow_replace.pass.cpp109
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);
- }
-}
OpenPOWER on IntegriCloud