[PATCH] libstdc++: Use new __is_destructible built-in in <type_traits>
Tomasz Kaminski
tkaminsk@redhat.com
Tue Jun 3 09:54:04 GMT 2025
On Mon, Jun 2, 2025 at 10:56 PM Jonathan Wakely <jwakely@redhat.com> wrote:
> libstdc++-v3/ChangeLog:
>
> * include/std/type_traits (is_destructible, is_destructible_v):
> Define using new built-in.
> (is_nothrow_destructible, is_nothrow_destructible_v): Likewise.
> (is_trivially_destructible, is_trivially_destructible_v):
> Likewise.
> ---
>
> Thanks to Jason's latest fixes, the new built-in now allows us to
> replace the complicated class templates that implement these traits.
>
> Tested x86_64-linux.
>
LGTM. I wouldn't think about updating variable traits.
>
> libstdc++-v3/include/std/type_traits | 42 ++++++++++++++++++++++++++--
> 1 file changed, 40 insertions(+), 2 deletions(-)
>
> diff --git a/libstdc++-v3/include/std/type_traits
> b/libstdc++-v3/include/std/type_traits
> index 6bf355d97cc9..c8907fe4d382 100644
> --- a/libstdc++-v3/include/std/type_traits
> +++ b/libstdc++-v3/include/std/type_traits
> @@ -1039,6 +1039,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>
> // Destructible and constructible type properties.
>
> +#if _GLIBCXX_USE_BUILTIN_TRAIT(__is_destructible)
> + /// is_destructible
> + template<typename _Tp>
> + struct is_destructible
> + : public __bool_constant<__is_destructible(_Tp)>
> + { };
> +#else
> // In N3290 is_destructible does not say anything about function
> // types and abstract types, see LWG 2049. This implementation
> // describes function types as non-destructible and all complete
> @@ -1090,7 +1097,15 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>
> static_assert(std::__is_complete_or_unbounded(__type_identity<_Tp>{}),
> "template argument must be a complete class or an unbounded
> array");
> };
> +#endif
>
> +#if _GLIBCXX_USE_BUILTIN_TRAIT(__is_nothrow_destructible)
> + /// is_nothrow_destructible
> + template<typename _Tp>
> + struct is_nothrow_destructible
> + : public __bool_constant<__is_nothrow_destructible(_Tp)>
> + { };
> +#else
> /// @cond undocumented
>
> // is_nothrow_destructible requires that is_destructible is
> @@ -1144,6 +1159,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>
> static_assert(std::__is_complete_or_unbounded(__type_identity<_Tp>{}),
> "template argument must be a complete class or an unbounded
> array");
> };
> +#endif
>
> /// @cond undocumented
> template<typename _Tp, typename... _Args>
> @@ -1451,6 +1467,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> "template argument must be a complete class or an unbounded
> array");
> };
>
> +#if _GLIBCXX_USE_BUILTIN_TRAIT(__is_trivially_destructible)
> + /// is_trivially_destructible
> + template<typename _Tp>
> + struct is_trivially_destructible
> + : public __bool_constant<__is_trivially_destructible(_Tp)>
> + { };
> +#else
> /// is_trivially_destructible
> template<typename _Tp>
> struct is_trivially_destructible
> @@ -1460,7 +1483,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>
> static_assert(std::__is_complete_or_unbounded(__type_identity<_Tp>{}),
> "template argument must be a complete class or an unbounded
> array");
> };
> -
> +#endif
>
> /// has_virtual_destructor
> template<typename _Tp>
> @@ -3581,8 +3604,13 @@ template <typename _Tp>
> inline constexpr bool is_move_assignable_v
> = __is_assignable(__add_lval_ref_t<_Tp>, __add_rval_ref_t<_Tp>);
>
> +#if _GLIBCXX_USE_BUILTIN_TRAIT(__is_destructible)
> +template <typename _Tp>
> + inline constexpr bool is_destructible_v = __is_destructible(_Tp);
> +#else
> template <typename _Tp>
> inline constexpr bool is_destructible_v = is_destructible<_Tp>::value;
> +#endif
>
> template <typename _Tp, typename... _Args>
> inline constexpr bool is_trivially_constructible_v
> @@ -3609,7 +3637,11 @@ template <typename _Tp>
> = __is_trivially_assignable(__add_lval_ref_t<_Tp>,
> __add_rval_ref_t<_Tp>);
>
> -#if __cpp_concepts
> +#if _GLIBCXX_USE_BUILTIN_TRAIT(__is_trivially_destructible)
> +template <typename _Tp>
> + inline constexpr bool is_trivially_destructible_v
> + = __is_trivially_destructible(_Tp);
> +#elif __cpp_concepts
> template <typename _Tp>
> inline constexpr bool is_trivially_destructible_v = false;
>
> @@ -3654,9 +3686,15 @@ template <typename _Tp>
> inline constexpr bool is_nothrow_move_assignable_v
> = __is_nothrow_assignable(__add_lval_ref_t<_Tp>,
> __add_rval_ref_t<_Tp>);
>
> +#if _GLIBCXX_USE_BUILTIN_TRAIT(__is_nothrow_destructible)
> +template <typename _Tp>
> + inline constexpr bool is_nothrow_destructible_v
> + = __is_nothrow_destructible(_Tp);
> +#else
> template <typename _Tp>
> inline constexpr bool is_nothrow_destructible_v =
> is_nothrow_destructible<_Tp>::value;
> +#endif
>
> template <typename _Tp>
> inline constexpr bool has_virtual_destructor_v
> --
> 2.49.0
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://gcc.gnu.org/pipermail/libstdc++/attachments/20250603/28b5f74b/attachment.htm>
More information about the Libstdc++
mailing list