aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaolo Carlini <paolo.carlini@oracle.com>2013-04-22 10:07:31 +0000
committerPaolo Carlini <paolo@gcc.gnu.org>2013-04-22 10:07:31 +0000
commit177d2b74b56c0f67c2746a270d86ceb58f7fbeca (patch)
tree56c621d19a5b1683f900e07cd86a5afff6d379f9
parent0fad3dbc216bcd61397a8e73c52fbc8861dc8b43 (diff)
downloadgcc-177d2b74b56c0f67c2746a270d86ceb58f7fbeca.zip
gcc-177d2b74b56c0f67c2746a270d86ceb58f7fbeca.tar.gz
gcc-177d2b74b56c0f67c2746a270d86ceb58f7fbeca.tar.bz2
re PR libstdc++/57010 ([c++0x] priority_queue<>::pop() calls self-move-assignment operator)
2013-04-22 Paolo Carlini <paolo.carlini@oracle.com> PR libstdc++/57010 * include/bits/stl_heap.h (pop_heap): Avoid self move-assignment. * testsuite/25_algorithms/pop_heap/57010.cc: New. From-SVN: r198125
-rw-r--r--libstdc++-v3/ChangeLog6
-rw-r--r--libstdc++-v3/include/bits/stl_heap.h14
-rw-r--r--libstdc++-v3/testsuite/25_algorithms/pop_heap/57010.cc55
3 files changed, 71 insertions, 4 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index ff36bc8..fdf739f 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,9 @@
+2013-04-22 Paolo Carlini <paolo.carlini@oracle.com>
+
+ PR libstdc++/57010
+ * include/bits/stl_heap.h (pop_heap): Avoid self move-assignment.
+ * testsuite/25_algorithms/pop_heap/57010.cc: New.
+
2013-04-21 Evgeniy Stepanov <eugenis@google.com>
* src/c++11/system_error.cc (generic_category_instance): Add
diff --git a/libstdc++-v3/include/bits/stl_heap.h b/libstdc++-v3/include/bits/stl_heap.h
index de09780..807a8cf 100644
--- a/libstdc++-v3/include/bits/stl_heap.h
+++ b/libstdc++-v3/include/bits/stl_heap.h
@@ -291,8 +291,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
__glibcxx_requires_valid_range(__first, __last);
__glibcxx_requires_heap(__first, __last);
- --__last;
- std::__pop_heap(__first, __last, __last);
+ if (__last - __first > 1)
+ {
+ --__last;
+ std::__pop_heap(__first, __last, __last);
+ }
}
template<typename _RandomAccessIterator, typename _Distance,
@@ -363,8 +366,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
__glibcxx_requires_non_empty_range(__first, __last);
__glibcxx_requires_heap_pred(__first, __last, __comp);
- --__last;
- std::__pop_heap(__first, __last, __last, __comp);
+ if (__last - __first > 1)
+ {
+ --__last;
+ std::__pop_heap(__first, __last, __last, __comp);
+ }
}
/**
diff --git a/libstdc++-v3/testsuite/25_algorithms/pop_heap/57010.cc b/libstdc++-v3/testsuite/25_algorithms/pop_heap/57010.cc
new file mode 100644
index 0000000..87eae48
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/pop_heap/57010.cc
@@ -0,0 +1,55 @@
+// Copyright (C) 2013 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 3, 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 COPYING3. If not see
+// <http://www.gnu.org/licenses/>.
+
+// { dg-options "-std=gnu++11" }
+
+#include <algorithm>
+#include <functional>
+#include <testsuite_hooks.h>
+#include <testsuite_iterators.h>
+#include <testsuite_rvalref.h>
+
+using __gnu_test::test_container;
+using __gnu_test::random_access_iterator_wrapper;
+using __gnu_test::rvalstruct;
+
+typedef test_container<rvalstruct, random_access_iterator_wrapper> container;
+
+void test01()
+{
+ {
+ rvalstruct makeheap[1];
+ container makecon(makeheap, makeheap + 1);
+
+ std::push_heap(makecon.begin(), makecon.end());
+ std::pop_heap(makecon.begin(), makecon.end());
+ }
+
+ {
+ rvalstruct makeheap[1];
+ container makecon(makeheap, makeheap + 1);
+
+ std::push_heap(makecon.begin(), makecon.end(), std::less<rvalstruct>());
+ std::pop_heap(makecon.begin(), makecon.end(), std::less<rvalstruct>());
+ }
+}
+
+int main()
+{
+ test01();
+ return 0;
+}