]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
[multiple changes]
authorPaolo Carlini <paolo@gcc.gnu.org>
Wed, 30 Dec 2009 23:22:58 +0000 (23:22 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Wed, 30 Dec 2009 23:22:58 +0000 (23:22 +0000)
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

13 files changed:
libstdc++-v3/ChangeLog
libstdc++-v3/include/std/type_traits
libstdc++-v3/testsuite/20_util/declval/requirements/1_neg.cc
libstdc++-v3/testsuite/20_util/is_constructible/requirements/explicit_instantiation.cc [new file with mode: 0644]
libstdc++-v3/testsuite/20_util/is_constructible/requirements/typedefs.cc [new file with mode: 0644]
libstdc++-v3/testsuite/20_util/is_constructible/value.cc [new file with mode: 0644]
libstdc++-v3/testsuite/20_util/is_convertible/value.cc
libstdc++-v3/testsuite/20_util/is_explicitly_convertible/requirements/explicit_instantiation.cc [new file with mode: 0644]
libstdc++-v3/testsuite/20_util/is_explicitly_convertible/requirements/typedefs.cc [new file with mode: 0644]
libstdc++-v3/testsuite/20_util/is_explicitly_convertible/value.cc [new file with mode: 0644]
libstdc++-v3/testsuite/20_util/make_signed/requirements/typedefs_neg.cc
libstdc++-v3/testsuite/20_util/make_unsigned/requirements/typedefs_neg.cc
libstdc++-v3/testsuite/util/testsuite_tr1.h

index 21ab1f358cfd86628dd9a50e8ced614c8ae2a57f..5b5e39ddc9029422eb8ea93b8893e2038dc2635c 100644 (file)
@@ -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.
index dcfa1c9c4abb0b34b515c47d9939469b9ab7b808..09ad8637de0e14eac07b0cf97bb4a7b919dd6f71 100644 (file)
@@ -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
     { 
index d22a58ba038fabd47b1a1a8ef348c0ec530be553..dfb522e819d9e171776b88f77a70444be10a2107 100644 (file)
@@ -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 (file)
index 0000000..356f73c
--- /dev/null
@@ -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 (file)
index 0000000..4b9ecd9
--- /dev/null
@@ -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 (file)
index 0000000..5ff57f6
--- /dev/null
@@ -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;
+}
index 6ec22d024a9c1e86caf0e264e660d94ab403cd6d..f6282a9019691c16e8c0249fa49108b78314f77d 100644 (file)
@@ -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 (file)
index 0000000..87dd950
--- /dev/null
@@ -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 (file)
index 0000000..52ba964
--- /dev/null
@@ -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 (file)
index 0000000..7e70487
--- /dev/null
@@ -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;
+}
index 65fc2cece7c1cdee0e57aeb23cbfd4fb2d49f213..b37963330c4583142520e04e26583a91af8c3dc0 100644 (file)
@@ -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" }
index 795755f78546686c302acd342d8137435b0fe3da..0b842b39ea30b5df938c403e50aada2c0114fc0b 100644 (file)
@@ -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" }
index c92de4378107a4f88ee1b5a2dcea8f3d3dfda151..7ac45bdcaa0895a31f68a0e07836985debb1e056 100644 (file)
@@ -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; }