diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 68154d175b4118e160db4227ff6bfeaf5ba4770b..98bf0c5551d218560e6434975e71ba6ce61fc8a9 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,9 @@
+2009-03-14  Paolo Carlini  <paolo.carlini@oracle.com>
+
+	* include/std/type_traits (__add_lvalue_reference_helper,
+	__add_rvalue_reference_helper): As an optimization, rewrite
+	condition (avoid is_function).
+
 2009-03-13  Paolo Carlini  <paolo.carlini@oracle.com>
 
 	PR libstdc++/39405
diff --git a/libstdc++-v3/include/std/type_traits b/libstdc++-v3/include/std/type_traits
index 132a92459e3d17f36c784ec66eedb40447ae0816..130d504d90302f13645433a39e51f930435d84e2 100644
--- a/libstdc++-v3/include/std/type_traits
+++ b/libstdc++-v3/include/std/type_traits
@@ -111,7 +111,7 @@ namespace std
     { typedef _Tp   type; };
 
   template<typename _Tp,
-	   bool = is_object<_Tp>::value || is_function<_Tp>::value,
+	   bool = !is_reference<_Tp>::value && !is_void<_Tp>::value,
 	   bool = is_rvalue_reference<_Tp>::value>
     struct __add_lvalue_reference_helper
     { typedef _Tp   type; };
@@ -131,7 +131,7 @@ namespace std
     { };
 
   template<typename _Tp,
-	   bool = is_object<_Tp>::value || is_function<_Tp>::value>
+	   bool = !is_reference<_Tp>::value && !is_void<_Tp>::value>
     struct __add_rvalue_reference_helper
     { typedef _Tp   type; };