From 7af436ada243bbb6ae601c85bd47ea908c71fb41 Mon Sep 17 00:00:00 2001 From: Jonathan Wakely Date: Wed, 22 Nov 2023 15:09:24 +0000 Subject: [PATCH] libstdc++: Optimize std::is_trivially_destructible_v This reduces the overhead of using std::is_trivially_destructible_v and as a result fixes some recent regressions seen with a non-default GLIBCXX_TESTSUITE_STDS env var: FAIL: 20_util/variant/87619.cc -std=gnu++20 (test for excess errors) FAIL: 20_util/variant/87619.cc -std=gnu++23 (test for excess errors) FAIL: 20_util/variant/87619.cc -std=gnu++26 (test for excess errors) libstdc++-v3/ChangeLog: * include/std/type_traits (is_trivially_destructible_v): Use built-in directly when concepts are supported. * testsuite/20_util/is_trivially_destructible/value_v.cc: New test. --- libstdc++-v3/include/std/type_traits | 19 +++++++++ .../is_trivially_destructible/value_v.cc | 40 +++++++++++++++++++ 2 files changed, 59 insertions(+) create mode 100644 libstdc++-v3/testsuite/20_util/is_trivially_destructible/value_v.cc diff --git a/libstdc++-v3/include/std/type_traits b/libstdc++-v3/include/std/type_traits index 3b1b419bbbb..1cec0822b73 100644 --- a/libstdc++-v3/include/std/type_traits +++ b/libstdc++-v3/include/std/type_traits @@ -3410,9 +3410,28 @@ template inline constexpr bool is_trivially_move_assignable_v = __is_trivially_assignable(__add_lval_ref_t<_Tp>, __add_rval_ref_t<_Tp>); + +#if __cpp_concepts +template + inline constexpr bool is_trivially_destructible_v = false; + +template + requires (!is_reference_v<_Tp>) && requires (_Tp& __t) { __t.~_Tp(); } + inline constexpr bool is_trivially_destructible_v<_Tp> + = __has_trivial_destructor(_Tp); +template + inline constexpr bool is_trivially_destructible_v<_Tp&> = true; +template + inline constexpr bool is_trivially_destructible_v<_Tp&&> = true; +template + inline constexpr bool is_trivially_destructible_v<_Tp[_Nm]> + = is_trivially_destructible_v<_Tp>; +#else template inline constexpr bool is_trivially_destructible_v = is_trivially_destructible<_Tp>::value; +#endif + template inline constexpr bool is_nothrow_constructible_v = __is_nothrow_constructible(_Tp, _Args...); diff --git a/libstdc++-v3/testsuite/20_util/is_trivially_destructible/value_v.cc b/libstdc++-v3/testsuite/20_util/is_trivially_destructible/value_v.cc new file mode 100644 index 00000000000..7db098a2c4d --- /dev/null +++ b/libstdc++-v3/testsuite/20_util/is_trivially_destructible/value_v.cc @@ -0,0 +1,40 @@ +// { dg-do compile { target c++17 } } +#include +#include + +template +constexpr void test_cv() +{ + static_assert(std::is_trivially_destructible_v + == std::is_trivially_destructible_v); + static_assert(std::is_trivially_destructible_v + == std::is_trivially_destructible_v); + static_assert(std::is_trivially_destructible_v + == std::is_trivially_destructible_v); +} + +template +void test() +{ + static_assert(std::is_trivially_destructible_v == Expected); + test_cv(); +} + +void test01() +{ + using namespace __gnu_test; + + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); +}