diff -urN libstdc++-v3-orig/include/bits/stl_deque.h libstdc++-v3/include/bits/stl_deque.h --- libstdc++-v3-orig/include/bits/stl_deque.h 2002-06-13 00:07:51.000000000 +0200 +++ libstdc++-v3/include/bits/stl_deque.h 2002-07-05 23:41:40.000000000 +0200 @@ -132,11 +132,6 @@ reference operator*() const { return *_M_cur; } pointer operator->() const { return _M_cur; } - difference_type operator-(const _Self& __x) const { - return difference_type(_S_buffer_size()) * (_M_node - __x._M_node - 1) + - (_M_cur - _M_first) + (__x._M_last - __x._M_cur); - } - _Self& operator++() { ++_M_cur; if (_M_cur == _M_last) { @@ -318,6 +313,22 @@ return !(__x < __y); } +// _GLIBCPP_RESOLVE_LIB_DEFECTS +// According to the resolution of DR179 not only the various comparison +// operators but also operator- must accept mixed iterator/const_iterator +// parameters. +template +inline typename _Deque_iterator<_Tp, _RefL, _PtrL>::difference_type +operator-(const _Deque_iterator<_Tp, _RefL, _PtrL>& __x, + const _Deque_iterator<_Tp, _RefR, _PtrR>& __y) +{ + return _Deque_iterator<_Tp, _RefL, _PtrL>::difference_type + (_Deque_iterator<_Tp, _RefL, _PtrL>::_S_buffer_size()) * + (__x._M_node - __y._M_node - 1) + (__x._M_cur - __x._M_first) + + (__y._M_last - __y._M_cur); +} + template inline _Deque_iterator<_Tp, _Ref, _Ptr> operator+(ptrdiff_t __n, const _Deque_iterator<_Tp, _Ref, _Ptr>& __x) diff -urN libstdc++-v3-orig/testsuite/23_containers/deque_operators.cc libstdc++-v3/testsuite/23_containers/deque_operators.cc --- libstdc++-v3-orig/testsuite/23_containers/deque_operators.cc 2002-05-19 11:16:21.000000000 +0200 +++ libstdc++-v3/testsuite/23_containers/deque_operators.cc 2002-07-06 00:11:50.000000000 +0200 @@ -56,8 +56,30 @@ VERIFY( constend <= end ); } +// libstdc++/7186 +void test02() +{ + bool test = true; + + std::deque d(2); + typedef std::deque::iterator iter; + typedef std::deque::const_iterator constiter; + + iter beg = d.begin(); + iter end = d.end(); + constiter constbeg = d.begin(); + constiter constend = d.end(); + + VERIFY( !(beg - constbeg) ); + VERIFY( !(constend - end) ); + + VERIFY( end - constbeg ); + VERIFY( constend - beg ); +} + int main() { test01(); + test02(); return 0; }