diff options
author | Marc Glisse <marc.glisse@inria.fr> | 2014-10-13 12:00:27 +0200 |
---|---|---|
committer | Marc Glisse <glisse@gcc.gnu.org> | 2014-10-13 10:00:27 +0000 |
commit | 2a5273835024d375fecd273fd066becab39d82af (patch) | |
tree | 7835b14f444c6776aea7418679db5b551a0f7fb5 | |
parent | e7da0c235ed855f5449e033b2deed29b77077363 (diff) | |
download | gcc-2a5273835024d375fecd273fd066becab39d82af.zip gcc-2a5273835024d375fecd273fd066becab39d82af.tar.gz gcc-2a5273835024d375fecd273fd066becab39d82af.tar.bz2 |
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
7 files changed, 33 insertions, 14 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 40931a3..508c9d3 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -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. diff --git a/libstdc++-v3/include/bits/list.tcc b/libstdc++-v3/include/bits/list.tcc index f99ec54..7b3ab86 100644 --- a/libstdc++-v3/include/bits/list.tcc +++ b/libstdc++-v3/include/bits/list.tcc @@ -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 diff --git a/libstdc++-v3/include/bits/stl_list.h b/libstdc++-v3/include/bits/stl_list.h index 8e6567c..5f66afd 100644 --- a/libstdc++-v3/include/bits/stl_list.h +++ b/libstdc++-v3/include/bits/stl_list.h @@ -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_size; } + size_t _M_get_size() const { return _M_impl._M_node._M_data; } - void _M_set_size(size_t __n) { _M_size = __n; } + void _M_set_size(size_t __n) { _M_impl._M_node._M_data = __n; } - void _M_inc_size(size_t __n) { _M_size += __n; } + void _M_inc_size(size_t __n) { _M_impl._M_node._M_data += __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; } diff --git a/libstdc++-v3/testsuite/23_containers/list/requirements/dr438/assign_neg.cc b/libstdc++-v3/testsuite/23_containers/list/requirements/dr438/assign_neg.cc index 183753d..37d65b3 100644 --- a/libstdc++-v3/testsuite/23_containers/list/requirements/dr438/assign_neg.cc +++ b/libstdc++-v3/testsuite/23_containers/list/requirements/dr438/assign_neg.cc @@ -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> diff --git a/libstdc++-v3/testsuite/23_containers/list/requirements/dr438/constructor_1_neg.cc b/libstdc++-v3/testsuite/23_containers/list/requirements/dr438/constructor_1_neg.cc index e81ff98..62483c8 100644 --- a/libstdc++-v3/testsuite/23_containers/list/requirements/dr438/constructor_1_neg.cc +++ b/libstdc++-v3/testsuite/23_containers/list/requirements/dr438/constructor_1_neg.cc @@ -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> diff --git a/libstdc++-v3/testsuite/23_containers/list/requirements/dr438/constructor_2_neg.cc b/libstdc++-v3/testsuite/23_containers/list/requirements/dr438/constructor_2_neg.cc index c98aa0f..39c7318 100644 --- a/libstdc++-v3/testsuite/23_containers/list/requirements/dr438/constructor_2_neg.cc +++ b/libstdc++-v3/testsuite/23_containers/list/requirements/dr438/constructor_2_neg.cc @@ -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> diff --git a/libstdc++-v3/testsuite/23_containers/list/requirements/dr438/insert_neg.cc b/libstdc++-v3/testsuite/23_containers/list/requirements/dr438/insert_neg.cc index 1397796..2dba620 100644 --- a/libstdc++-v3/testsuite/23_containers/list/requirements/dr438/insert_neg.cc +++ b/libstdc++-v3/testsuite/23_containers/list/requirements/dr438/insert_neg.cc @@ -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> |