re PR libstdc++/52433 ([C++11] debug mode iterators need to move)

PR libstdc++/52433
	* include/debug/safe_iterator.h (_Safe_iterator): Add move
	constructor and move assignment operator.
	* testsuite/23_containers/vector/debug/52433.cc: New.

From-SVN: r185717
This commit is contained in:
Jonathan Wakely 2012-03-23 00:02:47 +00:00 committed by Jonathan Wakely
parent cf42709fba
commit 2dbb7ac4eb
3 changed files with 93 additions and 2 deletions

View File

@ -1,3 +1,10 @@
2012-03-22 Jonathan Wakely <jwakely.gcc@gmail.com>
PR libstdc++/52433
* include/debug/safe_iterator.h (_Safe_iterator): Add move
constructor and move assignment operator.
* testsuite/23_containers/vector/debug/52433.cc: New.
2012-03-22 Paolo Carlini <paolo.carlini@oracle.com>
* include/std/array (array<>::at(size_type) const): Fix version

View File

@ -1,6 +1,6 @@
// Safe iterator implementation -*- C++ -*-
// Copyright (C) 2003, 2004, 2005, 2006, 2009, 2010, 2011
// Copyright (C) 2003, 2004, 2005, 2006, 2009, 2010, 2011, 2012
// Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
@ -169,6 +169,24 @@ namespace __gnu_debug
._M_iterator(__x, "other"));
}
#ifdef __GXX_EXPERIMENTAL_CXX0X__
/**
* @brief Move construction.
* @post __x is singular and unattached
*/
_Safe_iterator(_Safe_iterator&& __x) : _M_current()
{
_GLIBCXX_DEBUG_VERIFY(!__x._M_singular()
|| __x._M_current == _Iterator(),
_M_message(__msg_init_copy_singular)
._M_iterator(*this, "this")
._M_iterator(__x, "other"));
std::swap(_M_current, __x._M_current);
this->_M_attach(__x._M_sequence);
__x._M_detach();
}
#endif
/**
* @brief Converting constructor from a mutable iterator to a
* constant iterator.
@ -208,6 +226,27 @@ namespace __gnu_debug
return *this;
}
#ifdef __GXX_EXPERIMENTAL_CXX0X__
/**
* @brief Move assignment.
* @post __x is singular and unattached
*/
_Safe_iterator&
operator=(_Safe_iterator&& __x)
{
_GLIBCXX_DEBUG_VERIFY(!__x._M_singular()
|| __x._M_current == _Iterator(),
_M_message(__msg_copy_singular)
._M_iterator(*this, "this")
._M_iterator(__x, "other"));
_M_current = __x._M_current;
_M_attach(__x._M_sequence);
__x._M_detach();
__x._M_current = _Iterator();
return *this;
}
#endif
/**
* @brief Iterator dereference.
* @pre iterator is dereferenceable
@ -422,7 +461,9 @@ namespace __gnu_debug
/// Is this iterator equal to the sequence's before_begin() iterator if
/// any?
bool _M_is_before_begin() const
{ return _BeforeBeginHelper<_Sequence>::_M_Is(base(), _M_get_sequence()); }
{
return _BeforeBeginHelper<_Sequence>::_M_Is(base(), _M_get_sequence());
}
};
template<typename _IteratorL, typename _IteratorR, typename _Sequence>

View File

@ -0,0 +1,43 @@
// 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
// <http://www.gnu.org/licenses/>.
//
// { dg-require-debug-mode "" }
// { dg-options "-std=gnu++0x" }
// { dg-do compile }
// PR libstdc++/52433
#include <vector>
struct X
{
std::vector<int>::iterator i;
X() = default;
X(const X&) = default;
X(X&&) = default;
X& operator=(const X&) = default;
X& operator=(X&&) = default;
};
X test01()
{
X x;
x = X();
return x;
}