Hi, also added the missing get(&&) overloads for std::array and std::pair.
Tested x86_64-linux, committed. Paolo. //////////////////////
2011-05-16 Paolo Carlini <paolo.carl...@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.
Index: include/std/utility =================================================================== --- include/std/utility (revision 173794) +++ include/std/utility (working copy) @@ -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 @@ 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 const _Tp1& __const_get(const std::pair<_Tp1, _Tp2>& __pair) - { return __pair.first; } + 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) _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 const _Tp2& __const_get(const std::pair<_Tp1, _Tp2>& __pair) - { return __pair.second; } + 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) _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 Index: include/std/array =================================================================== --- include/std/array (revision 173794) +++ include/std/array (working copy) @@ -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 @@ 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 @@ { 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 @@ 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 @@ 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: include/bits/stl_pair.h =================================================================== --- include/bits/stl_pair.h (revision 173794) +++ include/bits/stl_pair.h (working copy) @@ -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 @@ 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 @@ 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 @@ 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: include/bits/random.h =================================================================== --- include/bits/random.h (revision 173794) +++ include/bits/random.h (working copy) @@ -881,7 +881,7 @@ * object. */ const _RandomNumberEngine& - base() const + base() const noexcept { return _M_b; } /** @@ -1090,7 +1090,7 @@ * object. */ const _RandomNumberEngine& - base() const + base() const noexcept { return _M_b; } /** @@ -1320,7 +1320,7 @@ * Gets a const reference to the underlying generator engine object. */ const _RandomNumberEngine& - base() const + base() const noexcept { return _M_b; } /** @@ -1553,7 +1553,7 @@ { return std::numeric_limits<result_type>::max(); } double - entropy() const + entropy() const noexcept { return 0.0; } result_type Index: testsuite/23_containers/array/requirements/get.cc =================================================================== --- testsuite/23_containers/array/requirements/get.cc (revision 0) +++ testsuite/23_containers/array/requirements/get.cc (revision 0) @@ -0,0 +1,31 @@ +// { dg-do compile } +// { dg-options "-std=gnu++0x" } + +// 2011-05-16 Paolo Carlini <paolo.carl...@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)); +} Index: testsuite/20_util/pair/get.cc =================================================================== --- testsuite/20_util/pair/get.cc (revision 0) +++ testsuite/20_util/pair/get.cc (revision 0) @@ -0,0 +1,31 @@ +// { dg-do compile } +// { dg-options "-std=gnu++0x" } + +// 2011-05-16 Paolo Carlini <paolo.carl...@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: testsuite/20_util/weak_ptr/comparison/cmp_neg.cc =================================================================== --- testsuite/20_util/weak_ptr/comparison/cmp_neg.cc (revision 173794) +++ testsuite/20_util/weak_ptr/comparison/cmp_neg.cc (working copy) @@ -56,4 +56,4 @@ // { 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 }