diff options
-rw-r--r-- | libstdc++-v3/ChangeLog | 8 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/stl_algobase.h | 9 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/25_algorithms/iter_swap/20577.cc | 71 |
3 files changed, 87 insertions, 1 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index fa5b683..fe273ac 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,11 @@ +2005-03-21 Chris Jefferson <chris@bubblescope.net> + + PR libstdc++/20577 + * include/bits/stl_algobase.h (iter_swap): Only delegate iter_swap + to swap when the iterator's reference_type is a reference to its + value_type. + * testsuite/25_algorithms/iter_swap/20577.cc: New. + 2005-03-21 Zack Weinberg <zack@codesourcery.com> * acinclude.m4 (GLIBCXX_CONFIGURE): Delete gcc_version logic. diff --git a/libstdc++-v3/include/bits/stl_algobase.h b/libstdc++-v3/include/bits/stl_algobase.h index a67d2a9..426fcba 100644 --- a/libstdc++-v3/include/bits/stl_algobase.h +++ b/libstdc++-v3/include/bits/stl_algobase.h @@ -155,7 +155,14 @@ namespace std _ValueType2>) __glibcxx_function_requires(_ConvertibleConcept<_ValueType2, _ValueType1>) - std::__iter_swap<__are_same<_ValueType1, _ValueType2>::__value>:: + + typedef typename iterator_traits<_ForwardIterator1>::reference + _ReferenceType1; + typedef typename iterator_traits<_ForwardIterator2>::reference + _ReferenceType2; + std::__iter_swap<__are_same<_ValueType1, _ValueType2>::__value && + __are_same<_ValueType1 &, _ReferenceType1>::__value && + __are_same<_ValueType2 &, _ReferenceType2>::__value>:: iter_swap(__a, __b); } diff --git a/libstdc++-v3/testsuite/25_algorithms/iter_swap/20577.cc b/libstdc++-v3/testsuite/25_algorithms/iter_swap/20577.cc new file mode 100644 index 0000000..3b4c825 --- /dev/null +++ b/libstdc++-v3/testsuite/25_algorithms/iter_swap/20577.cc @@ -0,0 +1,71 @@ +// 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, 59 Temple Place - Suite 330, Boston, MA 02111-1307, +// USA. + +#include <algorithm> +#include <vector> +#include <testsuite_hooks.h> + +void +test1() +{ + bool test __attribute__((unused)) = true; + + std::vector<bool> v; + v.push_back(true); + v.push_back(false); + std::iter_swap(v.begin(), v.begin() + 1); + VERIFY( v[0] == false && v[1] == true ); +} + +void +test2() +{ + bool test __attribute__((unused)) = true; + + std::vector<int> v; + v.push_back(1); + v.push_back(2); + std::iter_swap(v.begin(), v.begin() + 1); + VERIFY( v[0] == 2 && v[1] == 1 ); +} + +int int_swap_count; + +struct X {}; +void swap(X& i, X& j) +{ ++int_swap_count; } + +void +test3() +{ + bool test __attribute__((unused)) = true; + + int_swap_count = 0; + X i, j; + std::iter_swap(&i, &j); + VERIFY( int_swap_count == 1 ); +} + +// libstdc++/20577 +int main() +{ + test1(); + test2(); + test3(); + return 0; +} |