On Mon, Jun 2, 2025 at 10:56 PM Jonathan Wakely <jwak...@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 > >