From bdaa445236ad169bf757aa9d81c26d7e09a28e0c Mon Sep 17 00:00:00 2001
From: Paolo Carlini <pcarlini@suse.de>
Date: Fri, 31 Dec 2004 18:15:22 +0000
Subject: [PATCH] type_traits (is_member_function_pointer): Provide a
 workaround for c++/19076, correct for functions with up to 15 arguments.

2004-12-31  Paolo Carlini  <pcarlini@suse.de>

	* include/tr1/type_traits (is_member_function_pointer): Provide a
	workaround for c++/19076, correct for functions with up to 15
	arguments.
	* testsuite/tr1/4_metaprogramming/composite_type_traits/
	is_member_pointer/is_member_pointer.cc: Uncomment "XFAILed" tests;
	add a test for variadic functions.
	* testsuite/tr1/4_metaprogramming/composite_type_traits/
	is_scalar/is_scalar.cc: Uncomment "XFAILed" tests.
	* testsuite/tr1/4_metaprogramming/primary_type_categories/
	is_enum/is_enum.cc: Likewise.
	* testsuite/tr1/4_metaprogramming/primary_type_categories/
	is_member_function_pointer/is_member_function_pointer.cc: Likewise;
	add a test for variadic functions.
	* testsuite/tr1/4_metaprogramming/primary_type_categories/
	is_member_object_pointer/is_member_object_pointer.cc: Likewise.
	* testsuite/tr1/4_metaprogramming/type_properties/
	has_nothrow_assign/has_nothrow_assign.cc: Uncomment "XFAILed" tests.
	* testsuite/tr1/4_metaprogramming/type_properties/
	has_nothrow_constructor/has_nothrow_constructor.cc: Likewise.
	* testsuite/tr1/4_metaprogramming/type_properties/
	has_nothrow_copy/has_nothrow_copy.cc: Likewise.
	* testsuite/tr1/4_metaprogramming/type_properties/
	has_trivial_assign/has_trivial_assign.cc: Likewise.
	* testsuite/tr1/4_metaprogramming/type_properties/
	has_trivial_constructor/has_trivial_constructor.cc: Likewise.
	* testsuite/tr1/4_metaprogramming/type_properties/
	has_trivial_copy/has_trivial_copy.cc: Likewise.
	* testsuite/tr1/4_metaprogramming/type_properties/
	has_trivial_destructor/has_trivial_destructor.cc: Likewise.
	* testsuite/tr1/4_metaprogramming/type_properties/
	is_pod/is_pod.cc: Likewise.

From-SVN: r92769
---
 libstdc++-v3/ChangeLog                        |  34 +++
 libstdc++-v3/include/tr1/type_traits          | 213 +++++++++++++++++-
 .../is_member_pointer/is_member_pointer.cc    |  20 +-
 .../is_scalar/is_scalar.cc                    |   3 +-
 .../is_enum/is_enum.cc                        |   3 +-
 .../is_member_function_pointer.cc             |  21 +-
 .../is_member_object_pointer.cc               |   2 +
 .../has_nothrow_assign/has_nothrow_assign.cc  |  10 +-
 .../has_nothrow_constructor.cc                |  10 +-
 .../has_nothrow_copy/has_nothrow_copy.cc      |  10 +-
 .../has_trivial_assign/has_trivial_assign.cc  |  10 +-
 .../has_trivial_constructor.cc                |  10 +-
 .../has_trivial_copy/has_trivial_copy.cc      |  10 +-
 .../has_trivial_destructor.cc                 |  10 +-
 .../type_properties/is_pod/is_pod.cc          |   6 +-
 15 files changed, 298 insertions(+), 74 deletions(-)

diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index c723e1db2b16..9b58b9ed9369 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,37 @@
+2004-12-31  Paolo Carlini  <pcarlini@suse.de>
+
+	* include/tr1/type_traits (is_member_function_pointer): Provide a
+	workaround for c++/19076, correct for functions with up to 15
+	arguments.
+	* testsuite/tr1/4_metaprogramming/composite_type_traits/
+	is_member_pointer/is_member_pointer.cc: Uncomment "XFAILed" tests;
+	add a test for variadic functions.
+	* testsuite/tr1/4_metaprogramming/composite_type_traits/
+	is_scalar/is_scalar.cc: Uncomment "XFAILed" tests.
+	* testsuite/tr1/4_metaprogramming/primary_type_categories/
+	is_enum/is_enum.cc: Likewise.
+	* testsuite/tr1/4_metaprogramming/primary_type_categories/
+	is_member_function_pointer/is_member_function_pointer.cc: Likewise;
+	add a test for variadic functions.
+	* testsuite/tr1/4_metaprogramming/primary_type_categories/
+	is_member_object_pointer/is_member_object_pointer.cc: Likewise.
+	* testsuite/tr1/4_metaprogramming/type_properties/
+	has_nothrow_assign/has_nothrow_assign.cc: Uncomment "XFAILed" tests.
+	* testsuite/tr1/4_metaprogramming/type_properties/
+	has_nothrow_constructor/has_nothrow_constructor.cc: Likewise.
+	* testsuite/tr1/4_metaprogramming/type_properties/
+	has_nothrow_copy/has_nothrow_copy.cc: Likewise.
+	* testsuite/tr1/4_metaprogramming/type_properties/
+	has_trivial_assign/has_trivial_assign.cc: Likewise.
+	* testsuite/tr1/4_metaprogramming/type_properties/
+	has_trivial_constructor/has_trivial_constructor.cc: Likewise.
+	* testsuite/tr1/4_metaprogramming/type_properties/
+	has_trivial_copy/has_trivial_copy.cc: Likewise.
+	* testsuite/tr1/4_metaprogramming/type_properties/
+	has_trivial_destructor/has_trivial_destructor.cc: Likewise.
+	* testsuite/tr1/4_metaprogramming/type_properties/
+	is_pod/is_pod.cc: Likewise.
+
 2004-12-30  Paolo Carlini  <pcarlini@suse.de>
 
 	* include/tr1/type_traits: Add has_trivial_copy, has_trivial_assign,
diff --git a/libstdc++-v3/include/tr1/type_traits b/libstdc++-v3/include/tr1/type_traits
index 01dd96b87e87..eb1087fd281e 100644
--- a/libstdc++-v3/include/tr1/type_traits
+++ b/libstdc++-v3/include/tr1/type_traits
@@ -138,11 +138,218 @@ namespace tr1
   _DEFINE_SPEC(2, is_member_object_pointer, _Tp _Cp::*,
 	       !is_function<_Tp>::value)
 
+  // Due to c++/19076, for the time being we cannot use the correct, neat
+  // implementation :-(
+  //
+  // template<typename>
+  //   struct is_member_function_pointer
+  //   : public false_type { };
+  //   _DEFINE_SPEC(2, is_member_function_pointer, _Tp _Cp::*,
+  //	            is_function<_Tp>::value)
+
+  // Ugly, temporary workaround for member functions with up to 15 arguments.
   template<typename>
+    struct __is_mfp_helper
+    { static const bool __value = false; };
+
+  template<typename _Rt, typename _Cp>
+    struct __is_mfp_helper<_Rt (_Cp::*) ()>
+    { static const bool __value = true; };
+
+  template<typename _Rt, typename _Cp>
+    struct __is_mfp_helper<_Rt (_Cp::*) (...)>
+    { static const bool __value = true; };
+
+  template<typename _Rt, typename _Cp, typename _A0>
+    struct __is_mfp_helper<_Rt (_Cp::*) (_A0)>
+    { static const bool __value = true; };
+
+  template<typename _Rt, typename _Cp, typename _A0>
+    struct __is_mfp_helper<_Rt (_Cp::*) (_A0, ...)>
+    { static const bool __value = true; };
+
+  template<typename _Rt, typename _Cp, typename _A0, typename _A1>
+    struct __is_mfp_helper<_Rt (_Cp::*) (_A0, _A1)>
+    { static const bool __value = true; };
+
+  template<typename _Rt, typename _Cp, typename _A0, typename _A1>
+    struct __is_mfp_helper<_Rt (_Cp::*) (_A0, _A1, ...)>
+    { static const bool __value = true; };
+
+  template<typename _Rt, typename _Cp, typename _A0, typename _A1, typename _A2>
+    struct __is_mfp_helper<_Rt (_Cp::*) (_A0, _A1, _A2)>
+    { static const bool __value = true; };
+
+  template<typename _Rt, typename _Cp, typename _A0, typename _A1, typename _A2>
+    struct __is_mfp_helper<_Rt (_Cp::*) (_A0, _A1, _A2, ...)>
+    { static const bool __value = true; };
+
+  template<typename _Rt, typename _Cp, typename _A0, typename _A1, typename _A2,
+	   typename _A3>
+    struct __is_mfp_helper<_Rt (_Cp::*) (_A0, _A1, _A2, _A3)>
+    { static const bool __value = true; };
+
+  template<typename _Rt, typename _Cp, typename _A0, typename _A1, typename _A2,
+	   typename _A3>
+    struct __is_mfp_helper<_Rt (_Cp::*) (_A0, _A1, _A2, _A3, ...)>
+    { static const bool __value = true; };
+
+  template<typename _Rt, typename _Cp, typename _A0, typename _A1, typename _A2,
+	   typename _A3, typename _A4>
+    struct __is_mfp_helper<_Rt (_Cp::*) (_A0, _A1, _A2, _A3, _A4)>
+    { static const bool __value = true; };
+
+  template<typename _Rt, typename _Cp, typename _A0, typename _A1, typename _A2,
+	   typename _A3, typename _A4>
+    struct __is_mfp_helper<_Rt (_Cp::*) (_A0, _A1, _A2, _A3, _A4, ...)>
+    { static const bool __value = true; };
+
+  template<typename _Rt, typename _Cp, typename _A0, typename _A1, typename _A2,
+	   typename _A3, typename _A4, typename _A5>
+    struct __is_mfp_helper<_Rt (_Cp::*) (_A0, _A1, _A2, _A3, _A4, _A5)>
+    { static const bool __value = true; };
+
+  template<typename _Rt, typename _Cp, typename _A0, typename _A1, typename _A2,
+	   typename _A3, typename _A4, typename _A5>
+    struct __is_mfp_helper<_Rt (_Cp::*) (_A0, _A1, _A2, _A3, _A4, _A5, ...)>
+    { static const bool __value = true; };
+
+  template<typename _Rt, typename _Cp, typename _A0, typename _A1, typename _A2,
+	   typename _A3, typename _A4, typename _A5, typename _A6>
+    struct __is_mfp_helper<_Rt (_Cp::*) (_A0, _A1, _A2, _A3, _A4, _A5, _A6)>
+    { static const bool __value = true; };
+
+  template<typename _Rt, typename _Cp, typename _A0, typename _A1, typename _A2,
+	   typename _A3, typename _A4, typename _A5, typename _A6>
+    struct __is_mfp_helper<_Rt (_Cp::*) (_A0, _A1, _A2, _A3, _A4, _A5, _A6,
+					 ...)>
+    { static const bool __value = true; };
+
+  template<typename _Rt, typename _Cp, typename _A0, typename _A1, typename _A2,
+	   typename _A3, typename _A4, typename _A5, typename _A6, typename _A7>
+    struct __is_mfp_helper<_Rt (_Cp::*) (_A0, _A1, _A2, _A3, _A4, _A5, _A6,
+					 _A7)>
+    { static const bool __value = true; };
+
+  template<typename _Rt, typename _Cp, typename _A0, typename _A1, typename _A2,
+	   typename _A3, typename _A4, typename _A5, typename _A6, typename _A7>
+    struct __is_mfp_helper<_Rt (_Cp::*) (_A0, _A1, _A2, _A3, _A4, _A5, _A6,
+					 _A7, ...)>
+    { static const bool __value = true; };
+
+  template<typename _Rt, typename _Cp, typename _A0, typename _A1, typename _A2,
+	   typename _A3, typename _A4, typename _A5, typename _A6, typename _A7,
+	   typename _A8>
+    struct __is_mfp_helper<_Rt (_Cp::*) (_A0, _A1, _A2, _A3, _A4, _A5, _A6,
+					 _A7, _A8)>
+    { static const bool __value = true; };
+
+  template<typename _Rt, typename _Cp, typename _A0, typename _A1, typename _A2,
+	   typename _A3, typename _A4, typename _A5, typename _A6, typename _A7,
+	   typename _A8>
+    struct __is_mfp_helper<_Rt (_Cp::*) (_A0, _A1, _A2, _A3, _A4, _A5, _A6,
+					 _A7, _A8, ...)>
+    { static const bool __value = true; };
+
+  template<typename _Rt, typename _Cp, typename _A0, typename _A1, typename _A2,
+	   typename _A3, typename _A4, typename _A5, typename _A6, typename _A7,
+	   typename _A8, typename _A9>
+    struct __is_mfp_helper<_Rt (_Cp::*) (_A0, _A1, _A2, _A3, _A4, _A5, _A6,
+					 _A7, _A8, _A9)>
+    { static const bool __value = true; };
+
+  template<typename _Rt, typename _Cp, typename _A0, typename _A1, typename _A2,
+	   typename _A3, typename _A4, typename _A5, typename _A6, typename _A7,
+	   typename _A8, typename _A9>
+    struct __is_mfp_helper<_Rt (_Cp::*) (_A0, _A1, _A2, _A3, _A4, _A5, _A6,
+					 _A7, _A8, _A9, ...)>
+    { static const bool __value = true; };
+  
+  template<typename _Rt, typename _Cp, typename _A0, typename _A1, typename _A2,
+	   typename _A3, typename _A4, typename _A5, typename _A6, typename _A7,
+	   typename _A8, typename _A9, typename _A10>
+    struct __is_mfp_helper<_Rt (_Cp::*) (_A0, _A1, _A2, _A3, _A4, _A5, _A6,
+					 _A7, _A8, _A9, _A10)>
+    { static const bool __value = true; };
+  
+  template<typename _Rt, typename _Cp, typename _A0, typename _A1, typename _A2,
+	   typename _A3, typename _A4, typename _A5, typename _A6, typename _A7,
+	   typename _A8, typename _A9, typename _A10>
+    struct __is_mfp_helper<_Rt (_Cp::*) (_A0, _A1, _A2, _A3, _A4, _A5, _A6,
+					 _A7, _A8, _A9, _A10, ...)>
+    { static const bool __value = true; };
+
+  template<typename _Rt, typename _Cp, typename _A0, typename _A1, typename _A2,
+	   typename _A3, typename _A4, typename _A5, typename _A6, typename _A7,
+	   typename _A8, typename _A9, typename _A10, typename _A11>
+    struct __is_mfp_helper<_Rt (_Cp::*) (_A0, _A1, _A2, _A3, _A4, _A5, _A6,
+					 _A7, _A8, _A9, _A10, _A11)>
+    { static const bool __value = true; };
+  
+  template<typename _Rt, typename _Cp, typename _A0, typename _A1, typename _A2,
+	   typename _A3, typename _A4, typename _A5, typename _A6, typename _A7,
+	   typename _A8, typename _A9, typename _A10, typename _A11>
+    struct __is_mfp_helper<_Rt (_Cp::*) (_A0, _A1, _A2, _A3, _A4, _A5, _A6,
+					 _A7, _A8, _A9, _A10, _A11, ...)>
+    { static const bool __value = true; };
+
+  template<typename _Rt, typename _Cp, typename _A0, typename _A1, typename _A2,
+	   typename _A3, typename _A4, typename _A5, typename _A6, typename _A7,
+	   typename _A8, typename _A9, typename _A10, typename _A11,
+	   typename _A12>
+    struct __is_mfp_helper<_Rt (_Cp::*) (_A0, _A1, _A2, _A3, _A4, _A5, _A6,
+					 _A7, _A8, _A9, _A10, _A11, _A12)>
+    { static const bool __value = true; };
+  
+  template<typename _Rt, typename _Cp, typename _A0, typename _A1, typename _A2,
+	   typename _A3, typename _A4, typename _A5, typename _A6, typename _A7,
+	   typename _A8, typename _A9, typename _A10, typename _A11,
+	   typename _A12>
+    struct __is_mfp_helper<_Rt (_Cp::*) (_A0, _A1, _A2, _A3, _A4, _A5, _A6,
+					 _A7, _A8, _A9, _A10, _A11, _A12, ...)>
+    { static const bool __value = true; };
+
+  template<typename _Rt, typename _Cp, typename _A0, typename _A1, typename _A2,
+	   typename _A3, typename _A4, typename _A5, typename _A6, typename _A7,
+	   typename _A8, typename _A9, typename _A10, typename _A11,
+	   typename _A12, typename _A13>
+    struct __is_mfp_helper<_Rt (_Cp::*) (_A0, _A1, _A2, _A3, _A4, _A5, _A6,
+					 _A7, _A8, _A9, _A10, _A11, _A12,
+					 _A13)>
+    { static const bool __value = true; };
+  
+  template<typename _Rt, typename _Cp, typename _A0, typename _A1, typename _A2,
+	   typename _A3, typename _A4, typename _A5, typename _A6, typename _A7,
+	   typename _A8, typename _A9, typename _A10, typename _A11,
+	   typename _A12, typename _A13>
+    struct __is_mfp_helper<_Rt (_Cp::*) (_A0, _A1, _A2, _A3, _A4, _A5, _A6,
+					 _A7, _A8, _A9, _A10, _A11, _A12,
+					 _A13, ...)>
+    { static const bool __value = true; };
+
+  template<typename _Rt, typename _Cp, typename _A0, typename _A1, typename _A2,
+	   typename _A3, typename _A4, typename _A5, typename _A6, typename _A7,
+	   typename _A8, typename _A9, typename _A10, typename _A11,
+	   typename _A12, typename _A13, typename _A14>
+    struct __is_mfp_helper<_Rt (_Cp::*) (_A0, _A1, _A2, _A3, _A4, _A5, _A6,
+					 _A7, _A8, _A9, _A10, _A11, _A12,
+					 _A13, _A14)>
+    { static const bool __value = true; };
+  
+  template<typename _Rt, typename _Cp, typename _A0, typename _A1, typename _A2,
+	   typename _A3, typename _A4, typename _A5, typename _A6, typename _A7,
+	   typename _A8, typename _A9, typename _A10, typename _A11,
+	   typename _A12, typename _A13, typename _A14>
+    struct __is_mfp_helper<_Rt (_Cp::*) (_A0, _A1, _A2, _A3, _A4, _A5, _A6,
+					 _A7, _A8, _A9, _A10, _A11, _A12,
+					 _A13, _A14, ...)>
+    { static const bool __value = true; };
+
+  template<typename _Tp>
     struct is_member_function_pointer
-    : public false_type { };
-  _DEFINE_SPEC(2, is_member_function_pointer, _Tp _Cp::*,
-	       is_function<_Tp>::value)
+    : public integral_constant<bool, (__is_mfp_helper<typename
+				      remove_cv<_Tp>::type>::__value)>
+    { };
 
   template<typename _Tp, bool = (is_fundamental<_Tp>::value
 				 || is_array<_Tp>::value
diff --git a/libstdc++-v3/testsuite/tr1/4_metaprogramming/composite_type_traits/is_member_pointer/is_member_pointer.cc b/libstdc++-v3/testsuite/tr1/4_metaprogramming/composite_type_traits/is_member_pointer/is_member_pointer.cc
index 918417e4ed2f..f7ae576e2343 100644
--- a/libstdc++-v3/testsuite/tr1/4_metaprogramming/composite_type_traits/is_member_pointer/is_member_pointer.cc
+++ b/libstdc++-v3/testsuite/tr1/4_metaprogramming/composite_type_traits/is_member_pointer/is_member_pointer.cc
@@ -34,16 +34,16 @@ void test01()
   VERIFY( (test_category<is_member_pointer, const int (ClassType::*)>(true)) );
   VERIFY( (test_category<is_member_pointer, ClassType (ClassType::*)>(true)) );
 
-  // Temporarily disabled because of c++/19076 :-(
-
-  //VERIFY( (test_category<is_member_pointer,
-  //   int (ClassType::*) (int)>(true)) );
-  //VERIFY( (test_category<is_member_pointer,
-  //   int (ClassType::*) (int) const>(true)) );
-  //VERIFY( (test_category<is_member_function_pointer,
-  //   ClassType (ClassType::*) (ClassType)>(true)) );
-  //VERIFY( (test_category<is_member_pointer,
-  //   float (ClassType::*) (int, float, int[], int&)>(true)) );
+  VERIFY( (test_category<is_member_pointer,
+	   int (ClassType::*) (int)>(true)) );
+  VERIFY( (test_category<is_member_pointer,
+	   int (ClassType::*) (int) const>(true)) );
+  VERIFY( (test_category<is_member_pointer,
+	   int (ClassType::*) (float, ...)>(true)) );
+  VERIFY( (test_category<is_member_pointer,
+	   ClassType (ClassType::*) (ClassType)>(true)) );
+  VERIFY( (test_category<is_member_pointer,
+	   float (ClassType::*) (int, float, int[], int&)>(true)) );
   
   // Sanity check.
   VERIFY( (test_category<is_member_pointer, ClassType>(false)) );
diff --git a/libstdc++-v3/testsuite/tr1/4_metaprogramming/composite_type_traits/is_scalar/is_scalar.cc b/libstdc++-v3/testsuite/tr1/4_metaprogramming/composite_type_traits/is_scalar/is_scalar.cc
index 37d6592f04f5..7fc1faf413cb 100644
--- a/libstdc++-v3/testsuite/tr1/4_metaprogramming/composite_type_traits/is_scalar/is_scalar.cc
+++ b/libstdc++-v3/testsuite/tr1/4_metaprogramming/composite_type_traits/is_scalar/is_scalar.cc
@@ -36,8 +36,7 @@ void test01()
   VERIFY( (test_category<is_scalar, int*>(true)) );
   VERIFY( (test_category<is_scalar, int(*)(int)>(true)) );
   VERIFY( (test_category<is_scalar, int (ClassType::*)>(true)) );
-  // Temporarily disabled because of c++/19076 :-(
-  // VERIFY( (test_category<is_scalar, int (ClassType::*) (int)>(true)) );
+  VERIFY( (test_category<is_scalar, int (ClassType::*) (int)>(true)) );
 
   // Sanity check.
   VERIFY( (test_category<is_scalar, ClassType>(false)) );
diff --git a/libstdc++-v3/testsuite/tr1/4_metaprogramming/primary_type_categories/is_enum/is_enum.cc b/libstdc++-v3/testsuite/tr1/4_metaprogramming/primary_type_categories/is_enum/is_enum.cc
index 3de48c4084f1..0ae5887fcf67 100644
--- a/libstdc++-v3/testsuite/tr1/4_metaprogramming/primary_type_categories/is_enum/is_enum.cc
+++ b/libstdc++-v3/testsuite/tr1/4_metaprogramming/primary_type_categories/is_enum/is_enum.cc
@@ -43,8 +43,7 @@ void test01()
   VERIFY( (test_category<is_enum, float&>(false)) );
   VERIFY( (test_category<is_enum, float(&)(float)>(false)) );
   VERIFY( (test_category<is_enum, int (ClassType::*)>(false)) );
-  // Temporarily disabled because of c++/19076 :-(
-  // VERIFY( (test_category<is_enum, int (ClassType::*) (int)>(false)) );
+  VERIFY( (test_category<is_enum, int (ClassType::*) (int)>(false)) );
   VERIFY( (test_category<is_enum, int (int)>(false)) );
 
   VERIFY( (test_category<is_enum, ConvType>(false)) );
diff --git a/libstdc++-v3/testsuite/tr1/4_metaprogramming/primary_type_categories/is_member_function_pointer/is_member_function_pointer.cc b/libstdc++-v3/testsuite/tr1/4_metaprogramming/primary_type_categories/is_member_function_pointer/is_member_function_pointer.cc
index 9652e1943e7a..54b2711ae1b8 100644
--- a/libstdc++-v3/testsuite/tr1/4_metaprogramming/primary_type_categories/is_member_function_pointer/is_member_function_pointer.cc
+++ b/libstdc++-v3/testsuite/tr1/4_metaprogramming/primary_type_categories/is_member_function_pointer/is_member_function_pointer.cc
@@ -31,17 +31,16 @@ void test01()
   using namespace __gnu_test;
 
   // Positive tests.
-
-  // Temporarily disabled because of c++/19076 :-(
-
-  //VERIFY( (test_category<is_member_function_pointer,
-  //   int (ClassType::*) (int)>(true)) );
-  //VERIFY( (test_category<is_member_function_pointer,
-  //   int (ClassType::*) (int) const>(true)) );
-  //VERIFY( (test_category<is_member_function_pointer,
-  //   ClassType (ClassType::*) (ClassType)>(true)) );
-  //VERIFY( (test_category<is_member_function_pointer,
-  //   float (ClassType::*) (int, float, int[], int&)>(true)) );
+  VERIFY( (test_category<is_member_function_pointer,
+	   int (ClassType::*) (int)>(true)) );
+  VERIFY( (test_category<is_member_function_pointer,
+	   int (ClassType::*) (int) const>(true)) );
+  VERIFY( (test_category<is_member_function_pointer,
+	   int (ClassType::*) (float, ...)>(true)) );
+  VERIFY( (test_category<is_member_function_pointer,
+	   ClassType (ClassType::*) (ClassType)>(true)) );
+  VERIFY( (test_category<is_member_function_pointer,
+	   float (ClassType::*) (int, float, int[], int&)>(true)) );
 
   // Negative tests.
   VERIFY( (test_category<is_member_function_pointer,
diff --git a/libstdc++-v3/testsuite/tr1/4_metaprogramming/primary_type_categories/is_member_object_pointer/is_member_object_pointer.cc b/libstdc++-v3/testsuite/tr1/4_metaprogramming/primary_type_categories/is_member_object_pointer/is_member_object_pointer.cc
index 986eee1173ca..4f1045e68036 100644
--- a/libstdc++-v3/testsuite/tr1/4_metaprogramming/primary_type_categories/is_member_object_pointer/is_member_object_pointer.cc
+++ b/libstdc++-v3/testsuite/tr1/4_metaprogramming/primary_type_categories/is_member_object_pointer/is_member_object_pointer.cc
@@ -43,6 +43,8 @@ void test01()
 	   int (ClassType::*) (int)>(false)) );
   VERIFY( (test_category<is_member_object_pointer,
 	   int (ClassType::*) (int) const>(false)) );
+  VERIFY( (test_category<is_member_object_pointer,
+	   int (ClassType::*) (float, ...)>(false)) );
   VERIFY( (test_category<is_member_object_pointer,
 	   ClassType (ClassType::*) (ClassType)>(false)) );
   VERIFY( (test_category<is_member_object_pointer,
diff --git a/libstdc++-v3/testsuite/tr1/4_metaprogramming/type_properties/has_nothrow_assign/has_nothrow_assign.cc b/libstdc++-v3/testsuite/tr1/4_metaprogramming/type_properties/has_nothrow_assign/has_nothrow_assign.cc
index 76dbbb8948e9..e07fa4f589fb 100644
--- a/libstdc++-v3/testsuite/tr1/4_metaprogramming/type_properties/has_nothrow_assign/has_nothrow_assign.cc
+++ b/libstdc++-v3/testsuite/tr1/4_metaprogramming/type_properties/has_nothrow_assign/has_nothrow_assign.cc
@@ -37,9 +37,8 @@ void test01()
   VERIFY( (test_assign_property<has_nothrow_assign, int*>(true)) );
   VERIFY( (test_assign_property<has_nothrow_assign, int(*)(int)>(true)) );
   VERIFY( (test_assign_property<has_nothrow_assign, int (ClassType::*)>(true)) );
-  // Temporarily disabled because of c++/19076 :-(
-  // VERIFY( (test_assign_property<has_nothrow_assign,
-  //   int (ClassType::*) (int)>(true)) );
+  VERIFY( (test_assign_property<has_nothrow_assign,
+	   int (ClassType::*) (int)>(true)) );
   VERIFY( (test_assign_property<has_nothrow_assign, int[2]>(true)) );
   VERIFY( (test_assign_property<has_nothrow_assign, float[][3]>(true)) );
   VERIFY( (test_assign_property<has_nothrow_assign, EnumType[2][3][4]>(true)) );
@@ -47,9 +46,8 @@ void test01()
   VERIFY( (test_assign_property<has_nothrow_assign, int(*[][2])(int)>(true)) );
   VERIFY( (test_assign_property<has_nothrow_assign,
 	   int (ClassType::*[2][3])>(true)) );
-  // Temporarily disabled because of c++/19076 :-(
-  // VERIFY( (test_assign_property<has_nothrow_assign,
-  //   int (ClassType::*[][2][3]) (int)>(true)) );
+  VERIFY( (test_assign_property<has_nothrow_assign,
+	   int (ClassType::*[][2][3]) (int)>(true)) );
 }
 
 int main()
diff --git a/libstdc++-v3/testsuite/tr1/4_metaprogramming/type_properties/has_nothrow_constructor/has_nothrow_constructor.cc b/libstdc++-v3/testsuite/tr1/4_metaprogramming/type_properties/has_nothrow_constructor/has_nothrow_constructor.cc
index 3db624154bb1..18c3a33fb2f9 100644
--- a/libstdc++-v3/testsuite/tr1/4_metaprogramming/type_properties/has_nothrow_constructor/has_nothrow_constructor.cc
+++ b/libstdc++-v3/testsuite/tr1/4_metaprogramming/type_properties/has_nothrow_constructor/has_nothrow_constructor.cc
@@ -37,9 +37,8 @@ void test01()
   VERIFY( (test_category<has_nothrow_constructor, int*>(true)) );
   VERIFY( (test_category<has_nothrow_constructor, int(*)(int)>(true)) );
   VERIFY( (test_category<has_nothrow_constructor, int (ClassType::*)>(true)) );
-  // Temporarily disabled because of c++/19076 :-(
-  // VERIFY( (test_category<has_nothrow_constructor,
-  //   int (ClassType::*) (int)>(true)) );
+  VERIFY( (test_category<has_nothrow_constructor,
+	   int (ClassType::*) (int)>(true)) );
   VERIFY( (test_category<has_nothrow_constructor, int[2]>(true)) );
   VERIFY( (test_category<has_nothrow_constructor, float[][3]>(true)) );
   VERIFY( (test_category<has_nothrow_constructor, EnumType[2][3][4]>(true)) );
@@ -47,9 +46,8 @@ void test01()
   VERIFY( (test_category<has_nothrow_constructor, int(*[][2])(int)>(true)) );
   VERIFY( (test_category<has_nothrow_constructor,
 	   int (ClassType::*[2][3])>(true)) );
-  // Temporarily disabled because of c++/19076 :-(
-  // VERIFY( (test_category<has_nothrow_constructor,
-  //   int (ClassType::*[][2][3]) (int)>(true)) );
+  VERIFY( (test_category<has_nothrow_constructor,
+	   int (ClassType::*[][2][3]) (int)>(true)) );
 
   // Sanity check.
   VERIFY( (test_category<has_nothrow_constructor, ClassType>(false)) );
diff --git a/libstdc++-v3/testsuite/tr1/4_metaprogramming/type_properties/has_nothrow_copy/has_nothrow_copy.cc b/libstdc++-v3/testsuite/tr1/4_metaprogramming/type_properties/has_nothrow_copy/has_nothrow_copy.cc
index a59646565ccb..7ba63bfa9549 100644
--- a/libstdc++-v3/testsuite/tr1/4_metaprogramming/type_properties/has_nothrow_copy/has_nothrow_copy.cc
+++ b/libstdc++-v3/testsuite/tr1/4_metaprogramming/type_properties/has_nothrow_copy/has_nothrow_copy.cc
@@ -37,9 +37,8 @@ void test01()
   VERIFY( (test_copy_property<has_nothrow_copy, int*>(true)) );
   VERIFY( (test_copy_property<has_nothrow_copy, int(*)(int)>(true)) );
   VERIFY( (test_copy_property<has_nothrow_copy, int (ClassType::*)>(true)) );
-  // Temporarily disabled because of c++/19076 :-(
-  // VERIFY( (test_copy_property<has_nothrow_copy,
-  //   int (ClassType::*) (int)>(true)) );
+  VERIFY( (test_copy_property<has_nothrow_copy,
+	   int (ClassType::*) (int)>(true)) );
   VERIFY( (test_copy_property<has_nothrow_copy, int[2]>(true)) );
   VERIFY( (test_copy_property<has_nothrow_copy, float[][3]>(true)) );
   VERIFY( (test_copy_property<has_nothrow_copy, EnumType[2][3][4]>(true)) );
@@ -47,9 +46,8 @@ void test01()
   VERIFY( (test_copy_property<has_nothrow_copy, int(*[][2])(int)>(true)) );
   VERIFY( (test_copy_property<has_nothrow_copy,
 	   int (ClassType::*[2][3])>(true)) );
-  // Temporarily disabled because of c++/19076 :-(
-  // VERIFY( (test_copy_property<has_nothrow_copy,
-  //   int (ClassType::*[][2][3]) (int)>(true)) );
+  VERIFY( (test_copy_property<has_nothrow_copy,
+	   int (ClassType::*[][2][3]) (int)>(true)) );
 }
 
 int main()
diff --git a/libstdc++-v3/testsuite/tr1/4_metaprogramming/type_properties/has_trivial_assign/has_trivial_assign.cc b/libstdc++-v3/testsuite/tr1/4_metaprogramming/type_properties/has_trivial_assign/has_trivial_assign.cc
index a85bcad3c99f..66b2bc18c386 100644
--- a/libstdc++-v3/testsuite/tr1/4_metaprogramming/type_properties/has_trivial_assign/has_trivial_assign.cc
+++ b/libstdc++-v3/testsuite/tr1/4_metaprogramming/type_properties/has_trivial_assign/has_trivial_assign.cc
@@ -37,9 +37,8 @@ void test01()
   VERIFY( (test_assign_property<has_trivial_assign, int*>(true)) );
   VERIFY( (test_assign_property<has_trivial_assign, int(*)(int)>(true)) );
   VERIFY( (test_assign_property<has_trivial_assign, int (ClassType::*)>(true)) );
-  // Temporarily disabled because of c++/19076 :-(
-  // VERIFY( (test_assign_property<has_trivial_assign,
-  //   int (ClassType::*) (int)>(true)) );
+  VERIFY( (test_assign_property<has_trivial_assign,
+	   int (ClassType::*) (int)>(true)) );
   VERIFY( (test_assign_property<has_trivial_assign, int[2]>(true)) );
   VERIFY( (test_assign_property<has_trivial_assign, float[][3]>(true)) );
   VERIFY( (test_assign_property<has_trivial_assign, EnumType[2][3][4]>(true)) );
@@ -47,9 +46,8 @@ void test01()
   VERIFY( (test_assign_property<has_trivial_assign, int(*[][2])(int)>(true)) );
   VERIFY( (test_assign_property<has_trivial_assign,
 	   int (ClassType::*[2][3])>(true)) );
-  // Temporarily disabled because of c++/19076 :-(
-  // VERIFY( (test_assign_property<has_trivial_assign,
-  //   int (ClassType::*[][2][3]) (int)>(true)) );
+  VERIFY( (test_assign_property<has_trivial_assign,
+	   int (ClassType::*[][2][3]) (int)>(true)) );
 }
 
 int main()
diff --git a/libstdc++-v3/testsuite/tr1/4_metaprogramming/type_properties/has_trivial_constructor/has_trivial_constructor.cc b/libstdc++-v3/testsuite/tr1/4_metaprogramming/type_properties/has_trivial_constructor/has_trivial_constructor.cc
index 1de7d1eb9698..7559a43ffc11 100644
--- a/libstdc++-v3/testsuite/tr1/4_metaprogramming/type_properties/has_trivial_constructor/has_trivial_constructor.cc
+++ b/libstdc++-v3/testsuite/tr1/4_metaprogramming/type_properties/has_trivial_constructor/has_trivial_constructor.cc
@@ -37,9 +37,8 @@ void test01()
   VERIFY( (test_category<has_trivial_constructor, int*>(true)) );
   VERIFY( (test_category<has_trivial_constructor, int(*)(int)>(true)) );
   VERIFY( (test_category<has_trivial_constructor, int (ClassType::*)>(true)) );
-  // Temporarily disabled because of c++/19076 :-(
-  // VERIFY( (test_category<has_trivial_constructor,
-  //   int (ClassType::*) (int)>(true)) );
+  VERIFY( (test_category<has_trivial_constructor,
+	   int (ClassType::*) (int)>(true)) );
   VERIFY( (test_category<has_trivial_constructor, int[2]>(true)) );
   VERIFY( (test_category<has_trivial_constructor, float[][3]>(true)) );
   VERIFY( (test_category<has_trivial_constructor, EnumType[2][3][4]>(true)) );
@@ -47,9 +46,8 @@ void test01()
   VERIFY( (test_category<has_trivial_constructor, int(*[][2])(int)>(true)) );
   VERIFY( (test_category<has_trivial_constructor,
 	   int (ClassType::*[2][3])>(true)) );
-  // Temporarily disabled because of c++/19076 :-(
-  // VERIFY( (test_category<has_trivial_constructor,
-  //   int (ClassType::*[][2][3]) (int)>(true)) );
+  VERIFY( (test_category<has_trivial_constructor,
+	   int (ClassType::*[][2][3]) (int)>(true)) );
 
   // Sanity check.
   VERIFY( (test_category<has_trivial_constructor, ClassType>(false)) );
diff --git a/libstdc++-v3/testsuite/tr1/4_metaprogramming/type_properties/has_trivial_copy/has_trivial_copy.cc b/libstdc++-v3/testsuite/tr1/4_metaprogramming/type_properties/has_trivial_copy/has_trivial_copy.cc
index 6002b85bb6a9..64eed997d604 100644
--- a/libstdc++-v3/testsuite/tr1/4_metaprogramming/type_properties/has_trivial_copy/has_trivial_copy.cc
+++ b/libstdc++-v3/testsuite/tr1/4_metaprogramming/type_properties/has_trivial_copy/has_trivial_copy.cc
@@ -37,9 +37,8 @@ void test01()
   VERIFY( (test_copy_property<has_trivial_copy, int*>(true)) );
   VERIFY( (test_copy_property<has_trivial_copy, int(*)(int)>(true)) );
   VERIFY( (test_copy_property<has_trivial_copy, int (ClassType::*)>(true)) );
-  // Temporarily disabled because of c++/19076 :-(
-  // VERIFY( (test_copy_property<has_trivial_copy,
-  //   int (ClassType::*) (int)>(true)) );
+  VERIFY( (test_copy_property<has_trivial_copy,
+	   int (ClassType::*) (int)>(true)) );
   VERIFY( (test_copy_property<has_trivial_copy, int[2]>(true)) );
   VERIFY( (test_copy_property<has_trivial_copy, float[][3]>(true)) );
   VERIFY( (test_copy_property<has_trivial_copy, EnumType[2][3][4]>(true)) );
@@ -47,9 +46,8 @@ void test01()
   VERIFY( (test_copy_property<has_trivial_copy, int(*[][2])(int)>(true)) );
   VERIFY( (test_copy_property<has_trivial_copy,
 	   int (ClassType::*[2][3])>(true)) );
-  // Temporarily disabled because of c++/19076 :-(
-  // VERIFY( (test_copy_property<has_trivial_copy,
-  //   int (ClassType::*[][2][3]) (int)>(true)) );
+  VERIFY( (test_copy_property<has_trivial_copy,
+	   int (ClassType::*[][2][3]) (int)>(true)) );
 }
 
 int main()
diff --git a/libstdc++-v3/testsuite/tr1/4_metaprogramming/type_properties/has_trivial_destructor/has_trivial_destructor.cc b/libstdc++-v3/testsuite/tr1/4_metaprogramming/type_properties/has_trivial_destructor/has_trivial_destructor.cc
index 4e4a2842fb12..e3cc9db9f8f4 100644
--- a/libstdc++-v3/testsuite/tr1/4_metaprogramming/type_properties/has_trivial_destructor/has_trivial_destructor.cc
+++ b/libstdc++-v3/testsuite/tr1/4_metaprogramming/type_properties/has_trivial_destructor/has_trivial_destructor.cc
@@ -37,9 +37,8 @@ void test01()
   VERIFY( (test_category<has_trivial_destructor, int*>(true)) );
   VERIFY( (test_category<has_trivial_destructor, int(*)(int)>(true)) );
   VERIFY( (test_category<has_trivial_destructor, int (ClassType::*)>(true)) );
-  // Temporarily disabled because of c++/19076 :-(
-  // VERIFY( (test_category<has_trivial_destructor,
-  //   int (ClassType::*) (int)>(true)) );
+  VERIFY( (test_category<has_trivial_destructor,
+	   int (ClassType::*) (int)>(true)) );
   VERIFY( (test_category<has_trivial_destructor, int[2]>(true)) );
   VERIFY( (test_category<has_trivial_destructor, float[][3]>(true)) );
   VERIFY( (test_category<has_trivial_destructor, EnumType[2][3][4]>(true)) );
@@ -47,9 +46,8 @@ void test01()
   VERIFY( (test_category<has_trivial_destructor, int(*[][2])(int)>(true)) );
   VERIFY( (test_category<has_trivial_destructor,
 	   int (ClassType::*[2][3])>(true)) );
-  // Temporarily disabled because of c++/19076 :-(
-  // VERIFY( (test_category<has_trivial_destructor,
-  //   int (ClassType::*[][2][3]) (int)>(true)) );
+  VERIFY( (test_category<has_trivial_destructor,
+	   int (ClassType::*[][2][3]) (int)>(true)) );
 
   // Sanity check.
   VERIFY( (test_category<has_trivial_destructor, ClassType>(false)) );
diff --git a/libstdc++-v3/testsuite/tr1/4_metaprogramming/type_properties/is_pod/is_pod.cc b/libstdc++-v3/testsuite/tr1/4_metaprogramming/type_properties/is_pod/is_pod.cc
index 4fac0f3cb0e3..485692091c89 100644
--- a/libstdc++-v3/testsuite/tr1/4_metaprogramming/type_properties/is_pod/is_pod.cc
+++ b/libstdc++-v3/testsuite/tr1/4_metaprogramming/type_properties/is_pod/is_pod.cc
@@ -37,16 +37,14 @@ void test01()
   VERIFY( (test_category<is_pod, int*>(true)) );
   VERIFY( (test_category<is_pod, int(*)(int)>(true)) );
   VERIFY( (test_category<is_pod, int (ClassType::*)>(true)) );
-  // Temporarily disabled because of c++/19076 :-(
-  // VERIFY( (test_category<is_pod, int (ClassType::*) (int)>(true)) );
+  VERIFY( (test_category<is_pod, int (ClassType::*) (int)>(true)) );
   VERIFY( (test_category<is_pod, int[2]>(true)) );
   VERIFY( (test_category<is_pod, float[][3]>(true)) );
   VERIFY( (test_category<is_pod, EnumType[2][3][4]>(true)) );
   VERIFY( (test_category<is_pod, int*[3]>(true)) );
   VERIFY( (test_category<is_pod, int(*[][2])(int)>(true)) );
   VERIFY( (test_category<is_pod, int (ClassType::*[2][3])>(true)) );
-  // Temporarily disabled because of c++/19076 :-(
-  // VERIFY( (test_category<is_pod, int (ClassType::*[][2][3]) (int)>(true)) );
+  VERIFY( (test_category<is_pod, int (ClassType::*[][2][3]) (int)>(true)) );
 
   // Sanity check.
   VERIFY( (test_category<is_pod, ClassType>(false)) );
-- 
GitLab