re PR libstdc++/61347 (std::distance(list.first(),list.end()) in O(1))

2014-10-13  Marc Glisse  <marc.glisse@inria.fr>

	PR libstdc++/61347
	PR libstdc++/63345
	* include/bits/list.tcc (_List_base::_M_clear()): Delay cast so it
	isn't done for the sentinel.
	* include/bits/stl_list.h (_List_base::_M_size): Move...
	(_List_base::_List_impl::_M_node): ... here.
	(_List_base::_M_get_size(), _List_base::_M_set_size(size_t),
	_List_base::_M_inc_size(size_t), _List_base::_M_dec_size(size_t),
	_List_base::_M_node_count): Adapt to the move.
	* 23_containers/list/requirements/dr438/assign_neg.cc: Update
	line number.
	* 23_containers/list/requirements/dr438/constructor_1_neg.cc: Likewise.
	* 23_containers/list/requirements/dr438/constructor_2_neg.cc: Likewise.
	* 23_containers/list/requirements/dr438/insert_neg.cc: Likewise.

From-SVN: r216142
This commit is contained in:
Marc Glisse 2014-10-13 12:00:27 +02:00 committed by Marc Glisse
parent e7da0c235e
commit 2a52738350
7 changed files with 33 additions and 14 deletions

View File

@ -1,3 +1,20 @@
2014-10-13 Marc Glisse <marc.glisse@inria.fr>
PR libstdc++/61347
PR libstdc++/63345
* include/bits/list.tcc (_List_base::_M_clear()): Delay cast so it
isn't done for the sentinel.
* include/bits/stl_list.h (_List_base::_M_size): Move...
(_List_base::_List_impl::_M_node): ... here.
(_List_base::_M_get_size(), _List_base::_M_set_size(size_t),
_List_base::_M_inc_size(size_t), _List_base::_M_dec_size(size_t),
_List_base::_M_node_count): Adapt to the move.
* 23_containers/list/requirements/dr438/assign_neg.cc: Update
line number.
* 23_containers/list/requirements/dr438/constructor_1_neg.cc: Likewise.
* 23_containers/list/requirements/dr438/constructor_2_neg.cc: Likewise.
* 23_containers/list/requirements/dr438/insert_neg.cc: Likewise.
2014-10-10 Jonathan Wakely <jwakely@redhat.com>
* testsuite/Makefile.in: Regenerate.

View File

@ -66,11 +66,11 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
_M_clear() _GLIBCXX_NOEXCEPT
{
typedef _List_node<_Tp> _Node;
_Node* __cur = static_cast<_Node*>(_M_impl._M_node._M_next);
__detail::_List_node_base* __cur = _M_impl._M_node._M_next;
while (__cur != &_M_impl._M_node)
{
_Node* __tmp = __cur;
__cur = static_cast<_Node*>(__cur->_M_next);
_Node* __tmp = static_cast<_Node*>(__cur);
__cur = __tmp->_M_next;
#if __cplusplus >= 201103L
_M_get_Node_allocator().destroy(__tmp);
#else

View File

@ -332,7 +332,11 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
struct _List_impl
: public _Node_alloc_type
{
#if _GLIBCXX_USE_CXX11_ABI
_List_node<size_t> _M_node;
#else
__detail::_List_node_base _M_node;
#endif
_List_impl()
: _Node_alloc_type(), _M_node()
@ -352,15 +356,13 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
_List_impl _M_impl;
#if _GLIBCXX_USE_CXX11_ABI
size_t _M_size;
size_t _M_get_size() const { return _M_impl._M_node._M_data; }
size_t _M_get_size() const { return _M_size; }
void _M_set_size(size_t __n) { _M_impl._M_node._M_data = __n; }
void _M_set_size(size_t __n) { _M_size = __n; }
void _M_inc_size(size_t __n) { _M_impl._M_node._M_data += __n; }
void _M_inc_size(size_t __n) { _M_size += __n; }
void _M_dec_size(size_t __n) { _M_size -= __n; }
void _M_dec_size(size_t __n) { _M_impl._M_node._M_data -= __n; }
size_t
_M_distance(const __detail::_List_node_base* __first,
@ -368,7 +370,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
{ return _S_distance(__first, __last); }
// return the stored size
size_t _M_node_count() const { return _M_size; }
size_t _M_node_count() const { return _M_impl._M_node._M_data; }
#else
// dummy implementations used when the size is not stored
size_t _M_get_size() const { return 0; }

View File

@ -18,7 +18,7 @@
// <http://www.gnu.org/licenses/>.
// { dg-do compile }
// { dg-error "no matching" "" { target *-*-* } 1728 }
// { dg-error "no matching" "" { target *-*-* } 1730 }
#include <list>

View File

@ -18,7 +18,7 @@
// <http://www.gnu.org/licenses/>.
// { dg-do compile }
// { dg-error "no matching" "" { target *-*-* } 1680 }
// { dg-error "no matching" "" { target *-*-* } 1682 }
#include <list>

View File

@ -18,7 +18,7 @@
// <http://www.gnu.org/licenses/>.
// { dg-do compile }
// { dg-error "no matching" "" { target *-*-* } 1680 }
// { dg-error "no matching" "" { target *-*-* } 1682 }
#include <list>
#include <utility>

View File

@ -18,7 +18,7 @@
// <http://www.gnu.org/licenses/>.
// { dg-do compile }
// { dg-error "no matching" "" { target *-*-* } 1680 }
// { dg-error "no matching" "" { target *-*-* } 1682 }
#include <list>