diff options
author | Eric Fiselier <eric@efcs.ca> | 2019-05-23 23:46:44 +0000 |
---|---|---|
committer | Eric Fiselier <eric@efcs.ca> | 2019-05-23 23:46:44 +0000 |
commit | ae02e8944807c7b611ca3645a983c62d464f27a4 (patch) | |
tree | ac2437b2aca07fcb3cd9239bf56142a85c74aa29 /libcxx/test/std/language.support | |
parent | ffafdb9afc84126fe3156b8075bc3d7d3dad6dfe (diff) | |
download | bcm5719-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')
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 |