re PR libstdc++/63775 ([C++11] Regex range with leading dash (-) not working)
[gcc.git] / libstdc++-v3 / include / bits / stl_list.h
index 51f8a8f931dfeeb506c862c4b15bb085f47cb341..5f66afdaa50f04e90691b8ae4442d97af5ef2c8f 100644 (file)
@@ -1,7 +1,6 @@
 // List implementation -*- C++ -*-
 
-// Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
-// Free Software Foundation, Inc.
+// Copyright (C) 2001-2014 Free Software Foundation, Inc.
 //
 // This file is part of the GNU ISO C++ Library.  This library is free
 // software; you can redistribute it and/or modify it under the
  * purpose.  It is provided "as is" without express or implied warranty.
  */
 
-/** @file stl_list.h
+/** @file bits/stl_list.h
  *  This is an internal header file, included by other library headers.
- *  You should not attempt to use it directly.
+ *  Do not attempt to use it directly. @headername{list}
  */
 
 #ifndef _STL_LIST_H
 #define _STL_LIST_H 1
 
 #include <bits/concept_check.h>
+#if __cplusplus >= 201103L
 #include <initializer_list>
+#endif
 
-_GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D)
+namespace std _GLIBCXX_VISIBILITY(default)
+{
+  namespace __detail
+  {
+  _GLIBCXX_BEGIN_NAMESPACE_VERSION
 
-  // Supporting structures are split into common and templated types; the
-  // latter publicly inherits from the former in an effort to reduce code
-  // duplication.  This results in some "needless" static_cast'ing later on,
-  // but it's all safe downcasting.
+    // Supporting structures are split into common and templated
+    // types; the latter publicly inherits from the former in an
+    // effort to reduce code duplication.  This results in some
+    // "needless" static_cast'ing later on, but it's all safe
+    // downcasting.
 
-  /// Common part of a node in the %list. 
-  struct _List_node_base
-  {
-    _List_node_base* _M_next;
-    _List_node_base* _M_prev;
+    /// Common part of a node in the %list. 
+    struct _List_node_base
+    {
+      _List_node_base* _M_next;
+      _List_node_base* _M_prev;
 
-    static void
-    swap(_List_node_base& __x, _List_node_base& __y) throw ();
+      static void
+      swap(_List_node_base& __x, _List_node_base& __y) _GLIBCXX_USE_NOEXCEPT;
 
-    void
-    transfer(_List_node_base * const __first,
-            _List_node_base * const __last) throw ();
+      void
+      _M_transfer(_List_node_base* const __first,
+                 _List_node_base* const __last) _GLIBCXX_USE_NOEXCEPT;
 
-    void
-    reverse() throw ();
+      void
+      _M_reverse() _GLIBCXX_USE_NOEXCEPT;
+
+      void
+      _M_hook(_List_node_base* const __position) _GLIBCXX_USE_NOEXCEPT;
+
+      void
+      _M_unhook() _GLIBCXX_USE_NOEXCEPT;
+    };
 
-    void
-    hook(_List_node_base * const __position) throw ();
+  _GLIBCXX_END_NAMESPACE_VERSION
+  } // namespace detail
 
-    void
-    unhook() throw ();
-  };
+_GLIBCXX_BEGIN_NAMESPACE_CONTAINER
 
   /// An actual node in the %list.
   template<typename _Tp>
-    struct _List_node : public _List_node_base
+    struct _List_node : public __detail::_List_node_base
     {
       ///< User's data.
       _Tp _M_data;
 
-#ifdef __GXX_EXPERIMENTAL_CXX0X__
+#if __cplusplus >= 201103L
       template<typename... _Args>
         _List_node(_Args&&... __args)
-       : _List_node_base(), _M_data(std::forward<_Args>(__args)...) { }
+       : __detail::_List_node_base(), _M_data(std::forward<_Args>(__args)...) 
+        { }
 #endif
     };
 
@@ -121,31 +133,35 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D)
       typedef _Tp*                               pointer;
       typedef _Tp&                               reference;
 
-      _List_iterator()
+      _List_iterator() _GLIBCXX_NOEXCEPT
       : _M_node() { }
 
       explicit
-      _List_iterator(_List_node_base* __x)
+      _List_iterator(__detail::_List_node_base* __x) _GLIBCXX_NOEXCEPT
       : _M_node(__x) { }
 
-      // Must downcast from List_node_base to _List_node to get to _M_data.
+      _Self
+      _M_const_cast() const _GLIBCXX_NOEXCEPT
+      { return *this; }
+
+      // Must downcast from _List_node_base to _List_node to get to _M_data.
       reference
-      operator*() const
+      operator*() const _GLIBCXX_NOEXCEPT
       { return static_cast<_Node*>(_M_node)->_M_data; }
 
       pointer
-      operator->() const
-      { return &static_cast<_Node*>(_M_node)->_M_data; }
+      operator->() const _GLIBCXX_NOEXCEPT
+      { return std::__addressof(static_cast<_Node*>(_M_node)->_M_data); }
 
       _Self&
-      operator++()
+      operator++() _GLIBCXX_NOEXCEPT
       {
        _M_node = _M_node->_M_next;
        return *this;
       }
 
       _Self
-      operator++(int)
+      operator++(int) _GLIBCXX_NOEXCEPT
       {
        _Self __tmp = *this;
        _M_node = _M_node->_M_next;
@@ -153,14 +169,14 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D)
       }
 
       _Self&
-      operator--()
+      operator--() _GLIBCXX_NOEXCEPT
       {
        _M_node = _M_node->_M_prev;
        return *this;
       }
 
       _Self
-      operator--(int)
+      operator--(int) _GLIBCXX_NOEXCEPT
       {
        _Self __tmp = *this;
        _M_node = _M_node->_M_prev;
@@ -168,15 +184,15 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D)
       }
 
       bool
-      operator==(const _Self& __x) const
+      operator==(const _Self& __x) const _GLIBCXX_NOEXCEPT
       { return _M_node == __x._M_node; }
 
       bool
-      operator!=(const _Self& __x) const
+      operator!=(const _Self& __x) const _GLIBCXX_NOEXCEPT
       { return _M_node != __x._M_node; }
 
       // The only member points to the %list element.
-      _List_node_base* _M_node;
+      __detail::_List_node_base* _M_node;
     };
 
   /**
@@ -197,35 +213,40 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D)
       typedef const _Tp*                         pointer;
       typedef const _Tp&                         reference;
 
-      _List_const_iterator()
+      _List_const_iterator() _GLIBCXX_NOEXCEPT
       : _M_node() { }
 
       explicit
-      _List_const_iterator(const _List_node_base* __x)
+      _List_const_iterator(const __detail::_List_node_base* __x)
+      _GLIBCXX_NOEXCEPT
       : _M_node(__x) { }
 
-      _List_const_iterator(const iterator& __x)
+      _List_const_iterator(const iterator& __x) _GLIBCXX_NOEXCEPT
       : _M_node(__x._M_node) { }
 
+      iterator
+      _M_const_cast() const _GLIBCXX_NOEXCEPT
+      { return iterator(const_cast<__detail::_List_node_base*>(_M_node)); }
+
       // Must downcast from List_node_base to _List_node to get to
       // _M_data.
       reference
-      operator*() const
+      operator*() const _GLIBCXX_NOEXCEPT
       { return static_cast<_Node*>(_M_node)->_M_data; }
 
       pointer
-      operator->() const
-      { return &static_cast<_Node*>(_M_node)->_M_data; }
+      operator->() const _GLIBCXX_NOEXCEPT
+      { return std::__addressof(static_cast<_Node*>(_M_node)->_M_data); }
 
       _Self&
-      operator++()
+      operator++() _GLIBCXX_NOEXCEPT
       {
        _M_node = _M_node->_M_next;
        return *this;
       }
 
       _Self
-      operator++(int)
+      operator++(int) _GLIBCXX_NOEXCEPT
       {
        _Self __tmp = *this;
        _M_node = _M_node->_M_next;
@@ -233,14 +254,14 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D)
       }
 
       _Self&
-      operator--()
+      operator--() _GLIBCXX_NOEXCEPT
       {
        _M_node = _M_node->_M_prev;
        return *this;
       }
 
       _Self
-      operator--(int)
+      operator--(int) _GLIBCXX_NOEXCEPT
       {
        _Self __tmp = *this;
        _M_node = _M_node->_M_prev;
@@ -248,33 +269,33 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D)
       }
 
       bool
-      operator==(const _Self& __x) const
+      operator==(const _Self& __x) const _GLIBCXX_NOEXCEPT
       { return _M_node == __x._M_node; }
 
       bool
-      operator!=(const _Self& __x) const
+      operator!=(const _Self& __x) const _GLIBCXX_NOEXCEPT
       { return _M_node != __x._M_node; }
 
       // The only member points to the %list element.
-      const _List_node_base* _M_node;
+      const __detail::_List_node_base* _M_node;
     };
 
   template<typename _Val>
     inline bool
     operator==(const _List_iterator<_Val>& __x,
-              const _List_const_iterator<_Val>& __y)
+              const _List_const_iterator<_Val>& __y) _GLIBCXX_NOEXCEPT
     { return __x._M_node == __y._M_node; }
 
   template<typename _Val>
     inline bool
     operator!=(const _List_iterator<_Val>& __x,
-               const _List_const_iterator<_Val>& __y)
+               const _List_const_iterator<_Val>& __y) _GLIBCXX_NOEXCEPT
     { return __x._M_node != __y._M_node; }
 
 
   /// See bits/stl_deque.h's _Deque_base for an explanation.
   template<typename _Tp, typename _Alloc>
-    class _List_base
+    class _GLIBCXX_DEFAULT_ABI_TAG _List_base
     {
     protected:
       // NOTA BENE
@@ -295,78 +316,144 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D)
 
       typedef typename _Alloc::template rebind<_Tp>::other _Tp_alloc_type;
 
-      struct _List_impl 
+      static size_t
+      _S_distance(const __detail::_List_node_base* __first,
+                 const __detail::_List_node_base* __last)
+      {
+       size_t __n = 0;
+       while (__first != __last)
+         {
+           __first = __first->_M_next;
+           ++__n;
+         }
+       return __n;
+      }
+
+      struct _List_impl
       : public _Node_alloc_type
       {
-       _List_node_base _M_node;
+#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(const _Node_alloc_type& __a)
+       _List_impl(const _Node_alloc_type& __a) _GLIBCXX_NOEXCEPT
        : _Node_alloc_type(__a), _M_node()
        { }
+
+#if __cplusplus >= 201103L
+       _List_impl(_Node_alloc_type&& __a) _GLIBCXX_NOEXCEPT
+       : _Node_alloc_type(std::move(__a)), _M_node()
+       { }
+#endif
       };
 
       _List_impl _M_impl;
 
+#if _GLIBCXX_USE_CXX11_ABI
+      size_t _M_get_size() const { return _M_impl._M_node._M_data; }
+
+      void _M_set_size(size_t __n) { _M_impl._M_node._M_data = __n; }
+
+      void _M_inc_size(size_t __n) { _M_impl._M_node._M_data += __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,
+                 const __detail::_List_node_base* __last) const
+      { return _S_distance(__first, __last); }
+
+      // return the stored 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; }
+      void _M_set_size(size_t) { }
+      void _M_inc_size(size_t) { }
+      void _M_dec_size(size_t) { }
+      size_t _M_distance(const void*, const void*) const { return 0; }
+
+      // count the number of nodes
+      size_t _M_node_count() const
+      {
+       return _S_distance(_M_impl._M_node._M_next,
+                          std::__addressof(_M_impl._M_node));
+      }
+#endif
+
       _List_node<_Tp>*
       _M_get_node()
       { return _M_impl._Node_alloc_type::allocate(1); }
-      
+
       void
-      _M_put_node(_List_node<_Tp>* __p)
+      _M_put_node(_List_node<_Tp>* __p) _GLIBCXX_NOEXCEPT
       { _M_impl._Node_alloc_type::deallocate(__p, 1); }
-      
+
   public:
       typedef _Alloc allocator_type;
 
       _Node_alloc_type&
-      _M_get_Node_allocator()
-      { return *static_cast<_Node_alloc_type*>(&this->_M_impl); }
+      _M_get_Node_allocator() _GLIBCXX_NOEXCEPT
+      { return *static_cast<_Node_alloc_type*>(&_M_impl); }
 
       const _Node_alloc_type&
-      _M_get_Node_allocator() const
-      { return *static_cast<const _Node_alloc_type*>(&this->_M_impl); }
+      _M_get_Node_allocator() const _GLIBCXX_NOEXCEPT
+      { return *static_cast<const _Node_alloc_type*>(&_M_impl); }
 
       _Tp_alloc_type
-      _M_get_Tp_allocator() const
+      _M_get_Tp_allocator() const _GLIBCXX_NOEXCEPT
       { return _Tp_alloc_type(_M_get_Node_allocator()); }
 
       allocator_type
-      get_allocator() const
+      get_allocator() const _GLIBCXX_NOEXCEPT
       { return allocator_type(_M_get_Node_allocator()); }
 
       _List_base()
       : _M_impl()
       { _M_init(); }
 
-      _List_base(const allocator_type& __a)
+      _List_base(const _Node_alloc_type& __a) _GLIBCXX_NOEXCEPT
       : _M_impl(__a)
       { _M_init(); }
 
-#ifdef __GXX_EXPERIMENTAL_CXX0X__
-      _List_base(_List_base&& __x)
-      : _M_impl(__x._M_get_Node_allocator())
+#if __cplusplus >= 201103L
+      _List_base(_List_base&& __x) noexcept
+      : _M_impl(std::move(__x._M_get_Node_allocator()))
       {
-       _M_init();
-       _List_node_base::swap(this->_M_impl._M_node, __x._M_impl._M_node);      
+       auto* const __xnode = std::__addressof(__x._M_impl._M_node);
+       if (__xnode->_M_next == __xnode)
+         _M_init();
+       else
+         {
+           auto* const __node = std::__addressof(_M_impl._M_node);
+           __node->_M_next = __xnode->_M_next;
+           __node->_M_prev = __xnode->_M_prev;
+           __node->_M_next->_M_prev = __node->_M_prev->_M_next = __node;
+           _M_set_size(__x._M_get_size());
+           __x._M_init();
+         }
       }
 #endif
 
       // This is what actually destroys the list.
-      ~_List_base()
+      ~_List_base() _GLIBCXX_NOEXCEPT
       { _M_clear(); }
 
       void
-      _M_clear();
+      _M_clear() _GLIBCXX_NOEXCEPT;
 
       void
-      _M_init()
+      _M_init() _GLIBCXX_NOEXCEPT
       {
         this->_M_impl._M_node._M_next = &this->_M_impl._M_node;
         this->_M_impl._M_node._M_prev = &this->_M_impl._M_node;
+       _M_set_size(0);
       }
     };
 
@@ -376,6 +463,9 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D)
    *
    *  @ingroup sequences
    *
+   *  @tparam _Tp  Type of element.
+   *  @tparam _Alloc  Allocator type, defaults to allocator<_Tp>.
+   *
    *  Meets the requirements of a <a href="tables.html#65">container</a>, a
    *  <a href="tables.html#66">reversible container</a>, and a
    *  <a href="tables.html#67">sequence</a>, including the
@@ -414,7 +504,7 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D)
    *  %empty. 
   */
   template<typename _Tp, typename _Alloc = std::allocator<_Tp> >
-    class list : protected _List_base<_Tp, _Alloc>
+    class _GLIBCXX_DEFAULT_ABI_TAG list : protected _List_base<_Tp, _Alloc>
     {
       // concept requirements
       typedef typename _Alloc::value_type                _Alloc_value_type;
@@ -423,6 +513,7 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D)
 
       typedef _List_base<_Tp, _Alloc>                    _Base;
       typedef typename _Base::_Tp_alloc_type            _Tp_alloc_type;
+      typedef typename _Base::_Node_alloc_type          _Node_alloc_type;
 
     public:
       typedef _Tp                                        value_type;
@@ -450,18 +541,20 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D)
       using _Base::_M_get_Node_allocator;
 
       /**
-       *  @param  x  An instance of user data.
+       *  @param  __args  An instance of user data.
        *
-       *  Allocates space for a new node and constructs a copy of @a x in it.
+       *  Allocates space for a new node and constructs a copy of
+       *  @a __args in it.
        */
-#ifndef __GXX_EXPERIMENTAL_CXX0X__
+#if __cplusplus < 201103L
       _Node*
       _M_create_node(const value_type& __x)
       {
        _Node* __p = this->_M_get_node();
        __try
          {
-           _M_get_Tp_allocator().construct(&__p->_M_data, __x);
+           _M_get_Tp_allocator().construct
+             (std::__addressof(__p->_M_data), __x);
          }
        __catch(...)
          {
@@ -493,89 +586,129 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D)
     public:
       // [23.2.2.1] construct/copy/destroy
       // (assign() and get_allocator() are also listed in this section)
+
       /**
-       *  @brief  Default constructor creates no elements.
+       *  @brief  Creates a %list with no elements.
        */
       list()
+#if __cplusplus >= 201103L
+      noexcept(is_nothrow_default_constructible<_Node_alloc_type>::value)
+#endif
       : _Base() { }
 
       /**
        *  @brief  Creates a %list with no elements.
-       *  @param  a  An allocator object.
+       *  @param  __a  An allocator object.
        */
       explicit
-      list(const allocator_type& __a)
-      : _Base(__a) { }
+      list(const allocator_type& __a) _GLIBCXX_NOEXCEPT
+      : _Base(_Node_alloc_type(__a)) { }
+
+#if __cplusplus >= 201103L
+      /**
+       *  @brief  Creates a %list with default constructed elements.
+       *  @param  __n  The number of elements to initially create.
+       *
+       *  This constructor fills the %list with @a __n default
+       *  constructed elements.
+       */
+      explicit
+      list(size_type __n)
+      : _Base()
+      { _M_default_initialize(__n); }
 
       /**
        *  @brief  Creates a %list with copies of an exemplar element.
-       *  @param  n  The number of elements to initially create.
-       *  @param  value  An element to copy.
-       *  @param  a  An allocator object.
+       *  @param  __n  The number of elements to initially create.
+       *  @param  __value  An element to copy.
+       *  @param  __a  An allocator object.
        *
-       *  This constructor fills the %list with @a n copies of @a value.
+       *  This constructor fills the %list with @a __n copies of @a __value.
+       */
+      list(size_type __n, const value_type& __value,
+          const allocator_type& __a = allocator_type())
+      : _Base(_Node_alloc_type(__a))
+      { _M_fill_initialize(__n, __value); }
+#else
+      /**
+       *  @brief  Creates a %list with copies of an exemplar element.
+       *  @param  __n  The number of elements to initially create.
+       *  @param  __value  An element to copy.
+       *  @param  __a  An allocator object.
+       *
+       *  This constructor fills the %list with @a __n copies of @a __value.
        */
       explicit
       list(size_type __n, const value_type& __value = value_type(),
           const allocator_type& __a = allocator_type())
-      : _Base(__a)
+      : _Base(_Node_alloc_type(__a))
       { _M_fill_initialize(__n, __value); }
+#endif
 
       /**
        *  @brief  %List copy constructor.
-       *  @param  x  A %list of identical element and allocator types.
+       *  @param  __x  A %list of identical element and allocator types.
        *
        *  The newly-created %list uses a copy of the allocation object used
-       *  by @a x.
+       *  by @a __x.
        */
       list(const list& __x)
       : _Base(__x._M_get_Node_allocator())
       { _M_initialize_dispatch(__x.begin(), __x.end(), __false_type()); }
 
-#ifdef __GXX_EXPERIMENTAL_CXX0X__
+#if __cplusplus >= 201103L
       /**
        *  @brief  %List move constructor.
-       *  @param  x  A %list of identical element and allocator types.
+       *  @param  __x  A %list of identical element and allocator types.
        *
-       *  The newly-created %list contains the exact contents of @a x.
-       *  The contents of @a x are a valid, but unspecified %list.
+       *  The newly-created %list contains the exact contents of @a __x.
+       *  The contents of @a __x are a valid, but unspecified %list.
        */
-      list(list&& __x)
-      : _Base(std::forward<_Base>(__x)) { }
+      list(list&& __x) noexcept
+      : _Base(std::move(__x)) { }
 
       /**
        *  @brief  Builds a %list from an initializer_list
-       *  @param  l  An initializer_list of value_type.
-       *  @param  a  An allocator object.
+       *  @param  __l  An initializer_list of value_type.
+       *  @param  __a  An allocator object.
        *
        *  Create a %list consisting of copies of the elements in the
-       *  initializer_list @a l.  This is linear in l.size().
+       *  initializer_list @a __l.  This is linear in __l.size().
        */
       list(initializer_list<value_type> __l,
            const allocator_type& __a = allocator_type())
-      : _Base(__a)
+      : _Base(_Node_alloc_type(__a))
       { _M_initialize_dispatch(__l.begin(), __l.end(), __false_type()); }
 #endif
 
       /**
        *  @brief  Builds a %list from a range.
-       *  @param  first  An input iterator.
-       *  @param  last  An input iterator.
-       *  @param  a  An allocator object.
+       *  @param  __first  An input iterator.
+       *  @param  __last  An input iterator.
+       *  @param  __a  An allocator object.
        *
        *  Create a %list consisting of copies of the elements from
-       *  [@a first,@a last).  This is linear in N (where N is
-       *  distance(@a first,@a last)).
+       *  [@a __first,@a __last).  This is linear in N (where N is
+       *  distance(@a __first,@a __last)).
        */
+#if __cplusplus >= 201103L
+      template<typename _InputIterator,
+              typename = std::_RequireInputIter<_InputIterator>>
+        list(_InputIterator __first, _InputIterator __last,
+            const allocator_type& __a = allocator_type())
+       : _Base(_Node_alloc_type(__a))
+        { _M_initialize_dispatch(__first, __last, __false_type()); }
+#else
       template<typename _InputIterator>
         list(_InputIterator __first, _InputIterator __last,
             const allocator_type& __a = allocator_type())
-        : _Base(__a)
+       : _Base(_Node_alloc_type(__a))
         { 
          // Check whether it's an integral type.  If so, it's not an iterator.
          typedef typename std::__is_integer<_InputIterator>::__type _Integral;
          _M_initialize_dispatch(__first, __last, _Integral());
        }
+#endif
 
       /**
        *  No explicit dtor needed as the _Base dtor takes care of
@@ -587,37 +720,38 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D)
 
       /**
        *  @brief  %List assignment operator.
-       *  @param  x  A %list of identical element and allocator types.
+       *  @param  __x  A %list of identical element and allocator types.
        *
-       *  All the elements of @a x are copied, but unlike the copy
+       *  All the elements of @a __x are copied, but unlike the copy
        *  constructor, the allocator object is not copied.
        */
       list&
       operator=(const list& __x);
 
-#ifdef __GXX_EXPERIMENTAL_CXX0X__
+#if __cplusplus >= 201103L
       /**
        *  @brief  %List move assignment operator.
-       *  @param  x  A %list of identical element and allocator types.
+       *  @param  __x  A %list of identical element and allocator types.
        *
-       *  The contents of @a x are moved into this %list (without copying).
-       *  @a x is a valid, but unspecified %list
+       *  The contents of @a __x are moved into this %list (without copying).
+       *  @a __x is a valid, but unspecified %list
        */
       list&
       operator=(list&& __x)
       {
+       // NB: DR 1204.
        // NB: DR 675.
        this->clear();
-       this->swap(__x); 
+       this->swap(__x);
        return *this;
       }
 
       /**
        *  @brief  %List initializer list assignment operator.
-       *  @param  l  An initializer_list of value_type.
+       *  @param  __l  An initializer_list of value_type.
        *
        *  Replace the contents of the %list with copies of the elements
-       *  in the initializer_list @a l.  This is linear in l.size().
+       *  in the initializer_list @a __l.  This is linear in l.size().
        */
       list&
       operator=(initializer_list<value_type> __l)
@@ -629,10 +763,10 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D)
 
       /**
        *  @brief  Assigns a given value to a %list.
-       *  @param  n  Number of elements to be assigned.
-       *  @param  val  Value to be assigned.
+       *  @param  __n  Number of elements to be assigned.
+       *  @param  __val  Value to be assigned.
        *
-       *  This function fills a %list with @a n copies of the given
+       *  This function fills a %list with @a __n copies of the given
        *  value.  Note that the assignment completely changes the %list
        *  and that the resulting %list's size is the same as the number
        *  of elements assigned.  Old data may be lost.
@@ -643,16 +777,23 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D)
 
       /**
        *  @brief  Assigns a range to a %list.
-       *  @param  first  An input iterator.
-       *  @param  last   An input iterator.
+       *  @param  __first  An input iterator.
+       *  @param  __last   An input iterator.
        *
        *  This function fills a %list with copies of the elements in the
-       *  range [@a first,@a last).
+       *  range [@a __first,@a __last).
        *
        *  Note that the assignment completely changes the %list and
        *  that the resulting %list's size is the same as the number of
        *  elements assigned.  Old data may be lost.
        */
+#if __cplusplus >= 201103L
+      template<typename _InputIterator,
+              typename = std::_RequireInputIter<_InputIterator>>
+        void
+        assign(_InputIterator __first, _InputIterator __last)
+        { _M_assign_dispatch(__first, __last, __false_type()); }
+#else
       template<typename _InputIterator>
         void
         assign(_InputIterator __first, _InputIterator __last)
@@ -661,14 +802,15 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D)
          typedef typename std::__is_integer<_InputIterator>::__type _Integral;
          _M_assign_dispatch(__first, __last, _Integral());
        }
+#endif
 
-#ifdef __GXX_EXPERIMENTAL_CXX0X__
+#if __cplusplus >= 201103L
       /**
        *  @brief  Assigns an initializer_list to a %list.
-       *  @param  l  An initializer_list of value_type.
+       *  @param  __l  An initializer_list of value_type.
        *
        *  Replace the contents of the %list with copies of the elements
-       *  in the initializer_list @a l.  This is linear in l.size().
+       *  in the initializer_list @a __l.  This is linear in __l.size().
        */
       void
       assign(initializer_list<value_type> __l)
@@ -677,7 +819,7 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D)
 
       /// Get a copy of the memory allocation object.
       allocator_type
-      get_allocator() const
+      get_allocator() const _GLIBCXX_NOEXCEPT
       { return _Base::get_allocator(); }
 
       // iterators
@@ -686,7 +828,7 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D)
        *  %list.  Iteration is done in ordinary element order.
        */
       iterator
-      begin()
+      begin() _GLIBCXX_NOEXCEPT
       { return iterator(this->_M_impl._M_node._M_next); }
 
       /**
@@ -695,7 +837,7 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D)
        *  element order.
        */
       const_iterator
-      begin() const
+      begin() const _GLIBCXX_NOEXCEPT
       { return const_iterator(this->_M_impl._M_node._M_next); }
 
       /**
@@ -704,7 +846,7 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D)
        *  order.
        */
       iterator
-      end()
+      end() _GLIBCXX_NOEXCEPT
       { return iterator(&this->_M_impl._M_node); }
 
       /**
@@ -713,7 +855,7 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D)
        *  element order.
        */
       const_iterator
-      end() const
+      end() const _GLIBCXX_NOEXCEPT
       { return const_iterator(&this->_M_impl._M_node); }
 
       /**
@@ -722,7 +864,7 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D)
        *  order.
        */
       reverse_iterator
-      rbegin()
+      rbegin() _GLIBCXX_NOEXCEPT
       { return reverse_iterator(end()); }
 
       /**
@@ -731,7 +873,7 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D)
        *  element order.
        */
       const_reverse_iterator
-      rbegin() const
+      rbegin() const _GLIBCXX_NOEXCEPT
       { return const_reverse_iterator(end()); }
 
       /**
@@ -740,7 +882,7 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D)
        *  reverse element order.
        */
       reverse_iterator
-      rend()
+      rend() _GLIBCXX_NOEXCEPT
       { return reverse_iterator(begin()); }
 
       /**
@@ -749,17 +891,17 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D)
        *  element order.
        */
       const_reverse_iterator
-      rend() const
+      rend() const _GLIBCXX_NOEXCEPT
       { return const_reverse_iterator(begin()); }
 
-#ifdef __GXX_EXPERIMENTAL_CXX0X__
+#if __cplusplus >= 201103L
       /**
        *  Returns a read-only (constant) iterator that points to the
        *  first element in the %list.  Iteration is done in ordinary
        *  element order.
        */
       const_iterator
-      cbegin() const
+      cbegin() const noexcept
       { return const_iterator(this->_M_impl._M_node._M_next); }
 
       /**
@@ -768,7 +910,7 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D)
        *  element order.
        */
       const_iterator
-      cend() const
+      cend() const noexcept
       { return const_iterator(&this->_M_impl._M_node); }
 
       /**
@@ -777,7 +919,7 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D)
        *  element order.
        */
       const_reverse_iterator
-      crbegin() const
+      crbegin() const noexcept
       { return const_reverse_iterator(end()); }
 
       /**
@@ -786,7 +928,7 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D)
        *  element order.
        */
       const_reverse_iterator
-      crend() const
+      crend() const noexcept
       { return const_reverse_iterator(begin()); }
 #endif
 
@@ -796,23 +938,49 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D)
        *  end().)
        */
       bool
-      empty() const
+      empty() const _GLIBCXX_NOEXCEPT
       { return this->_M_impl._M_node._M_next == &this->_M_impl._M_node; }
 
       /**  Returns the number of elements in the %list.  */
       size_type
-      size() const
-      { return std::distance(begin(), end()); }
+      size() const _GLIBCXX_NOEXCEPT
+      { return this->_M_node_count(); }
 
       /**  Returns the size() of the largest possible %list.  */
       size_type
-      max_size() const
+      max_size() const _GLIBCXX_NOEXCEPT
       { return _M_get_Node_allocator().max_size(); }
 
+#if __cplusplus >= 201103L
+      /**
+       *  @brief Resizes the %list to the specified number of elements.
+       *  @param __new_size Number of elements the %list should contain.
+       *
+       *  This function will %resize the %list to the specified number
+       *  of elements.  If the number is smaller than the %list's
+       *  current size the %list is truncated, otherwise default
+       *  constructed elements are appended.
+       */
+      void
+      resize(size_type __new_size);
+
       /**
        *  @brief Resizes the %list to the specified number of elements.
-       *  @param new_size Number of elements the %list should contain.
-       *  @param x Data with which new elements should be populated.
+       *  @param __new_size Number of elements the %list should contain.
+       *  @param __x Data with which new elements should be populated.
+       *
+       *  This function will %resize the %list to the specified number
+       *  of elements.  If the number is smaller than the %list's
+       *  current size the %list is truncated, otherwise the %list is
+       *  extended and new elements are populated with given data.
+       */
+      void
+      resize(size_type __new_size, const value_type& __x);
+#else
+      /**
+       *  @brief Resizes the %list to the specified number of elements.
+       *  @param __new_size Number of elements the %list should contain.
+       *  @param __x Data with which new elements should be populated.
        *
        *  This function will %resize the %list to the specified number
        *  of elements.  If the number is smaller than the %list's
@@ -821,6 +989,7 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D)
        */
       void
       resize(size_type __new_size, value_type __x = value_type());
+#endif
 
       // element access
       /**
@@ -828,7 +997,7 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D)
        *  element of the %list.
        */
       reference
-      front()
+      front() _GLIBCXX_NOEXCEPT
       { return *begin(); }
 
       /**
@@ -836,7 +1005,7 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D)
        *  element of the %list.
        */
       const_reference
-      front() const
+      front() const _GLIBCXX_NOEXCEPT
       { return *begin(); }
 
       /**
@@ -844,7 +1013,7 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D)
        *  of the %list.
        */
       reference
-      back()
+      back() _GLIBCXX_NOEXCEPT
       { 
        iterator __tmp = end();
        --__tmp;
@@ -856,7 +1025,7 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D)
        *  element of the %list.
        */
       const_reference
-      back() const
+      back() const _GLIBCXX_NOEXCEPT
       { 
        const_iterator __tmp = end();
        --__tmp;
@@ -866,7 +1035,7 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D)
       // [23.2.2.3] modifiers
       /**
        *  @brief  Add data to the front of the %list.
-       *  @param  x  Data to be added.
+       *  @param  __x  Data to be added.
        *
        *  This is a typical stack operation.  The function creates an
        *  element at the front of the %list and assigns the given data
@@ -878,7 +1047,7 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D)
       push_front(const value_type& __x)
       { this->_M_insert(begin(), __x); }
 
-#ifdef __GXX_EXPERIMENTAL_CXX0X__
+#if __cplusplus >= 201103L
       void
       push_front(value_type&& __x)
       { this->_M_insert(begin(), std::move(__x)); }
@@ -902,12 +1071,12 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D)
        *  called.
        */
       void
-      pop_front()
+      pop_front() _GLIBCXX_NOEXCEPT
       { this->_M_erase(begin()); }
 
       /**
        *  @brief  Add data to the end of the %list.
-       *  @param  x  Data to be added.
+       *  @param  __x  Data to be added.
        *
        *  This is a typical stack operation.  The function creates an
        *  element at the end of the %list and assigns the given data to
@@ -919,7 +1088,7 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D)
       push_back(const value_type& __x)
       { this->_M_insert(end(), __x); }
 
-#ifdef __GXX_EXPERIMENTAL_CXX0X__
+#if __cplusplus >= 201103L
       void
       push_back(value_type&& __x)
       { this->_M_insert(end(), std::move(__x)); }
@@ -942,14 +1111,14 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D)
        *  is needed, it should be retrieved before pop_back() is called.
        */
       void
-      pop_back()
+      pop_back() _GLIBCXX_NOEXCEPT
       { this->_M_erase(iterator(this->_M_impl._M_node._M_prev)); }
 
-#ifdef __GXX_EXPERIMENTAL_CXX0X__
+#if __cplusplus >= 201103L
       /**
        *  @brief  Constructs object in %list before specified iterator.
-       *  @param  position  A const_iterator into the %list.
-       *  @param  args  Arguments.
+       *  @param  __position  A const_iterator into the %list.
+       *  @param  __args  Arguments.
        *  @return  An iterator that points to the inserted data.
        *
        *  This function will insert an object of type T constructed
@@ -960,13 +1129,26 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D)
        */
       template<typename... _Args>
         iterator
-        emplace(iterator __position, _Args&&... __args);
-#endif
+        emplace(const_iterator __position, _Args&&... __args);
 
       /**
        *  @brief  Inserts given value into %list before specified iterator.
-       *  @param  position  An iterator into the %list.
-       *  @param  x  Data to be inserted.
+       *  @param  __position  A const_iterator into the %list.
+       *  @param  __x  Data to be inserted.
+       *  @return  An iterator that points to the inserted data.
+       *
+       *  This function will insert a copy of the given value before
+       *  the specified location.  Due to the nature of a %list this
+       *  operation can be done in constant time, and does not
+       *  invalidate iterators and references.
+       */
+      iterator
+      insert(const_iterator __position, const value_type& __x);
+#else
+      /**
+       *  @brief  Inserts given value into %list before specified iterator.
+       *  @param  __position  An iterator into the %list.
+       *  @param  __x  Data to be inserted.
        *  @return  An iterator that points to the inserted data.
        *
        *  This function will insert a copy of the given value before
@@ -976,12 +1158,13 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D)
        */
       iterator
       insert(iterator __position, const value_type& __x);
+#endif
 
-#ifdef __GXX_EXPERIMENTAL_CXX0X__
+#if __cplusplus >= 201103L
       /**
        *  @brief  Inserts given rvalue into %list before specified iterator.
-       *  @param  position  An iterator into the %list.
-       *  @param  x  Data to be inserted.
+       *  @param  __position  A const_iterator into the %list.
+       *  @param  __x  Data to be inserted.
        *  @return  An iterator that points to the inserted data.
        *
        *  This function will insert a copy of the given rvalue before
@@ -990,14 +1173,16 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D)
        *  invalidate iterators and references.
         */
       iterator
-      insert(iterator __position, value_type&& __x)
+      insert(const_iterator __position, value_type&& __x)
       { return emplace(__position, std::move(__x)); }
 
       /**
        *  @brief  Inserts the contents of an initializer_list into %list
-       *          before specified iterator.
-       *  @param  p  An iterator into the %list.
-       *  @param  l  An initializer_list of value_type.
+       *          before specified const_iterator.
+       *  @param  __p  A const_iterator into the %list.
+       *  @param  __l  An initializer_list of value_type.
+       *  @return  An iterator pointing to the first element inserted
+       *           (or __position).
        *
        *  This function will insert copies of the data in the
        *  initializer_list @a l into the %list before the location
@@ -1006,16 +1191,34 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D)
        *  This operation is linear in the number of elements inserted and
        *  does not invalidate iterators and references.
        */
-      void
-      insert(iterator __p, initializer_list<value_type> __l)
-      { this->insert(__p, __l.begin(), __l.end()); }
+      iterator
+      insert(const_iterator __p, initializer_list<value_type> __l)
+      { return this->insert(__p, __l.begin(), __l.end()); }
 #endif
 
+#if __cplusplus >= 201103L
       /**
        *  @brief  Inserts a number of copies of given data into the %list.
-       *  @param  position  An iterator into the %list.
-       *  @param  n  Number of elements to be inserted.
-       *  @param  x  Data to be inserted.
+       *  @param  __position  A const_iterator into the %list.
+       *  @param  __n  Number of elements to be inserted.
+       *  @param  __x  Data to be inserted.
+       *  @return  An iterator pointing to the first element inserted
+       *           (or __position).
+       *
+       *  This function will insert a specified number of copies of the
+       *  given data before the location specified by @a position.
+       *
+       *  This operation is linear in the number of elements inserted and
+       *  does not invalidate iterators and references.
+       */
+      iterator
+      insert(const_iterator __position, size_type __n, const value_type& __x);
+#else
+      /**
+       *  @brief  Inserts a number of copies of given data into the %list.
+       *  @param  __position  An iterator into the %list.
+       *  @param  __n  Number of elements to be inserted.
+       *  @param  __x  Data to be inserted.
        *
        *  This function will insert a specified number of copies of the
        *  given data before the location specified by @a position.
@@ -1025,16 +1228,39 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D)
        */
       void
       insert(iterator __position, size_type __n, const value_type& __x)
-      {  
-       list __tmp(__n, __x, _M_get_Node_allocator());
+      {
+       list __tmp(__n, __x, get_allocator());
        splice(__position, __tmp);
       }
+#endif
 
+#if __cplusplus >= 201103L
+      /**
+       *  @brief  Inserts a range into the %list.
+       *  @param  __position  A const_iterator into the %list.
+       *  @param  __first  An input iterator.
+       *  @param  __last   An input iterator.
+       *  @return  An iterator pointing to the first element inserted
+       *           (or __position).
+       *
+       *  This function will insert copies of the data in the range [@a
+       *  first,@a last) into the %list before the location specified by
+       *  @a position.
+       *
+       *  This operation is linear in the number of elements inserted and
+       *  does not invalidate iterators and references.
+       */
+      template<typename _InputIterator,
+              typename = std::_RequireInputIter<_InputIterator>>
+       iterator
+       insert(const_iterator __position, _InputIterator __first,
+              _InputIterator __last);
+#else
       /**
        *  @brief  Inserts a range into the %list.
-       *  @param  position  An iterator into the %list.
-       *  @param  first  An input iterator.
-       *  @param  last   An input iterator.
+       *  @param  __position  An iterator into the %list.
+       *  @param  __first  An input iterator.
+       *  @param  __last   An input iterator.
        *
        *  This function will insert copies of the data in the range [@a
        *  first,@a last) into the %list before the location specified by
@@ -1048,13 +1274,14 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D)
         insert(iterator __position, _InputIterator __first,
               _InputIterator __last)
         {
-         list __tmp(__first, __last, _M_get_Node_allocator());
+         list __tmp(__first, __last, get_allocator());
          splice(__position, __tmp);
        }
+#endif
 
       /**
        *  @brief  Remove element at given position.
-       *  @param  position  Iterator pointing to element to be erased.
+       *  @param  __position  Iterator pointing to element to be erased.
        *  @return  An iterator pointing to the next element (or end()).
        *
        *  This function will erase the element at the given position and thus
@@ -1068,12 +1295,16 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D)
        *  any way.  Managing the pointer is the user's responsibility.
        */
       iterator
+#if __cplusplus >= 201103L
+      erase(const_iterator __position) noexcept;
+#else
       erase(iterator __position);
+#endif
 
       /**
        *  @brief  Remove a range of elements.
-       *  @param  first  Iterator pointing to the first element to be erased.
-       *  @param  last  Iterator pointing to one past the last element to be
+       *  @param  __first  Iterator pointing to the first element to be erased.
+       *  @param  __last  Iterator pointing to one past the last element to be
        *                erased.
        *  @return  An iterator pointing to the element pointed to by @a last
        *           prior to erasing (or end()).
@@ -1089,16 +1320,20 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D)
        *  is the user's responsibility.
        */
       iterator
+#if __cplusplus >= 201103L
+      erase(const_iterator __first, const_iterator __last) noexcept
+#else
       erase(iterator __first, iterator __last)
+#endif
       {
        while (__first != __last)
          __first = erase(__first);
-       return __last;
+       return __last._M_const_cast();
       }
 
       /**
        *  @brief  Swaps data with another %list.
-       *  @param  x  A %list of the same element and allocator types.
+       *  @param  __x  A %list of the same element and allocator types.
        *
        *  This exchanges the elements between two lists in constant
        *  time.  Note that the global std::swap() function is
@@ -1108,7 +1343,12 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D)
       void
       swap(list& __x)
       {
-       _List_node_base::swap(this->_M_impl._M_node, __x._M_impl._M_node);
+       __detail::_List_node_base::swap(this->_M_impl._M_node, 
+                                       __x._M_impl._M_node);
+
+       size_t __xsize = __x._M_get_size();
+       __x._M_set_size(this->_M_get_size());
+       this->_M_set_size(__xsize);
 
        // _GLIBCXX_RESOLVE_LIB_DEFECTS
        // 431. Swapping containers with unequal allocators.
@@ -1123,7 +1363,7 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D)
        *  Managing the pointer is the user's responsibility.
        */
       void
-      clear()
+      clear() _GLIBCXX_NOEXCEPT
       {
         _Base::_M_clear();
         _Base::_M_init();
@@ -1132,18 +1372,18 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D)
       // [23.2.2.4] list operations
       /**
        *  @brief  Insert contents of another %list.
-       *  @param  position  Iterator referencing the element to insert before.
-       *  @param  x  Source list.
+       *  @param  __position  Iterator referencing the element to insert before.
+       *  @param  __x  Source list.
        *
-       *  The elements of @a x are inserted in constant time in front of
-       *  the element referenced by @a position.  @a x becomes an empty
+       *  The elements of @a __x are inserted in constant time in front of
+       *  the element referenced by @a __position.  @a __x becomes an empty
        *  list.
        *
-       *  Requires this != @a x.
+       *  Requires this != @a __x.
        */
       void
-#ifdef __GXX_EXPERIMENTAL_CXX0X__
-      splice(iterator __position, list&& __x)
+#if __cplusplus >= 201103L
+      splice(const_iterator __position, list&& __x) noexcept
 #else
       splice(iterator __position, list& __x)
 #endif
@@ -1152,33 +1392,48 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D)
          {
            _M_check_equal_allocators(__x);
 
-           this->_M_transfer(__position, __x.begin(), __x.end());
+           this->_M_transfer(__position._M_const_cast(),
+                             __x.begin(), __x.end());
+
+           this->_M_inc_size(__x._M_get_size());
+           __x._M_set_size(0);
          }
       }
 
-#ifdef __GXX_EXPERIMENTAL_CXX0X__
+#if __cplusplus >= 201103L
       void
-      splice(iterator __position, list& __x)
+      splice(const_iterator __position, list& __x) noexcept
       { splice(__position, std::move(__x)); }
 #endif
 
+#if __cplusplus >= 201103L
       /**
        *  @brief  Insert element from another %list.
-       *  @param  position  Iterator referencing the element to insert before.
-       *  @param  x  Source list.
-       *  @param  i  Iterator referencing the element to move.
+       *  @param  __position  Const_iterator referencing the element to
+       *                      insert before.
+       *  @param  __x  Source list.
+       *  @param  __i  Const_iterator referencing the element to move.
        *
-       *  Removes the element in list @a x referenced by @a i and
-       *  inserts it into the current list before @a position.
+       *  Removes the element in list @a __x referenced by @a __i and
+       *  inserts it into the current list before @a __position.
        */
       void
-#ifdef __GXX_EXPERIMENTAL_CXX0X__
-      splice(iterator __position, list&& __x, iterator __i)
+      splice(const_iterator __position, list&& __x, const_iterator __i) noexcept
 #else
+      /**
+       *  @brief  Insert element from another %list.
+       *  @param  __position  Iterator referencing the element to insert before.
+       *  @param  __x  Source list.
+       *  @param  __i  Iterator referencing the element to move.
+       *
+       *  Removes the element in list @a __x referenced by @a __i and
+       *  inserts it into the current list before @a __position.
+       */
+      void
       splice(iterator __position, list& __x, iterator __i)
 #endif
       {
-       iterator __j = __i;
+       iterator __j = __i._M_const_cast();
        ++__j;
        if (__position == __i || __position == __j)
          return;
@@ -1186,32 +1441,60 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D)
        if (this != &__x)
          _M_check_equal_allocators(__x);
 
-       this->_M_transfer(__position, __i, __j);
+       this->_M_transfer(__position._M_const_cast(),
+                         __i._M_const_cast(), __j);
+
+       this->_M_inc_size(1);
+       __x._M_dec_size(1);
       }
 
-#ifdef __GXX_EXPERIMENTAL_CXX0X__
+#if __cplusplus >= 201103L
+      /**
+       *  @brief  Insert element from another %list.
+       *  @param  __position  Const_iterator referencing the element to
+       *                      insert before.
+       *  @param  __x  Source list.
+       *  @param  __i  Const_iterator referencing the element to move.
+       *
+       *  Removes the element in list @a __x referenced by @a __i and
+       *  inserts it into the current list before @a __position.
+       */
       void
-      splice(iterator __position, list& __x, iterator __i)
+      splice(const_iterator __position, list& __x, const_iterator __i) noexcept
       { splice(__position, std::move(__x), __i); }
 #endif
 
+#if __cplusplus >= 201103L
       /**
        *  @brief  Insert range from another %list.
-       *  @param  position  Iterator referencing the element to insert before.
-       *  @param  x  Source list.
-       *  @param  first  Iterator referencing the start of range in x.
-       *  @param  last  Iterator referencing the end of range in x.
+       *  @param  __position  Const_iterator referencing the element to
+       *                      insert before.
+       *  @param  __x  Source list.
+       *  @param  __first  Const_iterator referencing the start of range in x.
+       *  @param  __last  Const_iterator referencing the end of range in x.
        *
-       *  Removes elements in the range [first,last) and inserts them
-       *  before @a position in constant time.
+       *  Removes elements in the range [__first,__last) and inserts them
+       *  before @a __position in constant time.
        *
-       *  Undefined if @a position is in [first,last).
+       *  Undefined if @a __position is in [__first,__last).
        */
       void
-#ifdef __GXX_EXPERIMENTAL_CXX0X__
-      splice(iterator __position, list&& __x, iterator __first,
-            iterator __last)
+      splice(const_iterator __position, list&& __x, const_iterator __first,
+            const_iterator __last) noexcept
 #else
+      /**
+       *  @brief  Insert range from another %list.
+       *  @param  __position  Iterator referencing the element to insert before.
+       *  @param  __x  Source list.
+       *  @param  __first  Iterator referencing the start of range in x.
+       *  @param  __last  Iterator referencing the end of range in x.
+       *
+       *  Removes elements in the range [__first,__last) and inserts them
+       *  before @a __position in constant time.
+       *
+       *  Undefined if @a __position is in [__first,__last).
+       */
+      void
       splice(iterator __position, list& __x, iterator __first,
             iterator __last)
 #endif
@@ -1221,19 +1504,39 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D)
            if (this != &__x)
              _M_check_equal_allocators(__x);
 
-           this->_M_transfer(__position, __first, __last);
+           size_t __n = this->_M_distance(__first._M_node, __last._M_node);
+           this->_M_inc_size(__n);
+           __x._M_dec_size(__n);
+
+           this->_M_transfer(__position._M_const_cast(),
+                             __first._M_const_cast(),
+                             __last._M_const_cast());
          }
       }
 
-#ifdef __GXX_EXPERIMENTAL_CXX0X__
+#if __cplusplus >= 201103L
+      /**
+       *  @brief  Insert range from another %list.
+       *  @param  __position  Const_iterator referencing the element to
+       *                      insert before.
+       *  @param  __x  Source list.
+       *  @param  __first  Const_iterator referencing the start of range in x.
+       *  @param  __last  Const_iterator referencing the end of range in x.
+       *
+       *  Removes elements in the range [__first,__last) and inserts them
+       *  before @a __position in constant time.
+       *
+       *  Undefined if @a __position is in [__first,__last).
+       */
       void
-      splice(iterator __position, list& __x, iterator __first, iterator __last)
+      splice(const_iterator __position, list& __x, const_iterator __first,
+            const_iterator __last) noexcept
       { splice(__position, std::move(__x), __first, __last); }
 #endif
 
       /**
        *  @brief  Remove all elements equal to value.
-       *  @param  value  The value to remove.
+       *  @param  __value  The value to remove.
        *
        *  Removes every element in the list equal to @a value.
        *  Remaining elements stay in list order.  Note that this
@@ -1247,7 +1550,7 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D)
 
       /**
        *  @brief  Remove all elements satisfying a predicate.
-       *  @param  Predicate  Unary predicate function or object.
+       *  @tparam  _Predicate  Unary predicate function or object.
        *
        *  Removes every element in the list for which the predicate
        *  returns true.  Remaining elements stay in list order.  Note
@@ -1275,7 +1578,7 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D)
 
       /**
        *  @brief  Remove consecutive elements satisfying a predicate.
-       *  @param  BinaryPredicate  Binary predicate function or object.
+       *  @tparam _BinaryPredicate  Binary predicate function or object.
        *
        *  For each consecutive set of elements [first,last) that
        *  satisfy predicate(first,i) where i is an iterator in
@@ -1291,14 +1594,14 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D)
 
       /**
        *  @brief  Merge sorted lists.
-       *  @param  x  Sorted list to merge.
+       *  @param  __x  Sorted list to merge.
        *
-       *  Assumes that both @a x and this list are sorted according to
-       *  operator<().  Merges elements of @a x into this list in
-       *  sorted order, leaving @a x empty when complete.  Elements in
-       *  this list precede elements in @a x that are equal.
+       *  Assumes that both @a __x and this list are sorted according to
+       *  operator<().  Merges elements of @a __x into this list in
+       *  sorted order, leaving @a __x empty when complete.  Elements in
+       *  this list precede elements in @a __x that are equal.
        */
-#ifdef __GXX_EXPERIMENTAL_CXX0X__
+#if __cplusplus >= 201103L
       void
       merge(list&& __x);
 
@@ -1312,20 +1615,21 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D)
 
       /**
        *  @brief  Merge sorted lists according to comparison function.
-       *  @param  x  Sorted list to merge.
-       *  @param StrictWeakOrdering Comparison function defining
+       *  @tparam _StrictWeakOrdering Comparison function defining
        *  sort order.
+       *  @param  __x  Sorted list to merge.
+       *  @param  __comp  Comparison functor.
        *
-       *  Assumes that both @a x and this list are sorted according to
-       *  StrictWeakOrdering.  Merges elements of @a x into this list
-       *  in sorted order, leaving @a x empty when complete.  Elements
-       *  in this list precede elements in @a x that are equivalent
+       *  Assumes that both @a __x and this list are sorted according to
+       *  StrictWeakOrdering.  Merges elements of @a __x into this list
+       *  in sorted order, leaving @a __x empty when complete.  Elements
+       *  in this list precede elements in @a __x that are equivalent
        *  according to StrictWeakOrdering().
        */
-#ifdef __GXX_EXPERIMENTAL_CXX0X__
+#if __cplusplus >= 201103L
       template<typename _StrictWeakOrdering>
         void
-        merge(list&&, _StrictWeakOrdering);
+        merge(list&& __x, _StrictWeakOrdering __comp);
 
       template<typename _StrictWeakOrdering>
         void
@@ -1334,7 +1638,7 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D)
 #else
       template<typename _StrictWeakOrdering>
         void
-        merge(list&, _StrictWeakOrdering);
+        merge(list& __x, _StrictWeakOrdering __comp);
 #endif
 
       /**
@@ -1343,8 +1647,8 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D)
        *  Reverse the order of elements in the list in linear time.
        */
       void
-      reverse()
-      { this->_M_impl._M_node.reverse(); }
+      reverse() _GLIBCXX_NOEXCEPT
+      { this->_M_impl._M_node._M_reverse(); }
 
       /**
        *  @brief  Sort the elements.
@@ -1384,7 +1688,11 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D)
                               __false_type)
         {
          for (; __first != __last; ++__first)
+#if __cplusplus >= 201103L
+           emplace_back(*__first);
+#else
            push_back(*__first);
+#endif
        }
 
       // Called by list(n,v,a), and the range constructor when it turns out
@@ -1392,10 +1700,23 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D)
       void
       _M_fill_initialize(size_type __n, const value_type& __x)
       {
-       for (; __n > 0; --__n)
+       for (; __n; --__n)
          push_back(__x);
       }
 
+#if __cplusplus >= 201103L
+      // Called by list(n).
+      void
+      _M_default_initialize(size_type __n)
+      {
+       for (; __n; --__n)
+         emplace_back();
+      }
+
+      // Called by resize(sz).
+      void
+      _M_default_append(size_type __n);
+#endif
 
       // Internal assign functions follow.
 
@@ -1423,15 +1744,16 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D)
       // Moves the elements from [first,last) before position.
       void
       _M_transfer(iterator __position, iterator __first, iterator __last)
-      { __position._M_node->transfer(__first._M_node, __last._M_node); }
+      { __position._M_node->_M_transfer(__first._M_node, __last._M_node); }
 
       // Inserts new element at position given and with value given.
-#ifndef __GXX_EXPERIMENTAL_CXX0X__
+#if __cplusplus < 201103L
       void
       _M_insert(iterator __position, const value_type& __x)
       {
         _Node* __tmp = _M_create_node(__x);
-        __tmp->hook(__position._M_node);
+        __tmp->_M_hook(__position._M_node);
+       this->_M_inc_size(1);
       }
 #else
      template<typename... _Args>
@@ -1439,38 +1761,40 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D)
        _M_insert(iterator __position, _Args&&... __args)
        {
         _Node* __tmp = _M_create_node(std::forward<_Args>(__args)...);
-        __tmp->hook(__position._M_node);
+        __tmp->_M_hook(__position._M_node);
+        this->_M_inc_size(1);
        }
 #endif
 
       // Erases element at position given.
       void
-      _M_erase(iterator __position)
+      _M_erase(iterator __position) _GLIBCXX_NOEXCEPT
       {
-        __position._M_node->unhook();
+       this->_M_dec_size(1);
+        __position._M_node->_M_unhook();
         _Node* __n = static_cast<_Node*>(__position._M_node);
-#ifdef __GXX_EXPERIMENTAL_CXX0X__
+#if __cplusplus >= 201103L
         _M_get_Node_allocator().destroy(__n);
 #else
-       _M_get_Tp_allocator().destroy(&__n->_M_data);
+       _M_get_Tp_allocator().destroy(std::__addressof(__n->_M_data));
 #endif
         _M_put_node(__n);
       }
 
       // To implement the splice (and merge) bits of N1599.
       void
-      _M_check_equal_allocators(list& __x)
+      _M_check_equal_allocators(list& __x) _GLIBCXX_NOEXCEPT
       {
        if (std::__alloc_neq<typename _Base::_Node_alloc_type>::
            _S_do_it(_M_get_Node_allocator(), __x._M_get_Node_allocator()))
-         __throw_runtime_error(__N("list::_M_check_equal_allocators"));
+         __builtin_abort();
       }
     };
 
   /**
    *  @brief  List equality comparison.
-   *  @param  x  A %list.
-   *  @param  y  A %list of the same type as @a x.
+   *  @param  __x  A %list.
+   *  @param  __y  A %list of the same type as @a __x.
    *  @return  True iff the size and elements of the lists are equal.
    *
    *  This is an equivalence relation.  It is linear in the size of
@@ -1497,9 +1821,9 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D)
 
   /**
    *  @brief  List ordering relation.
-   *  @param  x  A %list.
-   *  @param  y  A %list of the same type as @a x.
-   *  @return  True iff @a x is lexicographically less than @a y.
+   *  @param  __x  A %list.
+   *  @param  __y  A %list of the same type as @a __x.
+   *  @return  True iff @a __x is lexicographically less than @a __y.
    *
    *  This is a total ordering relation.  It is linear in the size of the
    *  lists.  The elements must be comparable with @c <.
@@ -1542,6 +1866,7 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D)
     swap(list<_Tp, _Alloc>& __x, list<_Tp, _Alloc>& __y)
     { __x.swap(__y); }
 
-_GLIBCXX_END_NESTED_NAMESPACE
+_GLIBCXX_END_NAMESPACE_CONTAINER
+} // namespace std
 
 #endif /* _STL_LIST_H */