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 > >