diff mbox

[v3] fix libstdc++/58569

Message ID CAH6eHdQ2O3YL0R8TTQbVO8Yu-YoykJyTJqQecU1xqsfck4nwDA@mail.gmail.com
State New
Headers show

Commit Message

Jonathan Wakely Oct. 2, 2013, 8:22 p.m. UTC
2013-10-02  Jonathan Wakely  <jwakely.gcc@gmail.com>
            Daniel Krugler  <daniel.kruegler@gmail.com>

        PR libstdc++/58569
        * include/std/functional (function::_CheckResult): Move to namespace
        scope and rename to __check_func_return_type.
        * testsuite/20_util/function/58569.cc: New.

Tested x86_64-linux, committed to trunk and 4.8 branch
commit 2a14c82b439cdce90ac4008e03b69e3e734931c3
Author: Jonathan Wakely <jwakely.gcc@gmail.com>
Date:   Tue Oct 1 11:10:06 2013 +0100

    2013-10-02  Jonathan Wakely  <jwakely.gcc@gmail.com>
    	    Daniel Krugler  <daniel.kruegler@gmail.com>
    
    	PR libstdc++/58569
    	* include/std/functional (function::_CheckResult): Move to namespace
    	scope and rename to __check_func_return_type.
    	* testsuite/20_util/function/58569.cc: New.
diff mbox

Patch

diff --git a/libstdc++-v3/include/std/functional b/libstdc++-v3/include/std/functional
index 73cddfe..eaa4509 100644
--- a/libstdc++-v3/include/std/functional
+++ b/libstdc++-v3/include/std/functional
@@ -2128,6 +2128,10 @@  _GLIBCXX_HAS_NESTED_TYPE(result_type)
       }
     };
 
+  template<typename _From, typename _To>
+    using __check_func_return_type
+      = __or_<is_void<_To>, is_convertible<_From, _To>>;
+
   /**
    *  @brief Primary class template for std::function.
    *  @ingroup functors
@@ -2145,16 +2149,8 @@  _GLIBCXX_HAS_NESTED_TYPE(result_type)
 	using _Invoke = decltype(__callable_functor(std::declval<_Functor&>())
 				 (std::declval<_ArgTypes>()...) );
 
-      template<typename _CallRes, typename _Res1>
-	struct _CheckResult
-	: is_convertible<_CallRes, _Res1> { };
-
-      template<typename _CallRes>
-	struct _CheckResult<_CallRes, void>
-	: true_type { };
-
       template<typename _Functor>
-	using _Callable = _CheckResult<_Invoke<_Functor>, _Res>;
+	using _Callable = __check_func_return_type<_Invoke<_Functor>, _Res>;
 
       template<typename _Cond, typename _Tp>
 	using _Requires = typename enable_if<_Cond::value, _Tp>::type;
diff --git a/libstdc++-v3/testsuite/20_util/function/58569.cc b/libstdc++-v3/testsuite/20_util/function/58569.cc
new file mode 100644
index 0000000..f1e67bc
--- /dev/null
+++ b/libstdc++-v3/testsuite/20_util/function/58569.cc
@@ -0,0 +1,29 @@ 
+// { dg-options "-std=gnu++11" }
+// { dg-do compile }
+// Copyright (C) 2013 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+// libstdc++/58569
+
+#include <functional>
+
+struct foo {
+  std::function<foo (int)> x;
+  std::function<foo ()> y;
+};
+
+foo a;