summaryrefslogtreecommitdiffstats
path: root/libcxx/test/std/language.support
diff options
context:
space:
mode:
authorEric Fiselier <eric@efcs.ca>2019-05-23 23:46:44 +0000
committerEric Fiselier <eric@efcs.ca>2019-05-23 23:46:44 +0000
commitae02e8944807c7b611ca3645a983c62d464f27a4 (patch)
treeac2437b2aca07fcb3cd9239bf56142a85c74aa29 /libcxx/test/std/language.support
parentffafdb9afc84126fe3156b8075bc3d7d3dad6dfe (diff)
downloadbcm5719-llvm-ae02e8944807c7b611ca3645a983c62d464f27a4.tar.gz
bcm5719-llvm-ae02e8944807c7b611ca3645a983c62d464f27a4.zip
P0722R3: Implement library support for destroying delete
Summary: This provides the `std::destroying_delete_t` declaration in C++2a and after. (Even when the compiler doesn't support the language feature). However, the feature test macro `__cpp_lib_destroying_delete` is only defined when we have both language support and C++2a. Reviewers: ldionne, ckennelly, serge-sans-paille, EricWF Reviewed By: EricWF Subscribers: dexonsmith, riccibruno, christof, jwakely, jdoerfert, mclow.lists, ldionne, libcxx-commits Differential Revision: https://reviews.llvm.org/D55840 llvm-svn: 361572
Diffstat (limited to 'libcxx/test/std/language.support')
-rw-r--r--libcxx/test/std/language.support/support.dynamic/destroying_delete_t.pass.cpp65
-rw-r--r--libcxx/test/std/language.support/support.limits/support.limits.general/new.version.pass.cpp6
-rw-r--r--libcxx/test/std/language.support/support.limits/support.limits.general/version.version.pass.cpp6
3 files changed, 71 insertions, 6 deletions
diff --git a/libcxx/test/std/language.support/support.dynamic/destroying_delete_t.pass.cpp b/libcxx/test/std/language.support/support.dynamic/destroying_delete_t.pass.cpp
new file mode 100644
index 00000000000..d544b0e7cab
--- /dev/null
+++ b/libcxx/test/std/language.support/support.dynamic/destroying_delete_t.pass.cpp
@@ -0,0 +1,65 @@
+//===----------------------------------------------------------------------===//
+//
+// 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.
+//
+//===----------------------------------------------------------------------===//
+
+// struct destroying_delete_t {
+// explicit destroying_delete_t() = default;
+// };
+// inline constexpr destroying_delete_t destroying_delete{};
+
+// UNSUPPORTED: c++98, c++03, c++11, c++14, c++17
+
+#include <new>
+
+#include <cassert>
+#include "test_macros.h"
+
+struct A {
+ void *data;
+ A();
+ ~A();
+
+ static A* New();
+ void operator delete(A*, std::destroying_delete_t);
+};
+
+bool A_constructed = false;
+bool A_destroyed = false;
+bool A_destroying_deleted = false;
+
+A::A() {
+ A_constructed = true;
+}
+
+A::~A() {
+ A_destroyed = true;
+}
+
+A* A::New() {
+ return new(::operator new(sizeof(A))) A();
+}
+
+void A::operator delete(A* a, std::destroying_delete_t) {
+ A_destroying_deleted = true;
+ ::operator delete(a);
+}
+
+#ifndef __cpp_lib_destroying_delete
+#error "Expected __cpp_lib_destroying_delete to be defined"
+#elif __cpp_lib_destroying_delete < 201806L
+#error "Unexpected value of __cpp_lib_destroying_delete"
+#endif
+
+int main() {
+ // Ensure that we call the destroying delete and not the destructor.
+ A* ap = A::New();
+ assert(A_constructed);
+ delete ap;
+ assert(!A_destroyed);
+ assert(A_destroying_deleted);
+}
diff --git a/libcxx/test/std/language.support/support.limits/support.limits.general/new.version.pass.cpp b/libcxx/test/std/language.support/support.limits/support.limits.general/new.version.pass.cpp
index 5f012cd55f6..294c29a739f 100644
--- a/libcxx/test/std/language.support/support.limits/support.limits.general/new.version.pass.cpp
+++ b/libcxx/test/std/language.support/support.limits/support.limits.general/new.version.pass.cpp
@@ -72,16 +72,16 @@
#elif TEST_STD_VER > 17
-# if !defined(_LIBCPP_VERSION)
+# if TEST_STD_VER > 17 && defined(__cpp_impl_destroying_delete) && __cpp_impl_destroying_delete >= 201806L
# ifndef __cpp_lib_destroying_delete
# error "__cpp_lib_destroying_delete should be defined in c++2a"
# endif
# if __cpp_lib_destroying_delete != 201806L
# error "__cpp_lib_destroying_delete should have the value 201806L in c++2a"
# endif
-# else // _LIBCPP_VERSION
+# else
# ifdef __cpp_lib_destroying_delete
-# error "__cpp_lib_destroying_delete should not be defined because it is unimplemented in libc++!"
+# error "__cpp_lib_destroying_delete should not be defined when TEST_STD_VER > 17 && defined(__cpp_impl_destroying_delete) && __cpp_impl_destroying_delete >= 201806L is not defined!"
# endif
# endif
diff --git a/libcxx/test/std/language.support/support.limits/support.limits.general/version.version.pass.cpp b/libcxx/test/std/language.support/support.limits/support.limits.general/version.version.pass.cpp
index 0ed0a512286..3503051afad 100644
--- a/libcxx/test/std/language.support/support.limits/support.limits.general/version.version.pass.cpp
+++ b/libcxx/test/std/language.support/support.limits/support.limits.general/version.version.pass.cpp
@@ -1662,16 +1662,16 @@
# endif
# endif
-# if !defined(_LIBCPP_VERSION)
+# if TEST_STD_VER > 17 && defined(__cpp_impl_destroying_delete) && __cpp_impl_destroying_delete >= 201806L
# ifndef __cpp_lib_destroying_delete
# error "__cpp_lib_destroying_delete should be defined in c++2a"
# endif
# if __cpp_lib_destroying_delete != 201806L
# error "__cpp_lib_destroying_delete should have the value 201806L in c++2a"
# endif
-# else // _LIBCPP_VERSION
+# else
# ifdef __cpp_lib_destroying_delete
-# error "__cpp_lib_destroying_delete should not be defined because it is unimplemented in libc++!"
+# error "__cpp_lib_destroying_delete should not be defined when TEST_STD_VER > 17 && defined(__cpp_impl_destroying_delete) && __cpp_impl_destroying_delete >= 201806L is not defined!"
# endif
# endif
OpenPOWER on IntegriCloud