diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index a7fbfd8ddd06e8b22b52b264ecde1830d517462a..4e706aa0b710080afdb92264a3bb82bcd029186f 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,19 @@
+2009-12-31  Paolo Carlini  <paolo.carlini@oracle.com>
+
+	* include/std/type_traits (__is_constructible_helper1): Rename
+	to __is_constructible_helper1, tweaked to a specialization of
+	__is_constructible_helper.
+	(is_constructible): Adjust; minor formatting and stylistic
+	changes throughout.
+	* testsuite/util/testsuite_tr1.h (test_relationship): Change
+	variadic version to an overload of test_property.
+	* testsuite/20_util/is_constructible/value.cc: Adjust.
+	* testsuite/20_util/make_signed/requirements/typedefs_neg.cc:
+	Adjust dg-error line numbers.
+	* testsuite/20_util/make_unsigned/requirements/typedefs_neg.cc:
+	Likewise.
+	* testsuite/20_util/declval/requirements/1_neg.cc: Likewise.
+
 2009-12-30  Paolo Carlini  <paolo.carlini@oracle.com>
 
 	* include/std/type_traits: Fix minor formatting nit.
diff --git a/libstdc++-v3/include/std/type_traits b/libstdc++-v3/include/std/type_traits
index 6806b138d0f45d5911300f63d1a2683ee8955428..a784bee1825a03d70b3eb8210a5805c064515f5a 100644
--- a/libstdc++-v3/include/std/type_traits
+++ b/libstdc++-v3/include/std/type_traits
@@ -173,6 +173,18 @@ namespace std
 
   // Member introspection.
 
+  /// is_trivial
+  template<typename _Tp>
+    struct is_trivial
+    : public integral_constant<bool, __is_trivial(_Tp)>
+    { };
+
+  /// is_standard_layout
+  template<typename _Tp>
+    struct is_standard_layout
+    : public integral_constant<bool, __is_standard_layout(_Tp)>
+    { };
+
   /// is_pod
   // Could use is_standard_layout && is_trivial instead of the builtin.
   template<typename _Tp>
@@ -180,10 +192,46 @@ namespace std
     : public integral_constant<bool, __is_pod(_Tp)>
     { };
 
-  /// is_standard_layout
   template<typename _Tp>
-    struct is_standard_layout
-    : public integral_constant<bool, __is_standard_layout(_Tp)>
+    typename add_rvalue_reference<_Tp>::type declval();
+
+  template<typename _Tp, typename... _Args>
+    class __is_constructible_helper
+    : public __sfinae_types
+    {
+      template<typename _Tp1, typename... __Args1>
+        static decltype(_Tp1(declval<__Args1>()...), __one()) __test(int);
+
+      template<typename, typename...>
+        static __two __test(...);
+
+    public:
+      static const bool __value = sizeof(__test<_Tp, _Args...>(0)) == 1;
+    };
+
+  template<typename _Tp, typename _Arg>
+    class __is_constructible_helper<_Tp, _Arg>
+    : public __sfinae_types
+    {
+      template<typename _Tp1, typename _Arg1>
+        static decltype(static_cast<_Tp1>(declval<_Arg1>()), __one())
+	__test(int);
+
+      template<typename, typename>
+        static __two __test(...);
+
+    public:
+      static const bool __value = sizeof(__test<_Tp, _Arg>(0)) == 1;
+    };
+
+  /// is_constructible
+  // XXX FIXME
+  // The C++0x specifications require front-end support, see N2255.
+  template<typename _Tp, typename... _Args>
+    struct is_constructible
+    : public integral_constant<bool,
+			       __is_constructible_helper<_Tp,
+							 _Args...>::__value>
     { };
 
   /// has_trivial_default_constructor
@@ -210,12 +258,6 @@ namespace std
     : public integral_constant<bool, __has_trivial_destructor(_Tp)>
     { };
 
-  /// is_trivial
-  template<typename _Tp>
-    struct is_trivial
-    : public integral_constant<bool, __is_trivial(_Tp)>
-    { };
-
   /// has_nothrow_default_constructor
   template<typename _Tp>
     struct has_nothrow_default_constructor
@@ -234,16 +276,14 @@ namespace std
     : public integral_constant<bool, __has_nothrow_assign(_Tp)>
     { };
 
+  // Relationships between types.
+
   /// is_base_of
   template<typename _Base, typename _Derived>
     struct is_base_of
     : public integral_constant<bool, __is_base_of(_Base, _Derived)>
     { };
 
-  template<typename _Tp>
-    typename add_rvalue_reference<_Tp>::type declval();
-
-  // Relationships between types.
   template<typename _From, typename _To,
 	   bool = (is_void<_From>::value || is_void<_To>::value
 		   || is_function<_To>::value || is_array<_To>::value)>
@@ -252,10 +292,9 @@ namespace std
 				   && is_void<_To>::value); };
 
   template<typename _From, typename _To>
-    struct __is_convertible_helper<_From, _To, false>
+    class __is_convertible_helper<_From, _To, false>
     : public __sfinae_types
     {
-    private:
       static __one __test(_To);
       static __two __test(...);
 
@@ -263,59 +302,16 @@ namespace std
       static const bool __value = sizeof(__test(declval<_From>())) == 1;
     };
 
+  /// is_convertible
   // XXX FIXME
   // The C++0x specifications require front-end support, see N2255.
-  /// is_convertible
   template<typename _From, typename _To>
     struct is_convertible
     : public integral_constant<bool,
 			       __is_convertible_helper<_From, _To>::__value>
     { };
 
-  template<typename _To, typename... _From>
-    struct __is_constructible_helper
-    : public __sfinae_types
-    {
-    private:
-      template<typename _To1, typename... _From1>
-        static decltype(_To1(declval<_From1>()...), __one()) __test(int);
-
-      template<typename, typename...>
-        static __two __test(...);
-
-    public:
-      static const bool __value = sizeof(__test<_To, _From...>(0)) == 1;
-    };
-
-  template<typename _To, typename... _From>
-    struct is_constructible
-    : public integral_constant<bool,
-			       __is_constructible_helper<_To,
-							 _From...>::__value>
-    { };
-
-  template<typename _To, typename _From>
-    struct __is_constructible_helper1
-    : public __sfinae_types
-    {
-    private:
-      template<typename _To1, typename _From1>
-        static decltype(static_cast<_To1>(declval<_From1>()), __one())
-	__test(int);
-
-      template<typename, typename>
-        static __two __test(...);
-
-    public:
-      static const bool __value = sizeof(__test<_To, _From>(0)) == 1;
-    };
-
-  template<typename _To, typename _From>
-    struct is_constructible<_To, _From>
-    : public integral_constant<bool,
-			       __is_constructible_helper1<_To, _From>::__value>
-    { };
-
+  /// is_explicitly_convertible
   template<typename _From, typename _To>
     struct is_explicitly_convertible
     : public is_constructible<_To, _From>
@@ -401,9 +397,8 @@ namespace std
 
   /// decay
   template<typename _Tp> 
-    struct decay 
+    class decay 
     { 
-    private:
       typedef typename remove_reference<_Tp>::type __remove_type;
 
     public:
@@ -434,9 +429,8 @@ namespace std
   template<typename _Qualified, typename _Unqualified,
 	   bool _IsConst = is_const<_Qualified>::value,
 	   bool _IsVol = is_volatile<_Qualified>::value>
-    struct __match_cv_qualifiers
+    class __match_cv_qualifiers
     {
-    private:
       typedef __cv_selector<_Unqualified, _IsConst, _IsVol> __match;
 
     public:
@@ -478,12 +472,11 @@ namespace std
   template<typename _Tp, 
 	   bool _IsInt = is_integral<_Tp>::value,
 	   bool _IsEnum = is_enum<_Tp>::value>
-    struct __make_unsigned_selector;
-  
+    class __make_unsigned_selector;
+
   template<typename _Tp>
-    struct __make_unsigned_selector<_Tp, true, false>
+    class __make_unsigned_selector<_Tp, true, false>
     {
-    private:
       typedef __make_unsigned<typename remove_cv<_Tp>::type> __unsignedt;
       typedef typename __unsignedt::__type __unsigned_type;
       typedef __match_cv_qualifiers<_Tp, __unsigned_type> __cv_unsigned;
@@ -493,9 +486,8 @@ namespace std
     };
 
   template<typename _Tp>
-    struct __make_unsigned_selector<_Tp, false, true>
+    class __make_unsigned_selector<_Tp, false, true>
     {
-    private:
       // With -fshort-enums, an enum may be as small as a char.
       typedef unsigned char __smallest;
       static const bool __b0 = sizeof(_Tp) <= sizeof(__smallest);
@@ -557,12 +549,11 @@ namespace std
   template<typename _Tp, 
 	   bool _IsInt = is_integral<_Tp>::value,
 	   bool _IsEnum = is_enum<_Tp>::value>
-    struct __make_signed_selector;
-  
+    class __make_signed_selector;
+
   template<typename _Tp>
-    struct __make_signed_selector<_Tp, true, false>
+    class __make_signed_selector<_Tp, true, false>
     {
-    private:
       typedef __make_signed<typename remove_cv<_Tp>::type> __signedt;
       typedef typename __signedt::__type __signed_type;
       typedef __match_cv_qualifiers<_Tp, __signed_type> __cv_signed;
@@ -572,9 +563,8 @@ namespace std
     };
 
   template<typename _Tp>
-    struct __make_signed_selector<_Tp, false, true>
+    class __make_signed_selector<_Tp, false, true>
     {
-    private:
       // With -fshort-enums, an enum may be as small as a char.
       typedef signed char __smallest;
       static const bool __b0 = sizeof(_Tp) <= sizeof(__smallest);
diff --git a/libstdc++-v3/testsuite/20_util/declval/requirements/1_neg.cc b/libstdc++-v3/testsuite/20_util/declval/requirements/1_neg.cc
index dfb522e819d9e171776b88f77a70444be10a2107..59b90961398150007a885f30c5ab8c6c5fd8b7ea 100644
--- a/libstdc++-v3/testsuite/20_util/declval/requirements/1_neg.cc
+++ b/libstdc++-v3/testsuite/20_util/declval/requirements/1_neg.cc
@@ -19,7 +19,7 @@
 // with this library; see the file COPYING3.  If not see
 // <http://www.gnu.org/licenses/>.
 
-// { dg-error "static assertion failed" "" { target *-*-* } 636 }
+// { dg-error "static assertion failed" "" { target *-*-* } 626 }
 // { dg-error "instantiated from here" "" { target *-*-* } 30 }
 // { dg-excess-errors "In function" }
 
diff --git a/libstdc++-v3/testsuite/20_util/is_constructible/value.cc b/libstdc++-v3/testsuite/20_util/is_constructible/value.cc
index 5ff57f6fb6b4e5a403889bf14c08ea2b7b65e545..280710bebeabf0b7c324166e23c1e4af7e05b9ee 100644
--- a/libstdc++-v3/testsuite/20_util/is_constructible/value.cc
+++ b/libstdc++-v3/testsuite/20_util/is_constructible/value.cc
@@ -28,16 +28,13 @@ void test01()
   using namespace __gnu_test;
 
   // Positive tests.
-  VERIFY( (test_relationship<is_constructible, ExplicitClass,
-	   double&>(true)) );
-  VERIFY( (test_relationship<is_constructible, ExplicitClass,
-	   int&>(true)) );
+  VERIFY( (test_property<is_constructible, ExplicitClass, double&>(true)) );
+  VERIFY( (test_property<is_constructible, ExplicitClass, int&>(true)) );
 
   // Negative tests.
-  VERIFY( (test_relationship<is_constructible, ExplicitClass,
-	   void*>(false)) );
-  VERIFY( (test_relationship<is_constructible, ExplicitClass>(false)) );
-  VERIFY( (test_relationship<is_constructible, ExplicitClass,
+  VERIFY( (test_property<is_constructible, ExplicitClass, void*>(false)) );
+  VERIFY( (test_property<is_constructible, ExplicitClass>(false)) );
+  VERIFY( (test_property<is_constructible, ExplicitClass,
 	   int, double>(false)) );
 }
 
diff --git a/libstdc++-v3/testsuite/20_util/make_signed/requirements/typedefs_neg.cc b/libstdc++-v3/testsuite/20_util/make_signed/requirements/typedefs_neg.cc
index b37963330c4583142520e04e26583a91af8c3dc0..eec74c71593e700aa8096640f8c2b0460f33608d 100644
--- a/libstdc++-v3/testsuite/20_util/make_signed/requirements/typedefs_neg.cc
+++ b/libstdc++-v3/testsuite/20_util/make_signed/requirements/typedefs_neg.cc
@@ -48,8 +48,8 @@ void test01()
 // { dg-error "instantiated from here" "" { target *-*-* } 40 }
 // { dg-error "instantiated from here" "" { target *-*-* } 42 }
 
-// { dg-error "invalid use of incomplete type" "" { target *-*-* } 598 }
-// { dg-error "declaration of" "" { target *-*-* } 560 }
+// { dg-error "invalid use of incomplete type" "" { target *-*-* } 588 }
+// { dg-error "declaration of" "" { target *-*-* } 552 }
 
 // { dg-excess-errors "At global scope" }
 // { dg-excess-errors "In instantiation of" }
diff --git a/libstdc++-v3/testsuite/20_util/make_unsigned/requirements/typedefs_neg.cc b/libstdc++-v3/testsuite/20_util/make_unsigned/requirements/typedefs_neg.cc
index 0b842b39ea30b5df938c403e50aada2c0114fc0b..708482ef8a32c0e4d60fc0dbf54bcfa5fd5c6bb1 100644
--- a/libstdc++-v3/testsuite/20_util/make_unsigned/requirements/typedefs_neg.cc
+++ b/libstdc++-v3/testsuite/20_util/make_unsigned/requirements/typedefs_neg.cc
@@ -48,8 +48,8 @@ void test01()
 // { dg-error "instantiated from here" "" { target *-*-* } 40 }
 // { dg-error "instantiated from here" "" { target *-*-* } 42 }
 
-// { dg-error "invalid use of incomplete type" "" { target *-*-* } 519 }
-// { dg-error "declaration of" "" { target *-*-* } 481 }
+// { dg-error "invalid use of incomplete type" "" { target *-*-* } 511 }
+// { dg-error "declaration of" "" { target *-*-* } 475 }
 
 // { dg-excess-errors "At global scope" }
 // { dg-excess-errors "In instantiation of" }
diff --git a/libstdc++-v3/testsuite/util/testsuite_tr1.h b/libstdc++-v3/testsuite/util/testsuite_tr1.h
index 7ac45bdcaa0895a31f68a0e07836985debb1e056..aecf56220e055fc4832b03a766a8486ebb471323 100644
--- a/libstdc++-v3/testsuite/util/testsuite_tr1.h
+++ b/libstdc++-v3/testsuite/util/testsuite_tr1.h
@@ -56,8 +56,7 @@ namespace __gnu_test
   // For testing tr1/type_traits/extent, which has a second template
   // parameter.
   template<template<typename, unsigned> class Property,
-           typename Type,
-	   unsigned Uint>
+           typename Type, unsigned Uint>
     bool
     test_property(typename Property<Type, Uint>::value_type value)
     {
@@ -68,17 +67,17 @@ namespace __gnu_test
     }
 
 #ifdef __GXX_EXPERIMENTAL_CXX0X__
-  template<template<typename...> class Relationship,
-           typename... Types>
+  template<template<typename...> class Property, typename... Types>
     bool
-    test_relationship(bool value)
+    test_property(typename Property<Types...>::value_type value)
     {
       bool ret = true;
-      ret &= Relationship<Types...>::value == value;
-      ret &= Relationship<Types...>::type::value == value;
+      ret &= Property<Types...>::value == value;
+      ret &= Property<Types...>::type::value == value;
       return ret;
     }
-#else
+#endif
+
   template<template<typename, typename> class Relationship,
            typename Type1, typename Type2>
     bool
@@ -89,7 +88,6 @@ namespace __gnu_test
       ret &= Relationship<Type1, Type2>::type::value == value;
       return ret;
     }
-#endif
 
   // Test types.
   class ClassType { };