diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 38f7bd92c0f..bd704eaa564 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,10 @@ +2012-05-29 François Dumont + + * include/bits/stl_tempbuf.h (__uninitialized_construct_buf) + (__uninitialized_construct_buf_dispatch<>::__ucr): Fix to work + with iterator returning rvalue. + * testsuite/25_algorithms/stable_sort/3.cc: New. + 2012-05-28 Paolo Carlini PR c++/53503 diff --git a/libstdc++-v3/include/bits/stl_tempbuf.h b/libstdc++-v3/include/bits/stl_tempbuf.h index b165273a3ab..03d977f0374 100644 --- a/libstdc++-v3/include/bits/stl_tempbuf.h +++ b/libstdc++-v3/include/bits/stl_tempbuf.h @@ -1,7 +1,7 @@ // Temporary buffer implementation -*- C++ -*- // Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, -// 2010, 2011 +// 2010, 2011, 2012 // Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free @@ -182,25 +182,25 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION template struct __uninitialized_construct_buf_dispatch { - template + template static void - __ucr(_ForwardIterator __first, _ForwardIterator __last, - _Tp& __value) + __ucr(_Pointer __first, _Pointer __last, + _ForwardIterator __seed) { if(__first == __last) return; - _ForwardIterator __cur = __first; + _Pointer __cur = __first; __try { std::_Construct(std::__addressof(*__first), - _GLIBCXX_MOVE(__value)); - _ForwardIterator __prev = __cur; + _GLIBCXX_MOVE(*__seed)); + _Pointer __prev = __cur; ++__cur; for(; __cur != __last; ++__cur, ++__prev) std::_Construct(std::__addressof(*__cur), _GLIBCXX_MOVE(*__prev)); - __value = _GLIBCXX_MOVE(*__prev); + *__seed = _GLIBCXX_MOVE(*__prev); } __catch(...) { @@ -213,9 +213,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION template<> struct __uninitialized_construct_buf_dispatch { - template + template static void - __ucr(_ForwardIterator, _ForwardIterator, _Tp&) { } + __ucr(_Pointer, _Pointer, _ForwardIterator) { } }; // Constructs objects in the range [first, last). @@ -223,23 +223,22 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION // their exact value is not defined. In particular they may // be 'moved from'. // - // While __value may altered during this algorithm, it will have + // While *__seed may be altered during this algorithm, it will have // the same value when the algorithm finishes, unless one of the // constructions throws. // - // Requirements: _ForwardIterator::value_type(_Tp&&) is valid. - template + // Requirements: _Pointer::value_type(_Tp&&) is valid. + template inline void - __uninitialized_construct_buf(_ForwardIterator __first, - _ForwardIterator __last, - _Tp& __value) + __uninitialized_construct_buf(_Pointer __first, _Pointer __last, + _ForwardIterator __seed) { - typedef typename std::iterator_traits<_ForwardIterator>::value_type + typedef typename std::iterator_traits<_Pointer>::value_type _ValueType; std::__uninitialized_construct_buf_dispatch< __has_trivial_constructor(_ValueType)>:: - __ucr(__first, __last, __value); + __ucr(__first, __last, __seed); } template @@ -254,9 +253,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION value_type>(_M_original_len)); _M_buffer = __p.first; _M_len = __p.second; - if(_M_buffer) + if (_M_buffer) std::__uninitialized_construct_buf(_M_buffer, _M_buffer + _M_len, - *__first); + __first); } __catch(...) { diff --git a/libstdc++-v3/testsuite/25_algorithms/stable_sort/3.cc b/libstdc++-v3/testsuite/25_algorithms/stable_sort/3.cc new file mode 100644 index 00000000000..31834d94e95 --- /dev/null +++ b/libstdc++-v3/testsuite/25_algorithms/stable_sort/3.cc @@ -0,0 +1,42 @@ +// Copyright (C) 2012 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 +// . + +// 25.3.1.2 [lib.stable.sort] + +#include +#include +#include + +void +test1() +{ + bool test __attribute__((unused)) = true; + + std::vector bools; + bools.push_back(true); + bools.push_back(false); + bools.push_back(true); + bools.push_back(false); + std::stable_sort(bools.begin(), bools.end()); + VERIFY( !bools[0] && !bools[1] && bools[2] && bools[3] ); +} + +int +main() +{ + test1(); +}