utility (get(std::pair<>&&)): Add.
authorPaolo Carlini <paolo.carlini@oracle.com>
Mon, 16 May 2011 18:09:17 +0000 (18:09 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Mon, 16 May 2011 18:09:17 +0000 (18:09 +0000)
2011-05-16  Paolo Carlini  <paolo.carlini@oracle.com>

* include/std/utility (get(std::pair<>&&)): Add.
* include/bits/stl_pair.h (pair::swap(pair&),
swap(pair<>&, pair<>&)): Use noexcept.
* include/bits/random.h (discard_block_engine<>::base,
independent_bits_engine<>::base, shuffle_order_engine<>::base,
random_device::entropy): Use noexcept.
* include/std/array: Use noexcept where appropriate.
(get(array<>&&)): Add.
* testsuite/23_containers/array/requirements/get.cc: New.
* testsuite/20_util/pair/get.cc: Likewise.
* testsuite/20_util/weak_ptr/comparison/cmp_neg.cc: Tweak dg-error
line number.

From-SVN: r173798

libstdc++-v3/ChangeLog
libstdc++-v3/include/bits/random.h
libstdc++-v3/include/bits/stl_pair.h
libstdc++-v3/include/std/array
libstdc++-v3/include/std/utility
libstdc++-v3/testsuite/20_util/pair/get.cc [new file with mode: 0644]
libstdc++-v3/testsuite/20_util/weak_ptr/comparison/cmp_neg.cc
libstdc++-v3/testsuite/23_containers/array/requirements/get.cc [new file with mode: 0644]

index 7012d56523b0407868620e522f8f5247e9b57b5b..d4554d17b16f5d102736f7fed0854120c595001c 100644 (file)
@@ -1,3 +1,18 @@
+2011-05-16  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       * include/std/utility (get(std::pair<>&&)): Add.
+       * include/bits/stl_pair.h (pair::swap(pair&),
+       swap(pair<>&, pair<>&)): Use noexcept.
+       * include/bits/random.h (discard_block_engine<>::base,
+       independent_bits_engine<>::base, shuffle_order_engine<>::base,
+       random_device::entropy): Use noexcept.
+       * include/std/array: Use noexcept where appropriate.
+       (get(array<>&&)): Add.
+       * testsuite/23_containers/array/requirements/get.cc: New.
+       * testsuite/20_util/pair/get.cc: Likewise.
+       * testsuite/20_util/weak_ptr/comparison/cmp_neg.cc: Tweak dg-error
+       line number.
+
 2011-05-15  Paolo Carlini  <paolo.carlini@oracle.com>
 
        * include/bits/c++config (_GLIBCXX_NOEXCEPT, _GLIBCXX_USE_NOEXCEPT):
index 7b7f5966b3c79d9cb9e867a4faa3f1ad147f9654..f8f7ce9522e34c6645b0b762705c53e8fde00675 100644 (file)
@@ -881,7 +881,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
        *        object.
        */
       const _RandomNumberEngine&
-      base() const
+      base() const noexcept
       { return _M_b; }
 
       /**
@@ -1090,7 +1090,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
        *        object.
        */
       const _RandomNumberEngine&
-      base() const
+      base() const noexcept
       { return _M_b; }
 
       /**
@@ -1320,7 +1320,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
        * Gets a const reference to the underlying generator engine object.
        */
       const _RandomNumberEngine&
-      base() const
+      base() const noexcept
       { return _M_b; }
 
       /**
@@ -1553,7 +1553,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
     { return std::numeric_limits<result_type>::max(); }
 
     double
-    entropy() const
+    entropy() const noexcept
     { return 0.0; }
 
     result_type
index 8d137b29a13dc95fd38f36ff65fda24d12b53b85..7902f2653d700085f1d1a9cdcba7c22375eb95dc 100644 (file)
@@ -1,6 +1,7 @@
 // Pair implementation -*- C++ -*-
 
-// Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
+// Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
+// 2010, 2011
 // Free Software Foundation, Inc.
 //
 // This file is part of the GNU ISO C++ Library.  This library is free
@@ -152,6 +153,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 
       pair&
       operator=(pair&& __p)
+      // noexcept has to wait is_nothrow_move_assignable
       {
        first = std::move(__p.first);
        second = std::move(__p.second);
@@ -178,6 +180,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 
       void
       swap(pair& __p)
+      noexcept(noexcept(swap(first, __p.first))
+              && noexcept(swap(second, __p.second)))
       {
        using std::swap;
        swap(first, __p.first);
@@ -239,6 +243,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
   template<class _T1, class _T2>
     inline void
     swap(pair<_T1, _T2>& __x, pair<_T1, _T2>& __y)
+    noexcept(noexcept(__x.swap(__y)))
     { __x.swap(__y); }
 #endif
 
index a0bdd24a85a02d9bfded22423d38d34347be55c3..b0fc75b14bca3f0e1acd374b3de62898b0b7e19c 100644 (file)
@@ -1,6 +1,6 @@
 // <array> -*- C++ -*-
 
-// Copyright (C) 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
+// Copyright (C) 2007, 2008, 2009, 2010, 2011 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
@@ -83,66 +83,67 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 
       void
       swap(array& __other)
+      noexcept(noexcept(swap(std::declval<_Tp&>(), std::declval<_Tp&>())))
       { std::swap_ranges(begin(), end(), __other.begin()); }
 
       // Iterators.
       iterator
-      begin()
+      begin() noexcept
       { return iterator(std::__addressof(_M_instance[0])); }
 
       const_iterator
-      begin() const 
+      begin() const noexcept
       { return const_iterator(std::__addressof(_M_instance[0])); }
 
       iterator
-      end()
+      end() noexcept
       { return iterator(std::__addressof(_M_instance[_Nm])); }
 
       const_iterator
-      end() const
+      end() const noexcept
       { return const_iterator(std::__addressof(_M_instance[_Nm])); }
 
       reverse_iterator 
-      rbegin()
+      rbegin() noexcept
       { return reverse_iterator(end()); }
 
       const_reverse_iterator 
-      rbegin() const
+      rbegin() const noexcept
       { return const_reverse_iterator(end()); }
 
       reverse_iterator 
-      rend()
+      rend() noexcept
       { return reverse_iterator(begin()); }
 
       const_reverse_iterator 
-      rend() const
+      rend() const noexcept
       { return const_reverse_iterator(begin()); }
 
       const_iterator
-      cbegin() const 
+      cbegin() const noexcept
       { return const_iterator(std::__addressof(_M_instance[0])); }
 
       const_iterator
-      cend() const
+      cend() const noexcept
       { return const_iterator(std::__addressof(_M_instance[_Nm])); }
 
       const_reverse_iterator 
-      crbegin() const
+      crbegin() const noexcept
       { return const_reverse_iterator(end()); }
 
       const_reverse_iterator 
-      crend() const
+      crend() const noexcept
       { return const_reverse_iterator(begin()); }
 
       // Capacity.
       constexpr size_type 
-      size() const { return _Nm; }
+      size() const noexcept { return _Nm; }
 
       constexpr size_type 
-      max_size() const { return _Nm; }
+      max_size() const noexcept { return _Nm; }
 
       constexpr bool 
-      empty() const { return size() == 0; }
+      empty() const noexcept { return size() == 0; }
 
       // Element access.
       reference
@@ -186,11 +187,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       { return _Nm ? *(end() - 1) : *end(); }
 
       _Tp*
-      data()
+      data() noexcept
       { return std::__addressof(_M_instance[0]); }
 
       const _Tp*
-      data() const
+      data() const noexcept
       { return std::__addressof(_M_instance[0]); }
     };
 
@@ -228,13 +229,14 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
     operator>=(const array<_Tp, _Nm>& __one, const array<_Tp, _Nm>& __two)
     { return !(__one < __two); }
 
-  // Specialized algorithms [6.2.2.2].
+  // Specialized algorithms.
   template<typename _Tp, std::size_t _Nm>
     inline void
     swap(array<_Tp, _Nm>& __one, array<_Tp, _Nm>& __two)
+    noexcept(noexcept(__one.swap(__two)))
     { __one.swap(__two); }
 
-  // Tuple interface to class template array [6.2.2.5].
+  // Tuple interface to class template array.
 
   /// tuple_size
   template<typename _Tp> 
@@ -258,12 +260,17 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 
   template<std::size_t _Int, typename _Tp, std::size_t _Nm>
     inline _Tp&
-    get(array<_Tp, _Nm>& __arr)
+    get(array<_Tp, _Nm>& __arr) noexcept
     { return __arr[_Int]; }
 
+  template<std::size_t _Int, typename _Tp, std::size_t _Nm>
+    inline _Tp&&
+    get(array<_Tp, _Nm>&& __arr) noexcept
+    { return std::move(get<_Int>(__arr)); }
+
   template<std::size_t _Int, typename _Tp, std::size_t _Nm>
     inline const _Tp&
-    get(const array<_Tp, _Nm>& __arr)
+    get(const array<_Tp, _Nm>& __arr) noexcept
     { return __arr[_Int]; }
 
 _GLIBCXX_END_NAMESPACE_VERSION
index 245c41fa75dde001134aca4b8a2a7dc7526a5b58..6c1dd369ba463250e82d3cde4e1ed1079ceea93e 100644 (file)
@@ -1,6 +1,7 @@
 // <utility> -*- C++ -*-
 
-// Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
+// Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
+// 2010, 2011
 // Free Software Foundation, Inc.
 //
 // This file is part of the GNU ISO C++ Library.  This library is free
@@ -108,34 +109,59 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
     struct __pair_get<0>
     {
       template<typename _Tp1, typename _Tp2>
-      static _Tp1& __get(std::pair<_Tp1, _Tp2>& __pair)
-      { return __pair.first; }
+        static _Tp1&
+        __get(std::pair<_Tp1, _Tp2>& __pair) _GLIBCXX_NOEXCEPT
+        { return __pair.first; }
+
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+      template<typename _Tp1, typename _Tp2>
+        static _Tp1&&
+        __move_get(std::pair<_Tp1, _Tp2>&& __pair) noexcept
+        { return std::forward<_Tp1>(__pair.first); }
+#endif
 
       template<typename _Tp1, typename _Tp2>
-      static const _Tp1& __const_get(const std::pair<_Tp1, _Tp2>& __pair)
-      { return __pair.first; }
+        static const _Tp1&
+        __const_get(const std::pair<_Tp1, _Tp2>& __pair) _GLIBCXX_NOEXCEPT
+        { return __pair.first; }
     };
 
   template<>
     struct __pair_get<1>
     {
       template<typename _Tp1, typename _Tp2>
-      static _Tp2& __get(std::pair<_Tp1, _Tp2>& __pair)
-      { return __pair.second; }
+        static _Tp2&
+        __get(std::pair<_Tp1, _Tp2>& __pair) _GLIBCXX_NOEXCEPT
+        { return __pair.second; }
+
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+      template<typename _Tp1, typename _Tp2>
+        static _Tp2&&
+        __move_get(std::pair<_Tp1, _Tp2>&& __pair) noexcept
+        { return std::forward<_Tp2>(__pair.second); }
+#endif
 
       template<typename _Tp1, typename _Tp2>
-      static const _Tp2& __const_get(const std::pair<_Tp1, _Tp2>& __pair)
-      { return __pair.second; }
+        static const _Tp2&
+        __const_get(const std::pair<_Tp1, _Tp2>& __pair) _GLIBCXX_NOEXCEPT
+        { return __pair.second; }
     };
 
   template<std::size_t _Int, class _Tp1, class _Tp2>
     inline typename tuple_element<_Int, std::pair<_Tp1, _Tp2> >::type&
-    get(std::pair<_Tp1, _Tp2>& __in)
+    get(std::pair<_Tp1, _Tp2>& __in) _GLIBCXX_NOEXCEPT
     { return __pair_get<_Int>::__get(__in); }
 
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+  template<std::size_t _Int, class _Tp1, class _Tp2>
+    inline typename tuple_element<_Int, std::pair<_Tp1, _Tp2> >::type&&
+    get(std::pair<_Tp1, _Tp2>&& __in) noexcept
+    { return __pair_get<_Int>::__move_get(std::move(__in)); }
+#endif
+
   template<std::size_t _Int, class _Tp1, class _Tp2>
     inline const typename tuple_element<_Int, std::pair<_Tp1, _Tp2> >::type&
-    get(const std::pair<_Tp1, _Tp2>& __in)
+    get(const std::pair<_Tp1, _Tp2>& __in) _GLIBCXX_NOEXCEPT
     { return __pair_get<_Int>::__const_get(__in); }
 
 _GLIBCXX_END_NAMESPACE_VERSION
diff --git a/libstdc++-v3/testsuite/20_util/pair/get.cc b/libstdc++-v3/testsuite/20_util/pair/get.cc
new file mode 100644 (file)
index 0000000..3b68a1f
--- /dev/null
@@ -0,0 +1,31 @@
+// { dg-do compile }
+// { dg-options "-std=gnu++0x" }
+
+// 2011-05-16  Paolo Carlini  <paolo.carlini@oracle.com>
+//
+// Copyright (C) 2011 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 <utility>
+
+void test01()
+{
+  std::pair<float, int> p;
+
+  float&& pfirst __attribute__((unused)) = std::get<0>(std::move(p));
+  int&&  psecond __attribute__((unused)) = std::get<1>(std::move(p));
+}
index f81e5afb0c76feaafe2913873ea0545e8d19c416..919dbba74f59679ef865c7a4c15a541ebc0d8d93 100644 (file)
@@ -56,4 +56,4 @@ main()
 // { dg-warning "note" "" { target *-*-* } 1050 }
 // { dg-warning "note" "" { target *-*-* } 342 }
 // { dg-warning "note" "" { target *-*-* } 292 }
-// { dg-warning "note" "" { target *-*-* } 207 }
+// { dg-warning "note" "" { target *-*-* } 211 }
diff --git a/libstdc++-v3/testsuite/23_containers/array/requirements/get.cc b/libstdc++-v3/testsuite/23_containers/array/requirements/get.cc
new file mode 100644 (file)
index 0000000..1919aad
--- /dev/null
@@ -0,0 +1,31 @@
+// { dg-do compile }
+// { dg-options "-std=gnu++0x" }
+
+// 2011-05-16  Paolo Carlini  <paolo.carlini@oracle.com>
+//
+// Copyright (C) 2011 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 <array>
+
+void test01()
+{
+  std::array<int, 2> a;
+
+  int&& aone __attribute__((unused)) = std::get<0>(std::move(a));
+  int&& atwo __attribute__((unused)) = std::get<1>(std::move(a));
+}