re PR libstdc++/20577 (iter_swap doesn't work anymore with vector<bool>)
authorChris Jefferson <chris@bubblescope.net>
Mon, 21 Mar 2005 22:16:15 +0000 (22:16 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Mon, 21 Mar 2005 22:16:15 +0000 (22:16 +0000)
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.

From-SVN: r96837

libstdc++-v3/ChangeLog
libstdc++-v3/include/bits/stl_algobase.h
libstdc++-v3/testsuite/25_algorithms/iter_swap/20577.cc [new file with mode: 0644]

index fa5b683f145c314c925d3d8a65c32cec7dc3429e..fe273acaff1b678919c975baf02ca3831c1c7e96 100644 (file)
@@ -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.
index a67d2a9a320ec4e82832207b9479af3c367994b0..426fcba029844fae58354f46a0245c57a052f9fd 100644 (file)
@@ -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 (file)
index 0000000..3b4c825
--- /dev/null
@@ -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;
+}