Message ID | CAH6eHdTnm4w9BEF4krJF7fb3XtDeUg=66p_JWYhPn0OhTL0_Hw@mail.gmail.com |
---|---|
State | New |
Headers | show |
On 03/08/2012 02:06 AM, Jonathan Wakely wrote: > On 4 March 2012 12:56, Jonathan Wakely wrote: >> 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. >> >> Tested 'make check check-debug' on x86_64 and committed to trunk. I >> plan to fix this for 4.7.1 and 4.6.4 as well > This restores the debug mode checks when moving singular iterators. Thanks for the good work on this. By the way, this morning it occurred to me that we should probably also have debug-mode checks for self move-assignment (not just in _Safe_iterator)?!? Or I'm missing something? Thanks, Paolo.
On 8 March 2012 10:22, Paolo Carlini wrote: > > By the way, this morning it occurred to me that we should probably also have > debug-mode checks for self move-assignment (not just in _Safe_iterator)?!? Yes, nice idea, the library is allowed to assume it doesn't happen, but we can and should check it in debug mode.
diff --git a/libstdc++-v3/include/debug/safe_iterator.h b/libstdc++-v3/include/debug/safe_iterator.h index 65dff55..6bb3cd2 100644 --- a/libstdc++-v3/include/debug/safe_iterator.h +++ b/libstdc++-v3/include/debug/safe_iterator.h @@ -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 @@ -176,6 +176,11 @@ namespace __gnu_debug */ _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(); @@ -229,6 +234,11 @@ namespace __gnu_debug _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();