From 3af22b23b32d69bd7cc0d444429f33e4edae008d Mon Sep 17 00:00:00 2001 From: Paolo Carlini Date: Tue, 6 Dec 2005 17:19:30 +0000 Subject: [PATCH] basic_string.h (insert(iterator, _CharT), [...]): Avoid troubles with ADL, user defined operators and __normal_iterator. 2005-12-06 Paolo Carlini * include/bits/basic_string.h (insert(iterator, _CharT), erase(iterator), erase(iterator, iterator)): Avoid troubles with ADL, user defined operators and __normal_iterator. * include/bits/stl_iterator.h (operator-(const __normal_iterator <_Iterator, _Container>&, const __normal_iterator<_Iterator, _Container>&)): Add overload for left and right iterators of the same type. * include/debug/safe_iterator.h (operator-(const _Safe_iterator <_Iterator, _Sequence>&, const _Safe_iterator<_Iterator, _Sequence>&)): Likewise. * testsuite/21_strings/basic_string/types/1.cc: New. From-SVN: r108123 --- libstdc++-v3/ChangeLog | 14 ++++++ libstdc++-v3/include/bits/basic_string.h | 6 +-- libstdc++-v3/include/bits/stl_iterator.h | 6 +++ libstdc++-v3/include/debug/safe_iterator.h | 16 +++++++ .../21_strings/basic_string/types/1.cc | 48 +++++++++++++++++++ 5 files changed, 87 insertions(+), 3 deletions(-) create mode 100644 libstdc++-v3/testsuite/21_strings/basic_string/types/1.cc diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 12520c1bf8f..223bdd88dea 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,17 @@ +2005-12-06 Paolo Carlini + + * include/bits/basic_string.h (insert(iterator, _CharT), + erase(iterator), erase(iterator, iterator)): Avoid troubles + with ADL, user defined operators and __normal_iterator. + * include/bits/stl_iterator.h (operator-(const __normal_iterator + <_Iterator, _Container>&, const __normal_iterator<_Iterator, + _Container>&)): Add overload for left and right iterators of + the same type. + * include/debug/safe_iterator.h (operator-(const _Safe_iterator + <_Iterator, _Sequence>&, const _Safe_iterator<_Iterator, + _Sequence>&)): Likewise. + * testsuite/21_strings/basic_string/types/1.cc: New. + 2005-12-05 Paolo Carlini * include/ext/sso_string_base.h (__sso_string_base<>::_M_assign): diff --git a/libstdc++-v3/include/bits/basic_string.h b/libstdc++-v3/include/bits/basic_string.h index 8623c8db7fe..0ff2e54e8d3 100644 --- a/libstdc++-v3/include/bits/basic_string.h +++ b/libstdc++-v3/include/bits/basic_string.h @@ -1097,7 +1097,7 @@ namespace std const size_type __pos = __p - _M_ibegin(); _M_replace_aux(__pos, size_type(0), size_type(1), __c); _M_rep()->_M_set_leaked(); - return this->_M_ibegin() + __pos; + return iterator(_M_data() + __pos); } /** @@ -1138,7 +1138,7 @@ namespace std const size_type __pos = __position - _M_ibegin(); _M_mutate(__pos, size_type(1), size_type(0)); _M_rep()->_M_set_leaked(); - return _M_ibegin() + __pos; + return iterator(_M_data() + __pos); } /** @@ -1158,7 +1158,7 @@ namespace std const size_type __pos = __first - _M_ibegin(); _M_mutate(__pos, __last - __first, size_type(0)); _M_rep()->_M_set_leaked(); - return _M_ibegin() + __pos; + return iterator(_M_data() + __pos); } /** diff --git a/libstdc++-v3/include/bits/stl_iterator.h b/libstdc++-v3/include/bits/stl_iterator.h index 4c4630a0689..12b2e9c6f9a 100644 --- a/libstdc++-v3/include/bits/stl_iterator.h +++ b/libstdc++-v3/include/bits/stl_iterator.h @@ -808,6 +808,12 @@ namespace __gnu_cxx const __normal_iterator<_IteratorR, _Container>& __rhs) { return __lhs.base() - __rhs.base(); } + template + inline typename __normal_iterator<_Iterator, _Container>::difference_type + operator-(const __normal_iterator<_Iterator, _Container>& __lhs, + const __normal_iterator<_Iterator, _Container>& __rhs) + { return __lhs.base() - __rhs.base(); } + template inline __normal_iterator<_Iterator, _Container> operator+(typename __normal_iterator<_Iterator, _Container>::difference_type diff --git a/libstdc++-v3/include/debug/safe_iterator.h b/libstdc++-v3/include/debug/safe_iterator.h index 0ff967eea54..c497c113c88 100644 --- a/libstdc++-v3/include/debug/safe_iterator.h +++ b/libstdc++-v3/include/debug/safe_iterator.h @@ -607,6 +607,22 @@ namespace __gnu_debug return __lhs.base() - __rhs.base(); } + template + inline typename _Safe_iterator<_Iterator, _Sequence>::difference_type + operator-(const _Safe_iterator<_Iterator, _Sequence>& __lhs, + const _Safe_iterator<_Iterator, _Sequence>& __rhs) + { + _GLIBCXX_DEBUG_VERIFY(! __lhs._M_singular() && ! __rhs._M_singular(), + _M_message(__msg_distance_bad) + ._M_iterator(__lhs, "lhs") + ._M_iterator(__rhs, "rhs")); + _GLIBCXX_DEBUG_VERIFY(__lhs._M_can_compare(__rhs), + _M_message(__msg_distance_different) + ._M_iterator(__lhs, "lhs") + ._M_iterator(__rhs, "rhs")); + return __lhs.base() - __rhs.base(); + } + template inline _Safe_iterator<_Iterator, _Sequence> operator+(typename _Safe_iterator<_Iterator,_Sequence>::difference_type __n, diff --git a/libstdc++-v3/testsuite/21_strings/basic_string/types/1.cc b/libstdc++-v3/testsuite/21_strings/basic_string/types/1.cc new file mode 100644 index 00000000000..a316cf5b4c7 --- /dev/null +++ b/libstdc++-v3/testsuite/21_strings/basic_string/types/1.cc @@ -0,0 +1,48 @@ +// 2005-12-01 Paolo Carlini + +// Copyright (C) 2005 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 2, 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 COPYING. If not, write to the Free +// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, +// USA. + +// { dg-do compile } + +#include + +namespace N +{ + struct X { }; + + template + X operator+(T, std::size_t) + { return X(); } + + template + X operator-(T, T) + { return X(); } +} + +int main() +{ + std::basic_string s(5, N::X()); + + s.erase(s.begin()); + s.erase(s.begin(), s.end()); + s.insert(s.begin(), N::X()); + s.replace(s.begin(), s.end(), s.begin(), s.end()); + + return 0; +}