Patchwork fix libstdc++/52433

login
register
mail settings
Submitter Jonathan Wakely
Date March 8, 2012, 1:06 a.m.
Message ID <CAH6eHdTnm4w9BEF4krJF7fb3XtDeUg=66p_JWYhPn0OhTL0_Hw@mail.gmail.com>
Download mbox | patch
Permalink /patch/145419/
State New
Headers show

Comments

Jonathan Wakely - March 8, 2012, 1:06 a.m.
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.
Paolo Carlini - March 8, 2012, 10:22 a.m.
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.
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.

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