diff mbox

fix libstdc++/52433

Message ID CAH6eHdTnm4w9BEF4krJF7fb3XtDeUg=66p_JWYhPn0OhTL0_Hw@mail.gmail.com
State New
Headers show

Commit Message

Jonathan Wakely March 8, 2012, 1:06 a.m. UTC
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 <jwakely.gcc@gmail.com>
Date:   Wed Mar 7 01:24:45 2012 +0000

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

Comments

Paolo Carlini March 8, 2012, 10:22 a.m. UTC | #1
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.
Jonathan Wakely March 8, 2012, 11:38 a.m. UTC | #2
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 mbox

Patch

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