re PR libstdc++/61347 (std::distance(list.first(),list.end()) in O(1))
authorMarc Glisse <marc.glisse@inria.fr>
Mon, 13 Oct 2014 10:00:27 +0000 (12:00 +0200)
committerMarc Glisse <glisse@gcc.gnu.org>
Mon, 13 Oct 2014 10:00:27 +0000 (10:00 +0000)
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

libstdc++-v3/ChangeLog
libstdc++-v3/include/bits/list.tcc
libstdc++-v3/include/bits/stl_list.h
libstdc++-v3/testsuite/23_containers/list/requirements/dr438/assign_neg.cc
libstdc++-v3/testsuite/23_containers/list/requirements/dr438/constructor_1_neg.cc
libstdc++-v3/testsuite/23_containers/list/requirements/dr438/constructor_2_neg.cc
libstdc++-v3/testsuite/23_containers/list/requirements/dr438/insert_neg.cc

index 40931a37d5203b1186d7532f67de0f06c1f65db9..508c9d391e9e2c5dc4f347b2e14ea4e170c71645 100644 (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.
index f99ec54ca4000cec6b87226fb1f92d9dbb3c6e38..7b3ab86e22b1d22116e8aeb1132496b0943cf6c5 100644 (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
index 8e6567cfe67b9052d222b2410f02671cc57afb16..5f66afdaa50f04e90691b8ae4442d97af5ef2c8f 100644 (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_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; }
index 183753dca5fc476717006c6637570f14247e3c2c..37d65b365ba027b6c3739de09810c9bc47c78bc1 100644 (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>
 
index e81ff98d43e587e001c91b52809dce6a38bf4dd1..62483c82719f4f9e2c1cab290f8be0e56cffe670 100644 (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>
 
index c98aa0f476bc307dd8442348d36176f91e4cffdc..39c7318846d043c247b4a89c29aa20228584f240 100644 (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>
index 1397796132c033bfae5fc797ad8bddfe522a77e5..2dba620017e3c549ac023243bf7c6108e9d610e0 100644 (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>