Re: fix libstdc++/52433

2012-03-08 Thread Jonathan Wakely
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.


Re: fix libstdc++/52433

2012-03-08 Thread Paolo Carlini

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.


Re: fix libstdc++/52433

2012-03-07 Thread Jonathan Wakely
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.

Tested x86_64-linux, committed to trunk.
commit 9ada43f026087d440ed6e70d007b51c497d4b790
Author: Jonathan Wakely 
Date:   Wed Mar 7 01:24:45 2012 +

PR libstdc++/52433
* include/debug/safe_iterator.h (_Safe_iterator): Add debug checks
to move constructor and move assignment operator.

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();