Revert fix for libstdc++/35637, thanks to other/36901.
authorPaolo Carlini <paolo.carlini@oracle.com>
Sat, 9 Aug 2008 15:58:52 +0000 (15:58 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Sat, 9 Aug 2008 15:58:52 +0000 (15:58 +0000)
2008-08-09  Paolo Carlini  <paolo.carlini@oracle.com>

Revert fix for libstdc++/35637, thanks to other/36901.
* include/tr1_impl/type_traits (__is_function_helper): New, uses
variadic templates.
(is_function): Forward to the latter.
(__in_array): Remove.

From-SVN: r138906

libstdc++-v3/ChangeLog
libstdc++-v3/include/tr1_impl/type_traits

index af0bee0627c7762dbb7cd2d6c45a68fb52f5f125..c96ab5ad519632550dafe914b00dc4ac348afd8b 100644 (file)
@@ -1,3 +1,11 @@
+2008-08-09  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       Revert fix for libstdc++/35637, thanks to other/36901.
+       * include/tr1_impl/type_traits (__is_function_helper): New, uses
+       variadic templates.
+       (is_function): Forward to the latter.
+       (__in_array): Remove.
+
 2008-08-09  Paolo Carlini  <paolo.carlini@oracle.com>
 
        * config/locale/darwin/ctype_members.cc: Include <cstdio>.
index 87633fa9804167265d3e8360f335ffeef5535be9..3a3d66f1b6529d9d4fea560373d53caa32fc8f0c 100644 (file)
@@ -183,30 +183,25 @@ _GLIBCXX_BEGIN_NAMESPACE_TR1
     { };
 
   template<typename _Tp>
-    struct __in_array
-    : public __sfinae_types
-    {
-    private:
-      template<typename _Up>
-        static __one __test(_Up(*)[1]);
-      template<typename>
-        static __two __test(...);
-    
-    public:
-      static const bool __value = sizeof(__test<_Tp>(0)) == 1;
-    };
+    struct remove_cv;
 
-  /// is_abstract
-  template<typename _Tp>
-    struct is_abstract;
+  template<typename>
+    struct __is_function_helper
+    : public false_type { };
+
+  template<typename _Res, typename... _ArgTypes>
+    struct __is_function_helper<_Res(_ArgTypes...)>
+    : public true_type { };
+
+  template<typename _Res, typename... _ArgTypes>
+    struct __is_function_helper<_Res(_ArgTypes......)>
+    : public true_type { };
 
   /// is_function
   template<typename _Tp>
     struct is_function
-    : public integral_constant<bool, !(__in_array<_Tp>::__value
-                                      || is_abstract<_Tp>::value
-                                      || is_reference<_Tp>::value
-                                      || is_void<_Tp>::value)>
+    : public integral_constant<bool, (__is_function_helper<typename
+                                     remove_cv<_Tp>::type>::value)>
     { };
 
   /// composite type traits [4.5.2].