+2019-02-13 Jonathan Wakely <jwakely@redhat.com>
+
+ PR libstdc++/89345
+ * include/std/version [__cpp_impl_destroying_delete]
+ (__cpp_lib_destroying_delete): Only define for C++2a and later.
+ * libsupc++/new [__cpp_impl_destroying_delete]
+ (__cpp_lib_destroying_delete): Likewise.
+ (destroying_delete_t, destroying_delete): Likewise, but define even
+ when __cpp_impl_destroying_delete is not defined.
+ * testsuite/18_support/destroying_delete.cc: New test.
+
2019-02-11 Jonathan Wakely <jwakely@redhat.com>
PR libstdc++/89023
# define __cpp_lib_uncaught_exceptions 201411L
#endif
-#if __cpp_impl_destroying_delete
-# define __cpp_lib_destroying_delete 201806L
-#endif
-
#if __cplusplus >= 201103L
// c++11
#define __cpp_lib_allocator_is_always_equal 201411
#if __cplusplus > 201703L
// c++2a
+#if __cpp_impl_destroying_delete
+# define __cpp_lib_destroying_delete 201806L
+#endif
#define __cpp_lib_erase_if 201900L
#ifdef _GLIBCXX_HAVE_BUILTIN_IS_CONSTANT_EVALUATED
# define __cpp_lib_is_constant_evaluated 201811L
#endif // _GLIBCXX_HAVE_BUILTIN_LAUNDER
#endif // C++17
-#if __cpp_impl_destroying_delete
-#define __cpp_lib_destroying_delete 201806L
+#if __cplusplus > 201703L
namespace std
{
struct destroying_delete_t
};
inline constexpr destroying_delete_t destroying_delete{};
}
-#endif // destroying delete
+// Only define the feature test macro if the compiler supports the feature:
+#if __cpp_impl_destroying_delete
+# define __cpp_lib_destroying_delete 201806L
+#endif
+#endif // C++20
#pragma GCC visibility pop
--- /dev/null
+// Copyright (C) 2019 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library. This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3. If not see
+// <http://www.gnu.org/licenses/>.
+
+// { dg-options "-std=gnu++2a" }
+// { dg-do run { target c++2a } }
+
+#include <new>
+#include <testsuite_hooks.h>
+
+#ifndef __cpp_lib_destroying_delete
+# error "Feature-test macro for destroying_delete missing"
+#elif __cpp_lib_destroying_delete != 201806L
+# error "Feature-test macro for destroying_delete has wrong value"
+#endif
+
+const std::destroying_delete_t d{};
+static_assert(std::is_same_v<decltype(d), decltype(std::destroying_delete)>);
+
+struct X
+{
+ static bool called;
+
+ void operator delete(X* p, std::destroying_delete_t)
+ {
+ called = true;
+ p->~X();
+ ::operator delete(p);
+ }
+};
+
+bool X::called = false;
+
+void
+test01()
+{
+ X* x = new X;
+ delete x;
+ VERIFY( X::called );
+}
+
+int main()
+{
+ test01();
+}