On Tue, Apr 29, 2025 at 11:01 AM Jonathan Wakely <jwak...@redhat.com> wrote:

> This allows removing the _Target_handler class template, because it's no
> longer needed to prevent instantiating invalid specializations of
> _Function_handler.
>
> libstdc++-v3/ChangeLog:
>
>         * include/bits/std_function.h (_Target_handler): Remove.
>         (function::target): Use constexpr-if for C++11 and
>         C++14, with diagnostic pragmas to suppress warnings.
> ---
>
> Tested x86_64-linux.
>
LGTM.

>
>  libstdc++-v3/include/bits/std_function.h | 31 +++++++-----------------
>  1 file changed, 9 insertions(+), 22 deletions(-)
>
> diff --git a/libstdc++-v3/include/bits/std_function.h
> b/libstdc++-v3/include/bits/std_function.h
> index 1bf8b9ad6e8..3bfbe824026 100644
> --- a/libstdc++-v3/include/bits/std_function.h
> +++ b/libstdc++-v3/include/bits/std_function.h
> @@ -135,13 +135,16 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>         static _Functor*
>         _M_get_pointer(const _Any_data& __source) noexcept
>         {
> -         if _GLIBCXX17_CONSTEXPR (__stored_locally)
> +#pragma GCC diagnostic push
> +#pragma GCC diagnostic ignored "-Wc++17-extensions" // if constexpr
> +         if constexpr (__stored_locally)
>             {
>               const _Functor& __f = __source._M_access<_Functor>();
>               return const_cast<_Functor*>(std::__addressof(__f));
>             }
>           else // have stored a pointer
>             return __source._M_access<_Functor*>();
> +#pragma GCC diagnostic pop
>         }
>
>        private:
> @@ -312,21 +315,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>        { return false; }
>      };
>
> -  // Avoids instantiating ill-formed specializations of _Function_handler
> -  // in std::function<_Signature>::target<_Functor>().
> -  // e.g. _Function_handler<Sig, void()> and _Function_handler<Sig, void>
> -  // would be ill-formed.
> -  template<typename _Signature, typename _Functor,
> -          bool __valid = is_object<_Functor>::value>
> -    struct _Target_handler
> -    : _Function_handler<_Signature, typename remove_cv<_Functor>::type>
> -    { };
> -
> -  template<typename _Signature, typename _Functor>
> -    struct _Target_handler<_Signature, _Functor, false>
> -    : _Function_handler<void, void>
> -    { };
> -
>    /**
>     *  @brief Polymorphic function wrapper.
>     *  @ingroup functors
> @@ -644,13 +632,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>         const _Functor*
>         target() const noexcept
>         {
> -         if _GLIBCXX17_CONSTEXPR (is_object<_Functor>::value)
> +#pragma GCC diagnostic push
> +#pragma GCC diagnostic ignored "-Wc++17-extensions" // if constexpr
> +         if constexpr (is_object<_Functor>::value)
>             {
> -             // For C++11 and C++14 if-constexpr is not used above, so
> -             // _Target_handler avoids ill-formed _Function_handler types.
> -             using _Handler = _Target_handler<_Res(_ArgTypes...),
> _Functor>;
> -
> -             if (_M_manager == &_Handler::_M_manager
> +             if (_M_manager == &_Handler<_Functor>::_M_manager
>  #if __cpp_rtti
>                   || (_M_manager && typeid(_Functor) == target_type())
>  #endif
> @@ -661,6 +647,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>                   return __ptr._M_access<const _Functor*>();
>                 }
>             }
> +#pragma GCC diagnostic pop
>           return nullptr;
>         }
>        /// @}
> --
> 2.49.0
>
>

Reply via email to