re PR libstdc++/15523 ([DR 408] Can't have vectors of vector::const_iterator)

2009-08-04  Paolo Carlini  <paolo.carlini@oracle.com>

	PR libstdc++/15523
	* include/debug/safe_iterator.h (_Safe_iterator<>::
	_Safe_iterator(const _Safe_iterator&), _Safe_iterator<>::
	operator=(const _Safe_iterator&)): Implement resolution of DR 408,
	do not error out when the source is a value-initialized iterator.
	* testsuite/23_containers/vector/15523.cc: New.
	* doc/xml/manual/intro.xml: Add an entry for DR 408.

From-SVN: r150455
This commit is contained in:
Paolo Carlini 2009-08-04 13:01:08 +00:00 committed by Paolo Carlini
parent 51b128a0c0
commit 05168714db
4 changed files with 69 additions and 8 deletions

View File

@ -1,3 +1,13 @@
2009-08-04 Paolo Carlini <paolo.carlini@oracle.com>
PR libstdc++/15523
* include/debug/safe_iterator.h (_Safe_iterator<>::
_Safe_iterator(const _Safe_iterator&), _Safe_iterator<>::
operator=(const _Safe_iterator&)): Implement resolution of DR 408,
do not error out when the source is a value-initialized iterator.
* testsuite/23_containers/vector/15523.cc: New.
* doc/xml/manual/intro.xml: Add an entry for DR 408.
2009-08-03 Paolo Carlini <paolo.carlini@oracle.com>
* include/std/istream (operator>>(basic_istream<>&&, _Tp&)): Minor

View File

@ -604,6 +604,14 @@ requirements of the license of GCC.
<listitem><para>Replace &quot;new&quot; with &quot;::new&quot;.
</para></listitem></varlistentry>
<varlistentry><term><ulink url="../ext/lwg-active.html#408">408</ulink>:
<emphasis>
Is vector&lt;reverse_iterator&lt;char*&gt; &gt; forbidden?
</emphasis>
</term>
<listitem><para>Tweak the debug-mode checks in _Safe_iterator.
</para></listitem></varlistentry>
<varlistentry><term><ulink url="../ext/lwg-defects.html#409">409</ulink>:
<emphasis>Closing an fstream should clear the error state</emphasis>
</term>

View File

@ -115,12 +115,14 @@ namespace __gnu_debug
/**
* @brief Copy construction.
* @pre @p x is not singular
*/
_Safe_iterator(const _Safe_iterator& __x)
: _Safe_iterator_base(__x, _M_constant()), _M_current(__x._M_current)
{
_GLIBCXX_DEBUG_VERIFY(!__x._M_singular(),
// _GLIBCXX_RESOLVE_LIB_DEFECTS
// DR 408. Is vector<reverse_iterator<char*> > forbidden?
_GLIBCXX_DEBUG_VERIFY(!__x._M_singular()
|| __x._M_current == _Iterator(),
_M_message(__msg_init_copy_singular)
._M_iterator(*this, "this")
._M_iterator(__x, "other"));
@ -129,8 +131,6 @@ namespace __gnu_debug
/**
* @brief Converting constructor from a mutable iterator to a
* constant iterator.
*
* @pre @p x is not singular
*/
template<typename _MutableIterator>
_Safe_iterator(
@ -140,7 +140,10 @@ namespace __gnu_debug
_Sequence>::__type>& __x)
: _Safe_iterator_base(__x, _M_constant()), _M_current(__x.base())
{
_GLIBCXX_DEBUG_VERIFY(!__x._M_singular(),
// _GLIBCXX_RESOLVE_LIB_DEFECTS
// DR 408. Is vector<reverse_iterator<char*> > forbidden?
_GLIBCXX_DEBUG_VERIFY(!__x._M_singular()
|| __x.base() == _Iterator(),
_M_message(__msg_init_const_singular)
._M_iterator(*this, "this")
._M_iterator(__x, "other"));
@ -148,12 +151,14 @@ namespace __gnu_debug
/**
* @brief Copy assignment.
* @pre @p x is not singular
*/
_Safe_iterator&
operator=(const _Safe_iterator& __x)
{
_GLIBCXX_DEBUG_VERIFY(!__x._M_singular(),
// _GLIBCXX_RESOLVE_LIB_DEFECTS
// DR 408. Is vector<reverse_iterator<char*> > forbidden?
_GLIBCXX_DEBUG_VERIFY(!__x._M_singular()
|| __x._M_current == _Iterator(),
_M_message(__msg_copy_singular)
._M_iterator(*this, "this")
._M_iterator(__x, "other"));
@ -169,7 +174,6 @@ namespace __gnu_debug
reference
operator*() const
{
_GLIBCXX_DEBUG_VERIFY(this->_M_dereferenceable(),
_M_message(__msg_bad_deref)
._M_iterator(*this, "this"));

View File

@ -0,0 +1,39 @@
// Copyright (C) 2009 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-options "-D_GLIBCXX_DEBUG" }
#include <vector>
// libstdc++/15523
void test01()
{
using namespace std;
vector<vector<int>::const_iterator> x(2);
vector<int>::iterator i2, i3;
vector<int>::const_iterator ci1(i2);
i2 = i3;
}
int main()
{
test01();
return 0;
}