From: Paolo Carlini Date: Mon, 16 May 2011 18:09:17 +0000 (+0000) Subject: utility (get(std::pair<>&&)): Add. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=18eeaec47bc14ce2a1ffc7011a4f7bdb33bc070c;p=gcc.git utility (get(std::pair<>&&)): Add. 2011-05-16 Paolo Carlini * 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 --- diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 7012d56523b..d4554d17b16 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,18 @@ +2011-05-16 Paolo Carlini + + * 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 * include/bits/c++config (_GLIBCXX_NOEXCEPT, _GLIBCXX_USE_NOEXCEPT): diff --git a/libstdc++-v3/include/bits/random.h b/libstdc++-v3/include/bits/random.h index 7b7f5966b3c..f8f7ce9522e 100644 --- a/libstdc++-v3/include/bits/random.h +++ b/libstdc++-v3/include/bits/random.h @@ -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::max(); } double - entropy() const + entropy() const noexcept { return 0.0; } result_type diff --git a/libstdc++-v3/include/bits/stl_pair.h b/libstdc++-v3/include/bits/stl_pair.h index 8d137b29a13..7902f2653d7 100644 --- a/libstdc++-v3/include/bits/stl_pair.h +++ b/libstdc++-v3/include/bits/stl_pair.h @@ -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 inline void swap(pair<_T1, _T2>& __x, pair<_T1, _T2>& __y) + noexcept(noexcept(__x.swap(__y))) { __x.swap(__y); } #endif diff --git a/libstdc++-v3/include/std/array b/libstdc++-v3/include/std/array index a0bdd24a85a..b0fc75b14bc 100644 --- a/libstdc++-v3/include/std/array +++ b/libstdc++-v3/include/std/array @@ -1,6 +1,6 @@ // -*- 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 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 @@ -258,12 +260,17 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION template inline _Tp& - get(array<_Tp, _Nm>& __arr) + get(array<_Tp, _Nm>& __arr) noexcept { return __arr[_Int]; } + template + inline _Tp&& + get(array<_Tp, _Nm>&& __arr) noexcept + { return std::move(get<_Int>(__arr)); } + template inline const _Tp& - get(const array<_Tp, _Nm>& __arr) + get(const array<_Tp, _Nm>& __arr) noexcept { return __arr[_Int]; } _GLIBCXX_END_NAMESPACE_VERSION diff --git a/libstdc++-v3/include/std/utility b/libstdc++-v3/include/std/utility index 245c41fa75d..6c1dd369ba4 100644 --- a/libstdc++-v3/include/std/utility +++ b/libstdc++-v3/include/std/utility @@ -1,6 +1,7 @@ // -*- 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 - 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 + static _Tp1&& + __move_get(std::pair<_Tp1, _Tp2>&& __pair) noexcept + { return std::forward<_Tp1>(__pair.first); } +#endif template - 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 - 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 + static _Tp2&& + __move_get(std::pair<_Tp1, _Tp2>&& __pair) noexcept + { return std::forward<_Tp2>(__pair.second); } +#endif template - 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 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 + 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 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 index 00000000000..3b68a1f9bd1 --- /dev/null +++ b/libstdc++-v3/testsuite/20_util/pair/get.cc @@ -0,0 +1,31 @@ +// { dg-do compile } +// { dg-options "-std=gnu++0x" } + +// 2011-05-16 Paolo Carlini +// +// 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 +// . + +#include + +void test01() +{ + std::pair p; + + float&& pfirst __attribute__((unused)) = std::get<0>(std::move(p)); + int&& psecond __attribute__((unused)) = std::get<1>(std::move(p)); +} diff --git a/libstdc++-v3/testsuite/20_util/weak_ptr/comparison/cmp_neg.cc b/libstdc++-v3/testsuite/20_util/weak_ptr/comparison/cmp_neg.cc index f81e5afb0c7..919dbba74f5 100644 --- a/libstdc++-v3/testsuite/20_util/weak_ptr/comparison/cmp_neg.cc +++ b/libstdc++-v3/testsuite/20_util/weak_ptr/comparison/cmp_neg.cc @@ -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 index 00000000000..1919aade3b0 --- /dev/null +++ b/libstdc++-v3/testsuite/23_containers/array/requirements/get.cc @@ -0,0 +1,31 @@ +// { dg-do compile } +// { dg-options "-std=gnu++0x" } + +// 2011-05-16 Paolo Carlini +// +// 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 +// . + +#include + +void test01() +{ + std::array a; + + int&& aone __attribute__((unused)) = std::get<0>(std::move(a)); + int&& atwo __attribute__((unused)) = std::get<1>(std::move(a)); +}