diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index b92fdf14cac..74a781e53c8 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,19 @@ +2018-10-11 François Dumont + + * include/bits/forward_list.h + (_Fwd_list_iterator<>::operator==): Replace member function with inline + friend. + (_Fwd_list_iterator<>::operator!=): Likewise. + (_Fwd_list_const_iterator<>::operator==): Likewise. + (_Fwd_list_const_iterator<>::operator!=): Likewise. + (operator==(const _Fwd_list_iterator<>&, + const _Fwd_list_const_iterator<>&)): Remove. + (operator!=(const _Fwd_list_iterator<>&, + const _Fwd_list_const_iterator<>&)): Remove. + (forward_list<>::_Node): Take typedef from base type. + (forward_list<>::iterator): Likewise. + (forward_list<>::const_iterator): Likewise. + 2018-10-11 Jonathan Wakely PR libstdc++/80538 diff --git a/libstdc++-v3/include/bits/forward_list.h b/libstdc++-v3/include/bits/forward_list.h index 84a4ad4d5dc..ebec3b5c818 100644 --- a/libstdc++-v3/include/bits/forward_list.h +++ b/libstdc++-v3/include/bits/forward_list.h @@ -173,13 +173,20 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER return __tmp; } - bool - operator==(const _Self& __x) const noexcept - { return _M_node == __x._M_node; } + /** + * @brief Forward list iterator equality comparison. + */ + friend bool + operator==(const _Self& __x, const _Self& __y) noexcept + { return __x._M_node == __y._M_node; } - bool - operator!=(const _Self& __x) const noexcept - { return _M_node != __x._M_node; } + + /** + * @brief Forward list iterator inequality comparison. + */ + friend bool + operator!=(const _Self& __x, const _Self& __y) noexcept + { return __x._M_node != __y._M_node; } _Self _M_next() const noexcept @@ -244,13 +251,19 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER return __tmp; } - bool - operator==(const _Self& __x) const noexcept - { return _M_node == __x._M_node; } + /** + * @brief Forward list const_iterator equality comparison. + */ + friend bool + operator==(const _Self& __x, const _Self& __y) noexcept + { return __x._M_node == __y._M_node; } - bool - operator!=(const _Self& __x) const noexcept - { return _M_node != __x._M_node; } + /** + * @brief Forward list const_iterator inequality comparison. + */ + friend bool + operator!=(const _Self& __x, const _Self& __y) noexcept + { return __x._M_node != __y._M_node; } _Self _M_next() const noexcept @@ -264,24 +277,6 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER const _Fwd_list_node_base* _M_node; }; - /** - * @brief Forward list iterator equality comparison. - */ - template - inline bool - operator==(const _Fwd_list_iterator<_Tp>& __x, - const _Fwd_list_const_iterator<_Tp>& __y) noexcept - { return __x._M_node == __y._M_node; } - - /** - * @brief Forward list iterator inequality comparison. - */ - template - inline bool - operator!=(const _Fwd_list_iterator<_Tp>& __x, - const _Fwd_list_const_iterator<_Tp>& __y) noexcept - { return __x._M_node != __y._M_node; } - /** * @brief Base class for %forward_list. */ @@ -433,8 +428,8 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER private: typedef _Fwd_list_base<_Tp, _Alloc> _Base; - typedef _Fwd_list_node<_Tp> _Node; typedef _Fwd_list_node_base _Node_base; + typedef typename _Base::_Node _Node; typedef typename _Base::_Node_alloc_type _Node_alloc_type; typedef typename _Base::_Node_alloc_traits _Node_alloc_traits; typedef allocator_traits<__alloc_rebind<_Alloc, _Tp>> _Alloc_traits; @@ -447,8 +442,8 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER typedef value_type& reference; typedef const value_type& const_reference; - typedef _Fwd_list_iterator<_Tp> iterator; - typedef _Fwd_list_const_iterator<_Tp> const_iterator; + typedef typename _Base::iterator iterator; + typedef typename _Base::const_iterator const_iterator; typedef std::size_t size_type; typedef std::ptrdiff_t difference_type; typedef _Alloc allocator_type;