diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 7cb2c1d5664a52eabaf60f4017d1401f9a8f0544..59c5a8e17e0017958103d15923cf6c58cf3537cc 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,10 @@
+2010-03-22  Paolo Carlini  <paolo.carlini@oracle.com>
+
+	* include/parallel/base.h (_Less): Use std::less.
+	(_Plus): Likewise use std::plus.
+	(_Multiplies): Likewise use std::multiplies.
+	* include/parallel/numeric: Adjust.
+
 2010-03-19  Paolo Carlini  <paolo.carlini@oracle.com>
 
 	* testsuite/17_intro/freestanding.cc: Avoid -Wall warnings.
diff --git a/libstdc++-v3/include/parallel/base.h b/libstdc++-v3/include/parallel/base.h
index 76c3fe6a8404970dd71f23a3d34fb55ede2c3a27..6656b2caabb17a935920a64f4b92270aa854965a 100644
--- a/libstdc++-v3/include/parallel/base.h
+++ b/libstdc++-v3/include/parallel/base.h
@@ -262,63 +262,40 @@ namespace __gnu_parallel
 
   // Partial specialization for one type. Same as std::less.
   template<typename _Tp>
-    struct _Less<_Tp, _Tp> : public std::binary_function<_Tp, _Tp, bool>
-    {
-      bool
-      operator()(const _Tp& __x, const _Tp& __y) const
-      { return __x < __y; }
-    };
-
+    struct _Less<_Tp, _Tp>
+    : public std::less<_Tp> { };
 
   /** @brief Similar to std::plus, but allows two different types. */
-  template<typename _Tp1, typename _Tp2>
-    struct _Plus : public std::binary_function<_Tp1, _Tp2, _Tp1>
+  template<typename _Tp1, typename _Tp2, typename _Result
+	   = __typeof__(*static_cast<_Tp1*>(NULL)
+			+ *static_cast<_Tp2*>(NULL))>
+    struct _Plus : public std::binary_function<_Tp1, _Tp2, _Result>
     {
-      typedef __typeof__(*static_cast<_Tp1*>(NULL)
-			 + *static_cast<_Tp2*>(NULL)) __result;
-
-      __result
+      _Result
       operator()(const _Tp1& __x, const _Tp2& __y) const
       { return __x + __y; }
     };
 
   // Partial specialization for one type. Same as std::plus.
   template<typename _Tp>
-    struct _Plus<_Tp, _Tp> : public std::binary_function<_Tp, _Tp, _Tp>
-    {
-      typedef __typeof__(*static_cast<_Tp*>(NULL)
-			 + *static_cast<_Tp*>(NULL)) __result;
-
-      __result
-      operator()(const _Tp& __x, const _Tp& __y) const
-      { return __x + __y; }
-    };
-
+    struct _Plus<_Tp, _Tp, _Tp>
+    : public std::plus<_Tp> { };
 
   /** @brief Similar to std::multiplies, but allows two different types. */
-  template<typename _Tp1, typename _Tp2>
-    struct _Multiplies : public std::binary_function<_Tp1, _Tp2, _Tp1>
+  template<typename _Tp1, typename _Tp2, typename _Result
+	   = __typeof__(*static_cast<_Tp1*>(NULL)
+			* *static_cast<_Tp2*>(NULL))>
+    struct _Multiplies : public std::binary_function<_Tp1, _Tp2, _Result>
     {
-      typedef __typeof__(*static_cast<_Tp1*>(NULL)
-			 * *static_cast<_Tp2*>(NULL)) __result;
-
-      __result
+      _Result
       operator()(const _Tp1& __x, const _Tp2& __y) const
       { return __x * __y; }
     };
 
   // Partial specialization for one type. Same as std::multiplies.
   template<typename _Tp>
-    struct _Multiplies<_Tp, _Tp> : public std::binary_function<_Tp, _Tp, _Tp>
-    {
-      typedef __typeof__(*static_cast<_Tp*>(NULL)
-			 * *static_cast<_Tp*>(NULL)) __result;
-
-      __result
-      operator()(const _Tp& __x, const _Tp& __y) const
-      { return __x * __y; }
-    };
-
+    struct _Multiplies<_Tp, _Tp, _Tp>
+    : public std::multiplies<_Tp> { };
 
   template<typename _Tp, typename _DifferenceTp>
     class _PseudoSequence;
diff --git a/libstdc++-v3/include/parallel/numeric b/libstdc++-v3/include/parallel/numeric
index eff597ea70a15d817f0ae3fefad9a7337011a55c..76916ff3ecb9a92177cf6c7b8bffacb31271de70 100644
--- a/libstdc++-v3/include/parallel/numeric
+++ b/libstdc++-v3/include/parallel/numeric
@@ -281,7 +281,7 @@ namespace __parallel
       typedef typename _TraitsType2::value_type _ValueType2;
 
       typedef typename
-        __gnu_parallel::_Multiplies<_ValueType1, _ValueType2>::__result
+        __gnu_parallel::_Multiplies<_ValueType1, _ValueType2>::result_type
         _MultipliesResultType;
       return inner_product(__first1, __last1, __first2, __init,
                            __gnu_parallel::_Plus<_Tp, _MultipliesResultType>(),
@@ -301,7 +301,7 @@ namespace __parallel
       typedef typename _TraitsType2::value_type _ValueType2;
 
       typedef typename
-        __gnu_parallel::_Multiplies<_ValueType1, _ValueType2>::__result
+        __gnu_parallel::_Multiplies<_ValueType1, _ValueType2>::result_type
         _MultipliesResultType;
       return inner_product(__first1, __last1, __first2, __init,
                            __gnu_parallel::_Plus<_Tp, _MultipliesResultType>(),