diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 4598181352456fda316c04a2d1ecf1d5cd837397..94a0ad485760a67383c06cdd52cb50f6913835d0 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,26 @@
+2012-07-02  Paolo Carlini  <paolo.carlini@oracle.com>
+
+	Revert:
+	2011-10-04  Paolo Carlini  <paolo.carlini@oracle.com>
+
+	PR libstdc++/49561
+	* include/bits/stl_list.h (_List_base<>::_List_impl::_M_size):
+	Add in C++0x mode.
+	(_List_base<>::_List_impl, _List_base<>::_M_get_node,
+	_List_base<>::_M_put_node, _List_base<>::_List_base(_List_base&&),
+	list<>::size, list<>::swap, list<>::splice): Use it.
+	(operator==(const list<>&, const list<>&)): Rewrite in C++0x mode.
+	* include/bits/list.tcc (list<>::erase): Likewise.
+	(list<>::merge): Adjust in C++0x mode.
+	* testsuite/23_containers/list/requirements/dr438/assign_neg.cc:
+	Adjust dg-error line number.
+	* testsuite/23_containers/list/requirements/dr438/insert_neg.cc:
+	Likewise.
+	* testsuite/23_containers/list/requirements/dr438/
+	constructor_1_neg.cc: Likewise.
+	* testsuite/23_containers/list/requirements/dr438/
+	constructor_2_neg.cc: Likewise.
+
 2012-06-27  Benjamin Kosnik  <bkoz@redhat.com>
 
 	* include/bits/c++config: Remove __regex nested namespace.
diff --git a/libstdc++-v3/include/bits/list.tcc b/libstdc++-v3/include/bits/list.tcc
index 55156bbf062d1ab6f2558fdd16e52acb8a71b801..727e82d3d8dda34e9094fd78511d4243902a76bb 100644
--- a/libstdc++-v3/include/bits/list.tcc
+++ b/libstdc++-v3/include/bits/list.tcc
@@ -1,7 +1,7 @@
 // List implementation (out of line) -*- C++ -*-
 
 // Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
-// 2011 Free Software Foundation, Inc.
+// 2011, 2012 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
@@ -139,14 +139,14 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
     list<_Tp, _Alloc>::
     resize(size_type __new_size)
     {
-      if (__new_size > size())
-	_M_default_append(__new_size - size());
-      else if (__new_size < size())
-	{
-	  iterator __i = begin();
-	  std::advance(__i, __new_size);
-	  erase(__i, end());
-	}
+      iterator __i = begin();
+      size_type __len = 0;
+      for (; __i != end() && __len < __new_size; ++__i, ++__len)
+        ;
+      if (__len == __new_size)
+        erase(__i, end());
+      else                          // __i == end()
+	_M_default_append(__new_size - __len);
     }
 
   template<typename _Tp, typename _Alloc>
@@ -154,14 +154,14 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
     list<_Tp, _Alloc>::
     resize(size_type __new_size, const value_type& __x)
     {
-      if (__new_size > size())
-	insert(end(), __new_size - size(), __x);
-      else if (__new_size < size())
-	{
-	  iterator __i = begin();
-	  std::advance(__i, __new_size);
-	  erase(__i, end());
-	}
+      iterator __i = begin();
+      size_type __len = 0;
+      for (; __i != end() && __len < __new_size; ++__i, ++__len)
+        ;
+      if (__len == __new_size)
+        erase(__i, end());
+      else                          // __i == end()
+        insert(end(), __new_size - __len, __x);
     }
 #else
   template<typename _Tp, typename _Alloc>
@@ -312,11 +312,6 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
 	      ++__first1;
 	  if (__first2 != __last2)
 	    _M_transfer(__last1, __first2, __last2);
-
-#ifdef __GXX_EXPERIMENTAL_CXX0X__
-	  this->_M_impl._M_size += __x.size();
-	  __x._M_impl._M_size = 0;
-#endif
 	}
     }
 
@@ -351,11 +346,6 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
 		++__first1;
 	    if (__first2 != __last2)
 	      _M_transfer(__last1, __first2, __last2);
-
-#ifdef __GXX_EXPERIMENTAL_CXX0X__
-	    this->_M_impl._M_size += __x.size();
-	    __x._M_impl._M_size = 0;
-#endif
 	  }
       }
 
diff --git a/libstdc++-v3/include/bits/stl_list.h b/libstdc++-v3/include/bits/stl_list.h
index b568cd701b07675d39730f0b3033097389a9bcbe..5fdaec91d17ccc0fa6b49b7fae10eef96301e00e 100644
--- a/libstdc++-v3/include/bits/stl_list.h
+++ b/libstdc++-v3/include/bits/stl_list.h
@@ -313,10 +313,6 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
       {
 	__detail::_List_node_base _M_node;
 
-#ifdef __GXX_EXPERIMENTAL_CXX0X__
-	size_t                    _M_size = 0;
-#endif
-
 	_List_impl()
 	: _Node_alloc_type(), _M_node()
 	{ }
@@ -336,23 +332,12 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
 
       _List_node<_Tp>*
       _M_get_node()
-      {
-	_List_node<_Tp>* __tmp = _M_impl._Node_alloc_type::allocate(1);
-#ifdef __GXX_EXPERIMENTAL_CXX0X__
-	++_M_impl._M_size;
-#endif	
-	return __tmp;
-      }
+      { return _M_impl._Node_alloc_type::allocate(1); }
 
       void
       _M_put_node(_List_node<_Tp>* __p)
-      {
-	_M_impl._Node_alloc_type::deallocate(__p, 1);
-#ifdef __GXX_EXPERIMENTAL_CXX0X__
-	--_M_impl._M_size;
-#endif
-      }
-      
+      { _M_impl._Node_alloc_type::deallocate(__p, 1); }
+
   public:
       typedef _Alloc allocator_type;
 
@@ -386,7 +371,6 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
       {
 	_M_init();
 	__detail::_List_node_base::swap(_M_impl._M_node, __x._M_impl._M_node);
-	std::swap(_M_impl._M_size, __x._M_impl._M_size);
       }
 #endif
 
@@ -888,13 +872,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
       /**  Returns the number of elements in the %list.  */
       size_type
       size() const _GLIBCXX_NOEXCEPT
-      {
-#ifdef __GXX_EXPERIMENTAL_CXX0X__
-	return this->_M_impl._M_size;
-#else
-	return std::distance(begin(), end());
-#endif
-      }
+      { return std::distance(begin(), end()); }
 
       /**  Returns the size() of the largest possible %list.  */
       size_type
@@ -1234,9 +1212,6 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
       {
 	__detail::_List_node_base::swap(this->_M_impl._M_node, 
 					__x._M_impl._M_node);
-#ifdef __GXX_EXPERIMENTAL_CXX0X__
-	std::swap(this->_M_impl._M_size, __x._M_impl._M_size);
-#endif
 
 	// _GLIBCXX_RESOLVE_LIB_DEFECTS
 	// 431. Swapping containers with unequal allocators.
@@ -1281,11 +1256,6 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
 	    _M_check_equal_allocators(__x);
 
 	    this->_M_transfer(__position, __x.begin(), __x.end());
-
-#ifdef __GXX_EXPERIMENTAL_CXX0X__
-	    this->_M_impl._M_size += __x.size();
-	    __x._M_impl._M_size = 0;
-#endif
 	  }
       }
 
@@ -1317,14 +1287,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
 	  return;
 
 	if (this != &__x)
-	  {
-	    _M_check_equal_allocators(__x);
-
-#ifdef __GXX_EXPERIMENTAL_CXX0X__
-	    ++this->_M_impl._M_size;
-	    --__x._M_impl._M_size;
-#endif
-	  }
+	  _M_check_equal_allocators(__x);
 
 	this->_M_transfer(__position, __i, __j);
       }
@@ -1359,15 +1322,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
 	if (__first != __last)
 	  {
 	    if (this != &__x)
-	      {
-		_M_check_equal_allocators(__x);
-
-#ifdef __GXX_EXPERIMENTAL_CXX0X__
-		const size_type __size = std::distance(__first, __last);
-		this->_M_impl._M_size += __size;
-		__x._M_impl._M_size -= __size;
-#endif
-	      }
+	      _M_check_equal_allocators(__x);
 
 	    this->_M_transfer(__position, __first, __last);
 	  }
@@ -1643,10 +1598,6 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
     inline bool
     operator==(const list<_Tp, _Alloc>& __x, const list<_Tp, _Alloc>& __y)
     {
-#ifdef __GXX_EXPERIMENTAL_CXX0X__
-      return (__x.size() == __y.size()
-	      && std::equal(__x.begin(), __x.end(), __y.begin()));
-#else
       typedef typename list<_Tp, _Alloc>::const_iterator const_iterator;
       const_iterator __end1 = __x.end();
       const_iterator __end2 = __y.end();
@@ -1659,7 +1610,6 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
 	  ++__i2;
 	}
       return __i1 == __end1 && __i2 == __end2;
-#endif
     }
 
   /**
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 65a6d41201463230d7b036d019fcad83e8ae6152..17af9cfe4d51e50cea7932951cfaf8fc442bccac 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 *-*-* } 1571 }
+// { dg-error "no matching" "" { target *-*-* } 1526 }
 
 #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 34caa3b5d2f47f156ac92ce85d5b062cee739819..cf303f9daeb19e3fd3fe5e48788b384de655a847 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 *-*-* } 1527 }
+// { dg-error "no matching" "" { target *-*-* } 1482 }
 
 #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 d1709c32ace5d4a7b968cdd07a8fc6a18d49a5b4..3e74bcfeb02c1946955a2c1aaaf2ae579da8b60c 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 *-*-* } 1527 }
+// { dg-error "no matching" "" { target *-*-* } 1482 }
 
 #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 2651f3b62ca68ad1b30f5da01fac225e6499f841..ac33bff79027e5657cf30f795ef25426e3ea4902 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 *-*-* } 1527 }
+// { dg-error "no matching" "" { target *-*-* } 1482 }
 
 #include <list>