+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.
_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
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()
_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,
{ 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; }
// <http://www.gnu.org/licenses/>.
// { dg-do compile }
-// { dg-error "no matching" "" { target *-*-* } 1728 }
+// { dg-error "no matching" "" { target *-*-* } 1730 }
#include <list>
// <http://www.gnu.org/licenses/>.
// { dg-do compile }
-// { dg-error "no matching" "" { target *-*-* } 1680 }
+// { dg-error "no matching" "" { target *-*-* } 1682 }
#include <list>
// <http://www.gnu.org/licenses/>.
// { dg-do compile }
-// { dg-error "no matching" "" { target *-*-* } 1680 }
+// { dg-error "no matching" "" { target *-*-* } 1682 }
#include <list>
#include <utility>
// <http://www.gnu.org/licenses/>.
// { dg-do compile }
-// { dg-error "no matching" "" { target *-*-* } 1680 }
+// { dg-error "no matching" "" { target *-*-* } 1682 }
#include <list>