2010-06-09 Paolo Carlini <paolo.carlini@oracle.com>
authorpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 10 Jun 2010 00:43:50 +0000 (00:43 +0000)
committerpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 10 Jun 2010 00:43:50 +0000 (00:43 +0000)
* include/std/type_traits (is_nothrow_constructible): Add.
(declval): Add noexcept specification.
* testsuite/util/testsuite_tr1.h (struct NothrowExplicitClass,
ThrowExplicitClass, NoexceptExplicitClass, ExceptExplicitClass):
Add.
* testsuite/20_util/is_nothrow_constructible/value.cc: New.
* testsuite/20_util/is_nothrow_constructible/requirements/
typedefs.cc: Likewise.
* testsuite/20_util/is_nothrow_constructible/requirements/
explicit_instantiation.cc: Likewise.
* 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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@160523 138bc75d-0d04-0410-961f-82ee72b054a4

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_nothrow_constructible/requirements/explicit_instantiation.cc [new file with mode: 0644]
libstdc++-v3/testsuite/20_util/is_nothrow_constructible/requirements/typedefs.cc [new file with mode: 0644]
libstdc++-v3/testsuite/20_util/is_nothrow_constructible/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 2ea2b29..82fc51d 100644 (file)
@@ -1,3 +1,21 @@
+2010-06-09  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       * include/std/type_traits (is_nothrow_constructible): Add.
+       (declval): Add noexcept specification.
+       * testsuite/util/testsuite_tr1.h (struct NothrowExplicitClass,
+       ThrowExplicitClass, NoexceptExplicitClass, ExceptExplicitClass):
+       Add.
+       * testsuite/20_util/is_nothrow_constructible/value.cc: New.
+       * testsuite/20_util/is_nothrow_constructible/requirements/
+       typedefs.cc: Likewise.
+       * testsuite/20_util/is_nothrow_constructible/requirements/
+       explicit_instantiation.cc: Likewise.
+       * 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.
+
 2010-06-09  Khem Raj  <raj.khem@gmail.com>
 
        PR libstdc++/44461
index ba9d62c..42a462e 100644 (file)
@@ -193,7 +193,7 @@ namespace std
     { };
 
   template<typename _Tp>
-    typename add_rvalue_reference<_Tp>::type declval();
+    typename add_rvalue_reference<_Tp>::type declval() noexcept;
 
   template<typename _Tp, typename... _Args>
     class __is_constructible_helper
@@ -234,6 +234,28 @@ namespace std
                                                         _Args...>::__value>
     { };
 
+  template<bool, typename _Tp, typename... _Args>
+    struct __is_nt_constructible_helper
+    { static const bool __value = false; };
+
+  template<typename _Tp, typename... _Args>
+    struct __is_nt_constructible_helper<true, _Tp, _Args...>
+    { static const bool __value = noexcept(_Tp(declval<_Args>()...)); };
+
+  template<typename _Tp, typename _Arg>
+    struct __is_nt_constructible_helper<true, _Tp, _Arg>
+    {
+      static const bool __value = noexcept(static_cast<_Tp>(declval<_Arg>()));
+    };
+
+  /// is_nothrow_constructible
+  template<typename _Tp, typename... _Args>
+    struct is_nothrow_constructible
+    : public integral_constant<bool,
+         __is_nt_constructible_helper<is_constructible<_Tp, _Args...>::value,
+                                      _Tp, _Args...>::__value>
+    { };
+
   /// has_trivial_default_constructor
   template<typename _Tp>
     struct has_trivial_default_constructor
@@ -649,7 +671,7 @@ namespace std
 
   template<typename _Tp>
     inline typename add_rvalue_reference<_Tp>::type
-    declval()
+    declval() noexcept
     {
       static_assert(__declval_protector<_Tp>::__stop,
                    "declval() must not be used!");
index c3b5022..727f1c4 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 *-*-* } 654 }
+// { dg-error "static assertion failed" "" { target *-*-* } 676 }
 // { dg-error "instantiated from here" "" { target *-*-* } 30 }
 // { dg-excess-errors "In function" }
 
diff --git a/libstdc++-v3/testsuite/20_util/is_nothrow_constructible/requirements/explicit_instantiation.cc b/libstdc++-v3/testsuite/20_util/is_nothrow_constructible/requirements/explicit_instantiation.cc
new file mode 100644 (file)
index 0000000..37ba9eb
--- /dev/null
@@ -0,0 +1,31 @@
+// { dg-options "-std=gnu++0x" }
+// { dg-do compile }
+
+// 2010-06-09  Paolo Carlini  <paolo.carlini@oracle.com>
+
+// Copyright (C) 2010 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_nothrow_constructible<test_type, test_type>;
+}
diff --git a/libstdc++-v3/testsuite/20_util/is_nothrow_constructible/requirements/typedefs.cc b/libstdc++-v3/testsuite/20_util/is_nothrow_constructible/requirements/typedefs.cc
new file mode 100644 (file)
index 0000000..53a64a7
--- /dev/null
@@ -0,0 +1,36 @@
+// { dg-options "-std=gnu++0x" }
+// { dg-do compile }
+
+// 2010-06-09  Paolo Carlini  <paolo.carlini@oracle.com>
+//
+// Copyright (C) 2010 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_nothrow_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_nothrow_constructible/value.cc b/libstdc++-v3/testsuite/20_util/is_nothrow_constructible/value.cc
new file mode 100644 (file)
index 0000000..b3246fa
--- /dev/null
@@ -0,0 +1,78 @@
+// { dg-options "-std=gnu++0x" }
+
+// 2010-06-09  Paolo Carlini  <paolo.carlini@oracle.com>
+
+// Copyright (C) 2010 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_nothrow_constructible;
+  using namespace __gnu_test;
+
+  // Positive tests.
+  VERIFY( (test_property<is_nothrow_constructible, NoexceptExplicitClass,
+          double&>(true)) );
+  VERIFY( (test_property<is_nothrow_constructible, NoexceptExplicitClass,
+          int&>(true)) );
+  VERIFY( (test_property<is_nothrow_constructible, NoexceptExplicitClass,
+          double&, int&, double&>(true)) );
+  VERIFY( (test_property<is_nothrow_constructible, NothrowExplicitClass,
+          double&>(true)) );
+  VERIFY( (test_property<is_nothrow_constructible, NothrowExplicitClass,
+          int&>(true)) );
+  VERIFY( (test_property<is_nothrow_constructible, NothrowExplicitClass,
+          double&, int&, double&>(true)) );
+
+  // Negative tests.
+  VERIFY( (test_property<is_nothrow_constructible, NoexceptExplicitClass,
+          void*>(false)) );
+  VERIFY( (test_property<is_nothrow_constructible, NoexceptExplicitClass>
+          (false)) );
+  VERIFY( (test_property<is_nothrow_constructible, NoexceptExplicitClass,
+          int, double>(false)) );
+  VERIFY( (test_property<is_nothrow_constructible, NothrowExplicitClass,
+          void*>(false)) );
+  VERIFY( (test_property<is_nothrow_constructible, NothrowExplicitClass>
+          (false)) );
+  VERIFY( (test_property<is_nothrow_constructible, NothrowExplicitClass,
+          int, double>(false)) );
+
+  VERIFY( (test_property<is_nothrow_constructible, ExceptExplicitClass,
+          double&>(false)) );
+  VERIFY( (test_property<is_nothrow_constructible, ExceptExplicitClass,
+          int&>(false)) );
+  VERIFY( (test_property<is_nothrow_constructible, ExceptExplicitClass,
+          double&, int&, double&>(false)) );
+  VERIFY( (test_property<is_nothrow_constructible, ThrowExplicitClass,
+          double&>(false)) );
+  VERIFY( (test_property<is_nothrow_constructible, ThrowExplicitClass,
+          int&>(false)) );
+  VERIFY( (test_property<is_nothrow_constructible, ThrowExplicitClass,
+          double&, int&, double&>(false)) );
+}
+
+int main()
+{
+  test01();
+  return 0;
+}
index 7a8ad66..8f62662 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 *-*-* } 617 }
-// { dg-error "declaration of" "" { target *-*-* } 581 }
+// { dg-error "invalid use of incomplete type" "" { target *-*-* } 639 }
+// { dg-error "declaration of" "" { target *-*-* } 603 }
 
 // { dg-excess-errors "At global scope" }
 // { dg-excess-errors "In instantiation of" }
index 23bca2b..3648236 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 *-*-* } 540 }
-// { dg-error "declaration of" "" { target *-*-* } 504 }
+// { dg-error "invalid use of incomplete type" "" { target *-*-* } 562 }
+// { dg-error "declaration of" "" { target *-*-* } 526 }
 
 // { dg-excess-errors "At global scope" }
 // { dg-excess-errors "In instantiation of" }
index 4f3e574..5aac182 100644 (file)
@@ -1,7 +1,8 @@
 // -*- C++ -*-
 // Testing utilities for the tr1 testsuite.
 //
-// Copyright (C) 2004, 2005, 2006, 2007, 2009 Free Software Foundation, Inc.
+// Copyright (C) 2004, 2005, 2006, 2007, 2009, 2010
+// 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
@@ -127,8 +128,39 @@ namespace __gnu_test
   {
     ExplicitClass(double&);
     explicit ExplicitClass(int&);
+    ExplicitClass(double&, int&, double&);
   };
 
+  struct NothrowExplicitClass
+  {
+    NothrowExplicitClass(double&) throw();
+    explicit NothrowExplicitClass(int&) throw();
+    NothrowExplicitClass(double&, int&, double&) throw();
+  };
+
+  struct ThrowExplicitClass
+  {
+    ThrowExplicitClass(double&) throw(int);
+    explicit ThrowExplicitClass(int&) throw(int);
+    ThrowExplicitClass(double&, int&, double&) throw(int);
+  };
+
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+  struct NoexceptExplicitClass
+  {
+    NoexceptExplicitClass(double&) noexcept(true);
+    explicit NoexceptExplicitClass(int&) noexcept(true);
+    NoexceptExplicitClass(double&, int&, double&) noexcept(true);
+  };
+
+  struct ExceptExplicitClass
+  {
+    ExceptExplicitClass(double&) noexcept(false);
+    explicit ExceptExplicitClass(int&) noexcept(false);
+    ExceptExplicitClass(double&, int&, double&) noexcept(false);
+  };
+#endif
+
   struct NType   // neither trivial nor standard-layout
   {
     int i;