From 75995f378221fd6b0f86c920d64d8e09b6b76f3c Mon Sep 17 00:00:00 2001
From: Paolo Carlini <paolo@gcc.gnu.org>
Date: Wed, 30 Dec 2009 23:22:58 +0000
Subject: [PATCH] [multiple changes]

2009-12-30  Daniel Frey  <d.frey@gmx.de>
	    Paolo Carlini  <paolo.carlini@oracle.com>

	* include/std/type_traits (is_explicitly_convertible,
	is_constructible): Add.
	* testsuite/util/testsuite_tr1.h (ExplicitClass): Add.
	* testsuite/20_util/is_explicitly_convertible/value.cc: New.
	* testsuite/20_util/is_constructible/value.cc: Likewise.

2009-12-30  Paolo Carlini  <paolo.carlini@oracle.com>

	* testsuite/util/testsuite_tr1.h (test_relationship): Add
	variadic version.
	* testsuite/20_util/is_explicitly_convertible/requirements/
	typedefs.cc: New.
	* testsuite/20_util/is_explicitly_convertible/requirements/
	explicit_instantiation.cc: Likewise.
	* testsuite/20_util/is_constructible/requirements/typedefs.cc:
	Likewise.
	* testsuite/20_util/is_constructible/requirements/
	explicit_instantiation.cc: Likewise.
	* testsuite/20_util/is_convertible/value.cc: Extend.
	* 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.

From-SVN: r155529
---
 libstdc++-v3/ChangeLog                        | 28 +++++++++++
 libstdc++-v3/include/std/type_traits          | 49 +++++++++++++++++++
 .../20_util/declval/requirements/1_neg.cc     |  2 +-
 .../requirements/explicit_instantiation.cc    | 31 ++++++++++++
 .../is_constructible/requirements/typedefs.cc | 36 ++++++++++++++
 .../20_util/is_constructible/value.cc         | 48 ++++++++++++++++++
 .../testsuite/20_util/is_convertible/value.cc |  4 ++
 .../requirements/explicit_instantiation.cc    | 31 ++++++++++++
 .../requirements/typedefs.cc                  | 36 ++++++++++++++
 .../is_explicitly_convertible/value.cc        | 45 +++++++++++++++++
 .../make_signed/requirements/typedefs_neg.cc  |  4 +-
 .../requirements/typedefs_neg.cc              |  4 +-
 libstdc++-v3/testsuite/util/testsuite_tr1.h   | 19 +++++++
 13 files changed, 332 insertions(+), 5 deletions(-)
 create mode 100644 libstdc++-v3/testsuite/20_util/is_constructible/requirements/explicit_instantiation.cc
 create mode 100644 libstdc++-v3/testsuite/20_util/is_constructible/requirements/typedefs.cc
 create mode 100644 libstdc++-v3/testsuite/20_util/is_constructible/value.cc
 create mode 100644 libstdc++-v3/testsuite/20_util/is_explicitly_convertible/requirements/explicit_instantiation.cc
 create mode 100644 libstdc++-v3/testsuite/20_util/is_explicitly_convertible/requirements/typedefs.cc
 create mode 100644 libstdc++-v3/testsuite/20_util/is_explicitly_convertible/value.cc

diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 21ab1f358cfd..5b5e39ddc902 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,31 @@
+2009-12-30  Daniel Frey  <d.frey@gmx.de>
+	    Paolo Carlini  <paolo.carlini@oracle.com>
+
+	* include/std/type_traits (is_explicitly_convertible,
+	is_constructible): Add.
+	* testsuite/util/testsuite_tr1.h (ExplicitClass): Add.
+	* testsuite/20_util/is_explicitly_convertible/value.cc: New.
+	* testsuite/20_util/is_constructible/value.cc: Likewise.
+
+2009-12-30  Paolo Carlini  <paolo.carlini@oracle.com>
+
+	* testsuite/util/testsuite_tr1.h (test_relationship): Add
+	variadic version.
+	* testsuite/20_util/is_explicitly_convertible/requirements/
+	typedefs.cc: New.
+	* testsuite/20_util/is_explicitly_convertible/requirements/
+	explicit_instantiation.cc: Likewise.
+	* testsuite/20_util/is_constructible/requirements/typedefs.cc:
+	Likewise.
+	* testsuite/20_util/is_constructible/requirements/
+	explicit_instantiation.cc: Likewise.
+	* testsuite/20_util/is_convertible/value.cc: Extend.
+	* 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/bits/stl_iterator.h.: Fix typo in comment.
diff --git a/libstdc++-v3/include/std/type_traits b/libstdc++-v3/include/std/type_traits
index dcfa1c9c4abb..09ad8637de0e 100644
--- a/libstdc++-v3/include/std/type_traits
+++ b/libstdc++-v3/include/std/type_traits
@@ -272,6 +272,55 @@ namespace std
 			       __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>
+    { };
+
+  template<typename _From, typename _To>
+    struct is_explicitly_convertible
+    : public is_constructible<_To, _From>
+    { };
+
   template<std::size_t _Len>
     struct __aligned_storage_msa
     { 
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 d22a58ba038f..dfb522e819d9 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 *-*-* } 587 }
+// { dg-error "static assertion failed" "" { target *-*-* } 636 }
 // { dg-error "instantiated from here" "" { target *-*-* } 30 }
 // { dg-excess-errors "In function" }
 
diff --git a/libstdc++-v3/testsuite/20_util/is_constructible/requirements/explicit_instantiation.cc b/libstdc++-v3/testsuite/20_util/is_constructible/requirements/explicit_instantiation.cc
new file mode 100644
index 000000000000..356f73cac49d
--- /dev/null
+++ b/libstdc++-v3/testsuite/20_util/is_constructible/requirements/explicit_instantiation.cc
@@ -0,0 +1,31 @@
+// { dg-options "-std=gnu++0x" }
+// { dg-do compile }
+
+// 2009-12-30  Paolo Carlini  <paolo.carlini@oracle.com>
+
+// Copyright (C) 2009 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+// NB: This file is for testing type_traits with NO OTHER INCLUDES.
+
+#include <type_traits>
+
+namespace std
+{
+  typedef short test_type;
+  template struct is_constructible<test_type, test_type>;
+}
diff --git a/libstdc++-v3/testsuite/20_util/is_constructible/requirements/typedefs.cc b/libstdc++-v3/testsuite/20_util/is_constructible/requirements/typedefs.cc
new file mode 100644
index 000000000000..4b9ecd9e19f6
--- /dev/null
+++ b/libstdc++-v3/testsuite/20_util/is_constructible/requirements/typedefs.cc
@@ -0,0 +1,36 @@
+// { dg-options "-std=gnu++0x" }
+// { dg-do compile }
+
+// 2009-12-30  Paolo Carlini  <paolo.carlini@oracle.com>
+//
+// Copyright (C) 2009 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+// 
+// NB: This file is for testing type_traits with NO OTHER INCLUDES.
+
+#include <type_traits>
+
+void test01()
+{
+  // Check for required typedefs
+  typedef std::is_constructible<int, int>   test_type;
+  typedef test_type::value_type             value_type;
+  typedef test_type::type                   type;
+  typedef test_type::type::value_type       type_value_type;
+  typedef test_type::type::type             type_type;
+}
diff --git a/libstdc++-v3/testsuite/20_util/is_constructible/value.cc b/libstdc++-v3/testsuite/20_util/is_constructible/value.cc
new file mode 100644
index 000000000000..5ff57f6fb6b4
--- /dev/null
+++ b/libstdc++-v3/testsuite/20_util/is_constructible/value.cc
@@ -0,0 +1,48 @@
+// { dg-options "-std=gnu++0x" }
+
+// Copyright (C) 2009 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+#include <type_traits>
+#include <testsuite_hooks.h>
+#include <testsuite_tr1.h>
+
+void test01()
+{
+  bool test __attribute__((unused)) = true;
+  using std::is_constructible;
+  using namespace __gnu_test;
+
+  // Positive tests.
+  VERIFY( (test_relationship<is_constructible, ExplicitClass,
+	   double&>(true)) );
+  VERIFY( (test_relationship<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,
+	   int, double>(false)) );
+}
+
+int main()
+{
+  test01();
+  return 0;
+}
diff --git a/libstdc++-v3/testsuite/20_util/is_convertible/value.cc b/libstdc++-v3/testsuite/20_util/is_convertible/value.cc
index 6ec22d024a9c..f6282a901969 100644
--- a/libstdc++-v3/testsuite/20_util/is_convertible/value.cc
+++ b/libstdc++-v3/testsuite/20_util/is_convertible/value.cc
@@ -56,6 +56,7 @@ void test01()
   VERIFY( (test_relationship<is_convertible, void, void>(true)) );
   VERIFY( (test_relationship<is_convertible, const void, void>(true)) );
   VERIFY( (test_relationship<is_convertible, void, volatile void>(true)) );
+  VERIFY( (test_relationship<is_convertible, double&, ExplicitClass>(true)) );
 
   // Negative tests.
   VERIFY( (test_relationship<is_convertible, const int*, int*>(false)) );
@@ -93,6 +94,9 @@ void test01()
   VERIFY( (test_relationship<is_convertible, volatile int,
 	                                     volatile int&>(false)) );
   VERIFY( (test_relationship<is_convertible, int(int), int(&)(int)>(false)) );
+
+  VERIFY( (test_relationship<is_convertible, int&, ExplicitClass>(false)) );
+  VERIFY( (test_relationship<is_convertible, void*, ExplicitClass>(false)) );
 }
 
 int main()
diff --git a/libstdc++-v3/testsuite/20_util/is_explicitly_convertible/requirements/explicit_instantiation.cc b/libstdc++-v3/testsuite/20_util/is_explicitly_convertible/requirements/explicit_instantiation.cc
new file mode 100644
index 000000000000..87dd950b27d1
--- /dev/null
+++ b/libstdc++-v3/testsuite/20_util/is_explicitly_convertible/requirements/explicit_instantiation.cc
@@ -0,0 +1,31 @@
+// { dg-options "-std=gnu++0x" }
+// { dg-do compile }
+
+// 2009-12-30  Paolo Carlini  <paolo.carlini@oracle.com>
+
+// Copyright (C) 2009 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+// NB: This file is for testing type_traits with NO OTHER INCLUDES.
+
+#include <type_traits>
+
+namespace std
+{
+  typedef short test_type;
+  template struct is_explicitly_convertible<test_type, test_type>;
+}
diff --git a/libstdc++-v3/testsuite/20_util/is_explicitly_convertible/requirements/typedefs.cc b/libstdc++-v3/testsuite/20_util/is_explicitly_convertible/requirements/typedefs.cc
new file mode 100644
index 000000000000..52ba964b1fda
--- /dev/null
+++ b/libstdc++-v3/testsuite/20_util/is_explicitly_convertible/requirements/typedefs.cc
@@ -0,0 +1,36 @@
+// { dg-options "-std=gnu++0x" }
+// { dg-do compile }
+
+// 2009-12-30  Paolo Carlini  <paolo.carlini@oracle.com>
+//
+// Copyright (C) 2009 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+// 
+// NB: This file is for testing type_traits with NO OTHER INCLUDES.
+
+#include <type_traits>
+
+void test01()
+{
+  // Check for required typedefs
+  typedef std::is_explicitly_convertible<int, int>   test_type;
+  typedef test_type::value_type                      value_type;
+  typedef test_type::type                            type;
+  typedef test_type::type::value_type                type_value_type;
+  typedef test_type::type::type                      type_type;
+}
diff --git a/libstdc++-v3/testsuite/20_util/is_explicitly_convertible/value.cc b/libstdc++-v3/testsuite/20_util/is_explicitly_convertible/value.cc
new file mode 100644
index 000000000000..7e704873275a
--- /dev/null
+++ b/libstdc++-v3/testsuite/20_util/is_explicitly_convertible/value.cc
@@ -0,0 +1,45 @@
+// { dg-options "-std=gnu++0x" }
+
+// Copyright (C) 2009 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+#include <type_traits>
+#include <testsuite_hooks.h>
+#include <testsuite_tr1.h>
+
+void test01()
+{
+  bool test __attribute__((unused)) = true;
+  using std::is_explicitly_convertible;
+  using namespace __gnu_test;
+
+  // Positive tests.
+  VERIFY( (test_relationship<is_explicitly_convertible, double&,
+	   ExplicitClass>(true)) );
+  VERIFY( (test_relationship<is_explicitly_convertible, int&,
+	   ExplicitClass>(true)) );
+
+  // Negative tests.
+  VERIFY( (test_relationship<is_explicitly_convertible, void*,
+	   ExplicitClass>(false)) );
+}
+
+int main()
+{
+  test01();
+  return 0;
+}
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 65fc2cece7c1..b37963330c45 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 *-*-* } 549 }
-// { dg-error "declaration of" "" { target *-*-* } 511 }
+// { dg-error "invalid use of incomplete type" "" { target *-*-* } 598 }
+// { dg-error "declaration of" "" { target *-*-* } 560 }
 
 // { 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 795755f78546..0b842b39ea30 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 *-*-* } 470 }
-// { dg-error "declaration of" "" { target *-*-* } 432 }
+// { dg-error "invalid use of incomplete type" "" { target *-*-* } 519 }
+// { dg-error "declaration of" "" { target *-*-* } 481 }
 
 // { 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 c92de4378107..7ac45bdcaa08 100644
--- a/libstdc++-v3/testsuite/util/testsuite_tr1.h
+++ b/libstdc++-v3/testsuite/util/testsuite_tr1.h
@@ -67,6 +67,18 @@ namespace __gnu_test
       return ret;
     }
 
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+  template<template<typename...> class Relationship,
+           typename... Types>
+    bool
+    test_relationship(bool value)
+    {
+      bool ret = true;
+      ret &= Relationship<Types...>::value == value;
+      ret &= Relationship<Types...>::type::value == value;
+      return ret;
+    }
+#else
   template<template<typename, typename> class Relationship,
            typename Type1, typename Type2>
     bool
@@ -77,6 +89,7 @@ namespace __gnu_test
       ret &= Relationship<Type1, Type2>::type::value == value;
       return ret;
     }
+#endif
 
   // Test types.
   class ClassType { };
@@ -112,6 +125,12 @@ namespace __gnu_test
 
   class IncompleteClass;
 
+  struct ExplicitClass
+  {
+    ExplicitClass(double&);
+    explicit ExplicitClass(int&);
+  };
+
   int truncate_float(float x) { return (int)x; }
   long truncate_double(double x) { return (long)x; }
 
-- 
GitLab