aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarc Glisse <marc.glisse@inria.fr>2014-10-13 12:00:27 +0200
committerMarc Glisse <glisse@gcc.gnu.org>2014-10-13 10:00:27 +0000
commit2a5273835024d375fecd273fd066becab39d82af (patch)
tree7835b14f444c6776aea7418679db5b551a0f7fb5
parente7da0c235ed855f5449e033b2deed29b77077363 (diff)
downloadgcc-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
-rw-r--r--libstdc++-v3/ChangeLog17
-rw-r--r--libstdc++-v3/include/bits/list.tcc6
-rw-r--r--libstdc++-v3/include/bits/stl_list.h16
-rw-r--r--libstdc++-v3/testsuite/23_containers/list/requirements/dr438/assign_neg.cc2
-rw-r--r--libstdc++-v3/testsuite/23_containers/list/requirements/dr438/constructor_1_neg.cc2
-rw-r--r--libstdc++-v3/testsuite/23_containers/list/requirements/dr438/constructor_2_neg.cc2
-rw-r--r--libstdc++-v3/testsuite/23_containers/list/requirements/dr438/insert_neg.cc2
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>