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.

 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