diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index cf411e6c963..77b5e12d076 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,30 @@ +2013-09-18 Marc Glisse + + PR libstdc++/58338 + * include/bits/stl_iterator.h (__normal_iterator) [__normal_iterator, + _M_const_cast, operator*, operator->, operator++, operator--, + operator[], operator+=, operator+, operator-=, operator-, base]: + Mark as noexcept. + (operator==(const __normal_iterator&, const __normal_iterator&), + operator!=(const __normal_iterator&, const __normal_iterator&), + operator<(const __normal_iterator&, const __normal_iterator&), + operator>(const __normal_iterator&, const __normal_iterator&), + operator<=(const __normal_iterator&, const __normal_iterator&), + operator>=(const __normal_iterator&, const __normal_iterator&), + operator-(const __normal_iterator&, const __normal_iterator&), + operator+(difference_type, const __normal_iterator&)): Likewise. + * include/bits/stl_list.h (list) [splice, _M_check_equal_allocators]: + Likewise. + (list::_M_check_equal_allocators): Abort instead of throwing. + * include/debug/array (array) [operator[], front, back]: Mark as + noexcept. + * include/profile/array (array) [operator[], front, back]: Likewise. + * include/std/array (array) [operator[], front, back]: Likewise. + * include/debug/list (list::splice): Likewise. + * include/profile/list (list::splice): Likewise. + * testsuite/23_containers/list/operations/5.cc: Remove file. + * testsuite/23_containers/list/operations/5.h: Likewise. + 2013-09-18 Tim Shen * include/bits/regex.h: Add friend classes. diff --git a/libstdc++-v3/include/bits/stl_iterator.h b/libstdc++-v3/include/bits/stl_iterator.h index cde442fb249..1f555a4ef28 100644 --- a/libstdc++-v3/include/bits/stl_iterator.h +++ b/libstdc++-v3/include/bits/stl_iterator.h @@ -721,22 +721,24 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION typedef typename __traits_type::reference reference; typedef typename __traits_type::pointer pointer; - _GLIBCXX_CONSTEXPR __normal_iterator() : _M_current(_Iterator()) { } + _GLIBCXX_CONSTEXPR __normal_iterator() _GLIBCXX_NOEXCEPT + : _M_current(_Iterator()) { } explicit - __normal_iterator(const _Iterator& __i) : _M_current(__i) { } + __normal_iterator(const _Iterator& __i) _GLIBCXX_NOEXCEPT + : _M_current(__i) { } // Allow iterator to const_iterator conversion template __normal_iterator(const __normal_iterator<_Iter, typename __enable_if< (std::__are_same<_Iter, typename _Container::pointer>::__value), - _Container>::__type>& __i) + _Container>::__type>& __i) _GLIBCXX_NOEXCEPT : _M_current(__i.base()) { } #if __cplusplus >= 201103L __normal_iterator - _M_const_cast() const + _M_const_cast() const noexcept { using _PTraits = std::pointer_traits; return __normal_iterator @@ -751,59 +753,59 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION // Forward iterator requirements reference - operator*() const + operator*() const _GLIBCXX_NOEXCEPT { return *_M_current; } pointer - operator->() const + operator->() const _GLIBCXX_NOEXCEPT { return _M_current; } __normal_iterator& - operator++() + operator++() _GLIBCXX_NOEXCEPT { ++_M_current; return *this; } __normal_iterator - operator++(int) + operator++(int) _GLIBCXX_NOEXCEPT { return __normal_iterator(_M_current++); } // Bidirectional iterator requirements __normal_iterator& - operator--() + operator--() _GLIBCXX_NOEXCEPT { --_M_current; return *this; } __normal_iterator - operator--(int) + operator--(int) _GLIBCXX_NOEXCEPT { return __normal_iterator(_M_current--); } // Random access iterator requirements reference - operator[](difference_type __n) const + operator[](difference_type __n) const _GLIBCXX_NOEXCEPT { return _M_current[__n]; } __normal_iterator& - operator+=(difference_type __n) + operator+=(difference_type __n) _GLIBCXX_NOEXCEPT { _M_current += __n; return *this; } __normal_iterator - operator+(difference_type __n) const + operator+(difference_type __n) const _GLIBCXX_NOEXCEPT { return __normal_iterator(_M_current + __n); } __normal_iterator& - operator-=(difference_type __n) + operator-=(difference_type __n) _GLIBCXX_NOEXCEPT { _M_current -= __n; return *this; } __normal_iterator - operator-(difference_type __n) const + operator-(difference_type __n) const _GLIBCXX_NOEXCEPT { return __normal_iterator(_M_current - __n); } const _Iterator& - base() const + base() const _GLIBCXX_NOEXCEPT { return _M_current; } }; @@ -820,24 +822,28 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION inline bool operator==(const __normal_iterator<_IteratorL, _Container>& __lhs, const __normal_iterator<_IteratorR, _Container>& __rhs) + _GLIBCXX_NOEXCEPT { return __lhs.base() == __rhs.base(); } template inline bool operator==(const __normal_iterator<_Iterator, _Container>& __lhs, const __normal_iterator<_Iterator, _Container>& __rhs) + _GLIBCXX_NOEXCEPT { return __lhs.base() == __rhs.base(); } template inline bool operator!=(const __normal_iterator<_IteratorL, _Container>& __lhs, const __normal_iterator<_IteratorR, _Container>& __rhs) + _GLIBCXX_NOEXCEPT { return __lhs.base() != __rhs.base(); } template inline bool operator!=(const __normal_iterator<_Iterator, _Container>& __lhs, const __normal_iterator<_Iterator, _Container>& __rhs) + _GLIBCXX_NOEXCEPT { return __lhs.base() != __rhs.base(); } // Random access iterator requirements @@ -845,48 +851,56 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION inline bool operator<(const __normal_iterator<_IteratorL, _Container>& __lhs, const __normal_iterator<_IteratorR, _Container>& __rhs) + _GLIBCXX_NOEXCEPT { return __lhs.base() < __rhs.base(); } template inline bool operator<(const __normal_iterator<_Iterator, _Container>& __lhs, const __normal_iterator<_Iterator, _Container>& __rhs) + _GLIBCXX_NOEXCEPT { return __lhs.base() < __rhs.base(); } template inline bool operator>(const __normal_iterator<_IteratorL, _Container>& __lhs, const __normal_iterator<_IteratorR, _Container>& __rhs) + _GLIBCXX_NOEXCEPT { return __lhs.base() > __rhs.base(); } template inline bool operator>(const __normal_iterator<_Iterator, _Container>& __lhs, const __normal_iterator<_Iterator, _Container>& __rhs) + _GLIBCXX_NOEXCEPT { return __lhs.base() > __rhs.base(); } template inline bool operator<=(const __normal_iterator<_IteratorL, _Container>& __lhs, const __normal_iterator<_IteratorR, _Container>& __rhs) + _GLIBCXX_NOEXCEPT { return __lhs.base() <= __rhs.base(); } template inline bool operator<=(const __normal_iterator<_Iterator, _Container>& __lhs, const __normal_iterator<_Iterator, _Container>& __rhs) + _GLIBCXX_NOEXCEPT { return __lhs.base() <= __rhs.base(); } template inline bool operator>=(const __normal_iterator<_IteratorL, _Container>& __lhs, const __normal_iterator<_IteratorR, _Container>& __rhs) + _GLIBCXX_NOEXCEPT { return __lhs.base() >= __rhs.base(); } template inline bool operator>=(const __normal_iterator<_Iterator, _Container>& __lhs, const __normal_iterator<_Iterator, _Container>& __rhs) + _GLIBCXX_NOEXCEPT { return __lhs.base() >= __rhs.base(); } // _GLIBCXX_RESOLVE_LIB_DEFECTS @@ -898,7 +912,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION // DR 685. inline auto operator-(const __normal_iterator<_IteratorL, _Container>& __lhs, - const __normal_iterator<_IteratorR, _Container>& __rhs) + const __normal_iterator<_IteratorR, _Container>& __rhs) noexcept -> decltype(__lhs.base() - __rhs.base()) #else inline typename __normal_iterator<_IteratorL, _Container>::difference_type @@ -911,12 +925,14 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION inline typename __normal_iterator<_Iterator, _Container>::difference_type operator-(const __normal_iterator<_Iterator, _Container>& __lhs, const __normal_iterator<_Iterator, _Container>& __rhs) + _GLIBCXX_NOEXCEPT { return __lhs.base() - __rhs.base(); } template inline __normal_iterator<_Iterator, _Container> operator+(typename __normal_iterator<_Iterator, _Container>::difference_type __n, const __normal_iterator<_Iterator, _Container>& __i) + _GLIBCXX_NOEXCEPT { return __normal_iterator<_Iterator, _Container>(__i.base() + __n); } _GLIBCXX_END_NAMESPACE_VERSION diff --git a/libstdc++-v3/include/bits/stl_list.h b/libstdc++-v3/include/bits/stl_list.h index 4b009ccfa15..71ef819176c 100644 --- a/libstdc++-v3/include/bits/stl_list.h +++ b/libstdc++-v3/include/bits/stl_list.h @@ -1309,7 +1309,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER */ void #if __cplusplus >= 201103L - splice(const_iterator __position, list&& __x) + splice(const_iterator __position, list&& __x) noexcept #else splice(iterator __position, list& __x) #endif @@ -1325,7 +1325,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER #if __cplusplus >= 201103L void - splice(const_iterator __position, list& __x) + splice(const_iterator __position, list& __x) noexcept { splice(__position, std::move(__x)); } #endif @@ -1341,7 +1341,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER * inserts it into the current list before @a __position. */ void - splice(const_iterator __position, list&& __x, const_iterator __i) + splice(const_iterator __position, list&& __x, const_iterator __i) noexcept #else /** * @brief Insert element from another %list. @@ -1380,7 +1380,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER * inserts it into the current list before @a __position. */ void - splice(const_iterator __position, list& __x, const_iterator __i) + splice(const_iterator __position, list& __x, const_iterator __i) noexcept { splice(__position, std::move(__x), __i); } #endif @@ -1400,7 +1400,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER */ void splice(const_iterator __position, list&& __x, const_iterator __first, - const_iterator __last) + const_iterator __last) noexcept #else /** * @brief Insert range from another %list. @@ -1446,7 +1446,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER */ void splice(const_iterator __position, list& __x, const_iterator __first, - const_iterator __last) + const_iterator __last) noexcept { splice(__position, std::move(__x), __first, __last); } #endif @@ -1696,11 +1696,11 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER // To implement the splice (and merge) bits of N1599. void - _M_check_equal_allocators(list& __x) + _M_check_equal_allocators(list& __x) _GLIBCXX_NOEXCEPT { if (std::__alloc_neq:: _S_do_it(_M_get_Node_allocator(), __x._M_get_Node_allocator())) - __throw_runtime_error(__N("list::_M_check_equal_allocators")); + __builtin_abort(); } }; diff --git a/libstdc++-v3/include/debug/array b/libstdc++-v3/include/debug/array index bce10cf3f12..d3eea853856 100644 --- a/libstdc++-v3/include/debug/array +++ b/libstdc++-v3/include/debug/array @@ -147,7 +147,7 @@ namespace __debug // Element access. reference - operator[](size_type __n) + operator[](size_type __n) noexcept { __glibcxx_check_subscript(__n); return _AT_Type::_S_ref(_M_elems, __n); @@ -180,14 +180,14 @@ namespace __debug } reference - front() + front() noexcept { __glibcxx_check_nonempty(); return *begin(); } constexpr const_reference - front() const + front() const noexcept { return _Nm ? _AT_Type::_S_ref(_M_elems, 0) : (_GLIBCXX_THROW_OR_ABORT(_Array_check_nonempty<_Nm>()), @@ -195,14 +195,14 @@ namespace __debug } reference - back() + back() noexcept { __glibcxx_check_nonempty(); return _Nm ? *(end() - 1) : *end(); } constexpr const_reference - back() const + back() const noexcept { return _Nm ? _AT_Type::_S_ref(_M_elems, _Nm - 1) : (_GLIBCXX_THROW_OR_ABORT(_Array_check_nonempty<_Nm>()), diff --git a/libstdc++-v3/include/debug/list b/libstdc++-v3/include/debug/list index bd407e64a98..89c26e425ae 100644 --- a/libstdc++-v3/include/debug/list +++ b/libstdc++-v3/include/debug/list @@ -515,7 +515,7 @@ namespace __debug // 23.2.2.4 list operations: void #if __cplusplus >= 201103L - splice(const_iterator __position, list&& __x) + splice(const_iterator __position, list&& __x) noexcept #else splice(iterator __position, list& __x) #endif @@ -529,13 +529,13 @@ namespace __debug #if __cplusplus >= 201103L void - splice(const_iterator __position, list& __x) + splice(const_iterator __position, list& __x) noexcept { splice(__position, std::move(__x)); } #endif void #if __cplusplus >= 201103L - splice(const_iterator __position, list&& __x, const_iterator __i) + splice(const_iterator __position, list&& __x, const_iterator __i) noexcept #else splice(iterator __position, list& __x, iterator __i) #endif @@ -561,14 +561,14 @@ namespace __debug #if __cplusplus >= 201103L void - splice(const_iterator __position, list& __x, const_iterator __i) + splice(const_iterator __position, list& __x, const_iterator __i) noexcept { splice(__position, std::move(__x), __i); } #endif void #if __cplusplus >= 201103L splice(const_iterator __position, list&& __x, const_iterator __first, - const_iterator __last) + const_iterator __last) noexcept #else splice(iterator __position, list& __x, iterator __first, iterator __last) @@ -608,7 +608,7 @@ namespace __debug #if __cplusplus >= 201103L void splice(const_iterator __position, list& __x, - const_iterator __first, const_iterator __last) + const_iterator __first, const_iterator __last) noexcept { splice(__position, std::move(__x), __first, __last); } #endif diff --git a/libstdc++-v3/include/profile/array b/libstdc++-v3/include/profile/array index bd6da6ca396..33bdc952096 100644 --- a/libstdc++-v3/include/profile/array +++ b/libstdc++-v3/include/profile/array @@ -127,7 +127,7 @@ namespace __profile // Element access. reference - operator[](size_type __n) + operator[](size_type __n) noexcept { return _AT_Type::_S_ref(_M_elems, __n); } constexpr const_reference @@ -153,19 +153,19 @@ namespace __profile } reference - front() + front() noexcept { return *begin(); } constexpr const_reference - front() const + front() const noexcept { return _AT_Type::_S_ref(_M_elems, 0); } reference - back() + back() noexcept { return _Nm ? *(end() - 1) : *end(); } constexpr const_reference - back() const + back() const noexcept { return _Nm ? _AT_Type::_S_ref(_M_elems, _Nm - 1) : _AT_Type::_S_ref(_M_elems, 0); diff --git a/libstdc++-v3/include/profile/list b/libstdc++-v3/include/profile/list index 778edf1e428..6168c61ed18 100644 --- a/libstdc++-v3/include/profile/list +++ b/libstdc++-v3/include/profile/list @@ -440,7 +440,7 @@ template > // 23.2.2.4 list operations: void #if __cplusplus >= 201103L - splice(const_iterator __position, list&& __x) + splice(const_iterator __position, list&& __x) noexcept #else splice(iterator __position, list& __x) #endif @@ -448,7 +448,7 @@ template > #if __cplusplus >= 201103L void - splice(const_iterator __position, list& __x) + splice(const_iterator __position, list& __x) noexcept { this->splice(__position, std::move(__x)); } void @@ -458,7 +458,7 @@ template > void #if __cplusplus >= 201103L - splice(const_iterator __position, list&& __x, const_iterator __i) + splice(const_iterator __position, list&& __x, const_iterator __i) noexcept #else splice(iterator __position, list& __x, iterator __i) #endif @@ -474,7 +474,7 @@ template > void #if __cplusplus >= 201103L splice(const_iterator __position, list&& __x, const_iterator __first, - const_iterator __last) + const_iterator __last) noexcept #else splice(iterator __position, list& __x, iterator __first, iterator __last) @@ -490,7 +490,7 @@ template > #if __cplusplus >= 201103L void splice(const_iterator __position, list& __x, - const_iterator __first, const_iterator __last) + const_iterator __first, const_iterator __last) noexcept { this->splice(__position, std::move(__x), __first, __last); } #endif diff --git a/libstdc++-v3/include/std/array b/libstdc++-v3/include/std/array index 0d2a71c8cbc..86e8aee14ba 100644 --- a/libstdc++-v3/include/std/array +++ b/libstdc++-v3/include/std/array @@ -169,7 +169,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER // Element access. reference - operator[](size_type __n) + operator[](size_type __n) noexcept { return _AT_Type::_S_ref(_M_elems, __n); } constexpr const_reference @@ -195,19 +195,19 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER } reference - front() + front() noexcept { return *begin(); } constexpr const_reference - front() const + front() const noexcept { return _AT_Type::_S_ref(_M_elems, 0); } reference - back() + back() noexcept { return _Nm ? *(end() - 1) : *end(); } constexpr const_reference - back() const + back() const noexcept { return _Nm ? _AT_Type::_S_ref(_M_elems, _Nm - 1) : _AT_Type::_S_ref(_M_elems, 0); diff --git a/libstdc++-v3/testsuite/23_containers/list/operations/5.cc b/libstdc++-v3/testsuite/23_containers/list/operations/5.cc deleted file mode 100644 index fbb55b3ea3c..00000000000 --- a/libstdc++-v3/testsuite/23_containers/list/operations/5.cc +++ /dev/null @@ -1,31 +0,0 @@ -// 2006-01-19 Paolo Carlini - -// Copyright (C) 2006-2013 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 "5.h" -#include - -int main() -{ - typedef int value_type; - typedef __gnu_test::uneq_allocator allocator_type; - typedef std::list list_type; - - operations05(); - return 0; -} diff --git a/libstdc++-v3/testsuite/23_containers/list/operations/5.h b/libstdc++-v3/testsuite/23_containers/list/operations/5.h deleted file mode 100644 index 755ddd9eb1d..00000000000 --- a/libstdc++-v3/testsuite/23_containers/list/operations/5.h +++ /dev/null @@ -1,134 +0,0 @@ -// 2006-01-19 Paolo Carlini - -// Copyright (C) 2006-2013 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 -// . - -// 23.2.2.4 list operations [lib.list.ops] - -#include -#include -#include - -// Check the splice (and merge) bits of N1599. -template -void -operations05() -{ - bool test __attribute__((unused)) = true; - - typedef _Tp list_type; - typedef typename list_type::allocator_type allocator_type; - - const int data1[] = {1, 2, 3, 4, 5}; - const int data2[] = {6, 7, 8, 9, 10}; - const size_t N1 = sizeof(data1) / sizeof(int); - const size_t N2 = sizeof(data2) / sizeof(int); - - allocator_type alloc01(1), alloc02(2); - - list_type l01(data1, data1 + N1, alloc01); - const list_type l01_ref = l01; - - list_type l02(data2, data2 + N2, alloc02); - const list_type l02_ref = l02; - - bool catched = false; - - try - { - l01.splice(l01.begin(), l02); - } - catch(std::runtime_error&) - { - catched = true; - } - catch(...) - { - VERIFY( false ); - } - VERIFY( catched ); - VERIFY( l01 == l01_ref ); - VERIFY( l02 == l02_ref ); - - catched = false; - try - { - l01.splice(l01.begin(), l02, l02.begin()); - } - catch(std::runtime_error&) - { - catched = true; - } - catch(...) - { - VERIFY( false ); - } - VERIFY( catched ); - VERIFY( l01 == l01_ref ); - VERIFY( l02 == l02_ref ); - - catched = false; - try - { - l01.splice(l01.begin(), l02, l02.begin(), l02.end()); - } - catch(std::runtime_error&) - { - catched = true; - } - catch(...) - { - VERIFY( false ); - } - VERIFY( catched ); - VERIFY( l01 == l01_ref ); - VERIFY( l02 == l02_ref ); - - catched = false; - try - { - l01.merge(l02); - } - catch(std::runtime_error&) - { - catched = true; - } - catch(...) - { - VERIFY( false ); - } - VERIFY( catched ); - VERIFY( l01 == l01_ref ); - VERIFY( l02 == l02_ref ); - - catched = false; - try - { - l01.merge(l02, std::less()); - } - catch(std::runtime_error&) - { - catched = true; - } - catch(...) - { - VERIFY( false ); - } - VERIFY( catched ); - VERIFY( l01 == l01_ref ); - VERIFY( l02 == l02_ref ); -}