diff mbox

[v3] Use noexcept in container' move constructors, etc

Message ID 4DE64A8B.3010309@oracle.com
State New
Headers show

Commit Message

Paolo Carlini June 1, 2011, 2:19 p.m. UTC
Hi

tested x86_64-linux, committed to mainline. Note: special case 
std::deque. I don't think we can really manage to have its 
move-constructor noexcept withing the current ABI... I'll look into it a 
bit more.

Thanks,
Paolo.

//////////////////////
2011-06-01  Paolo Carlini  <paolo.carlini@oracle.com>

	* include/bits/hashtable.h (_Hashtable<>::_Hashtable(_Hashtable&&)):
	Use std::move on the allocator, use noexcept.
	(_Hashtable<>::~_Hashtable): Use noexcept.
	* include/bits/stl_list.h: Likewise.
	* include/bits/forward_list.h: Likewise.
	* include/bits/stl_vector.h: Likewise.
	* include/bits/stl_bvector.h: Likewise.
	* include/bits/stl_map.h (map<>::map(map&&)): Use noexcept. 
	* include/bits/stl_set.h: Likewise.
	* include/bits/stl_multimap.h: Likewise.
	* include/bits/stl_multiset.h: Likewise.
	* include/bits/stl_tree.h (_Rb_tree<>::_Rb_tree(_Rb_tree&&)): Use
	std::move on the allocator.
	(_Rb_tree<>::~_Rb_tree): Use noexcept.
	* include/bits/stl_deque.h: Likewise.
	* include/bits/basic_string.h (basic_string<>::~basic_string): Use
	noexcept.
	* include/ext/vstring.h (__versa_string<>::~__versa_string): Likewise.
	* include/debug/set.h: Adjust.
	* include/debug/unordered_map: Likewise.
	* include/debug/multiset.h: Likewise.
	* include/debug/forward_list: Likewise.
	* include/debug/vector: Likewise.
	* include/debug/unordered_set: Likewise.
	* include/debug/deque: Likewise.
	* include/debug/map.h: Likewise.
	* include/debug/string: Likewise.
	* include/debug/list: Likewise.
	* include/debug/multimap.h: Likewise.
	* include/profile/set.h: Likewise.
	* include/profile/unordered_map: Likewise.
	* include/profile/multiset.h: Likewise.
	* include/profile/forward_list: Likewise.
	* include/profile/unordered_set: Likewise.
	* include/profile/vector: Likewise.
	* include/profile/deque: Likewise.
	* include/profile/map.h: Likewise.
	* include/profile/list: Likewise.
	* include/profile/multimap.h: Likewise.
	* testsuite/21_strings/basic_string/cons/wchar_t/
	noexcept_move_construct.cc: New.
	* testsuite/21_strings/basic_string/cons/char/
	noexcept_move_construct.cc: Likewise.
	* testsuite/ext/vstring/cons/noexcept_move_construct.cc: Likewise.
	* testsuite/23_containers/unordered_map/cons/
	noexcept_move_construct.cc: Likewise.
	* testsuite/23_containers/multimap/cons/
	noexcept_move_construct.cc: Likewise.
	* testsuite/23_containers/set/cons/
	noexcept_move_construct.cc: Likewise.
	* testsuite/23_containers/unordered_multimap/cons/
	noexcept_move_construct.cc: Likewise.
	* testsuite/23_containers/forward_list/cons/
	noexcept_move_construct.cc: Likewise.
	* testsuite/23_containers/unordered_set/cons/
	noexcept_move_construct.cc: Likewise.
	* testsuite/23_containers/vector/bool/cons/
	noexcept_move_construct.cc: Likewise.
	* testsuite/23_containers/vector/cons/
	noexcept_move_construct.cc: Likewise.
	* testsuite/23_containers/multiset/cons/
	noexcept_move_construct.cc: Likewise.
	* testsuite/23_containers/list/cons/
	noexcept_move_construct.cc: Likewise.
	* testsuite/23_containers/unordered_multiset/cons/
	noexcept_move_construct.cc: Likewise.
	* testsuite/23_containers/map/cons/noexcept_move_construct.cc
	* testsuite/23_containers/forward_list/requirements/dr438/
	assign_neg.cc: Adjust dg-error line numbers.
	* testsuite/23_containers/forward_list/requirements/dr438/
	insert_neg.cc: Likewise.
	* testsuite/23_containers/forward_list/requirements/dr438/
	constructor_1_neg.cc: Likewise.
	* testsuite/23_containers/forward_list/requirements/dr438/
	constructor_2_neg.cc: Likewise.
	* testsuite/23_containers/vector/requirements/dr438/
	assign_neg.cc: Likewise.
	* testsuite/23_containers/vector/requirements/dr438/
	insert_neg.cc: Likewise.
	* testsuite/23_containers/vector/requirements/dr438/
	constructor_1_neg.cc: Likewise.
	* testsuite/23_containers/vector/requirements/dr438/
	constructor_2_neg.cc: Likewise.
	* testsuite/23_containers/deque/requirements/dr438/
	assign_neg.cc: Likewise.
	* testsuite/23_containers/deque/requirements/dr438/
	insert_neg.cc: Likewise.
	* testsuite/23_containers/deque/requirements/dr438/
	constructor_1_neg.cc: Likewise.
	* testsuite/23_containers/deque/requirements/dr438/
	constructor_2_neg.cc: Likewise.
	* testsuite/23_containers/list/requirements/dr438/
	assign_neg.cc: Likewise.
	* 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.

	* include/bits/move.h (swap): Use __and_ in the noexcept.
	* include/bits/algorithmfwd.h: Adjust.
diff mbox

Patch

Index: include/debug/set.h
===================================================================
--- include/debug/set.h	(revision 174521)
+++ include/debug/set.h	(working copy)
@@ -1,6 +1,6 @@ 
 // Debugging set implementation -*- C++ -*-
 
-// Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
+// Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
 // Free Software Foundation, Inc.
 //
 // This file is part of the GNU ISO C++ Library.  This library is free
@@ -95,6 +95,7 @@ 
 
 #ifdef __GXX_EXPERIMENTAL_CXX0X__
       set(set&& __x)
+      noexcept(is_nothrow_copy_constructible<_Compare>::value)
       : _Base(std::move(__x)), _Safe_base()
       { this->_M_swap(__x); }
 
@@ -104,7 +105,7 @@ 
       : _Base(__l, __comp, __a), _Safe_base() { }
 #endif
 
-      ~set() { }
+      ~set() _GLIBCXX_NOEXCEPT { }
 
       set&
       operator=(const set& __x)
Index: include/debug/unordered_map
===================================================================
--- include/debug/unordered_map	(revision 174521)
+++ include/debug/unordered_map	(working copy)
@@ -1,6 +1,6 @@ 
 // Debugging unordered_map/unordered_multimap implementation -*- C++ -*-
 
-// Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
+// Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
 // Free Software Foundation, Inc.
 //
 // This file is part of the GNU ISO C++ Library.  This library is free
@@ -98,6 +98,8 @@ 
       : _Base(__x), _Safe_base() { }
 
       unordered_map(unordered_map&& __x)
+      noexcept(__and_<is_nothrow_copy_constructible<_Hash>,
+	              is_nothrow_copy_constructible<_Pred>>::value)
       : _Base(std::move(__x)), _Safe_base() { }
 
       unordered_map(initializer_list<value_type> __l,
@@ -107,6 +109,8 @@ 
 		    const allocator_type& __a = allocator_type())
       : _Base(__l, __n, __hf, __eql, __a), _Safe_base() { }
 
+      ~unordered_map() noexcept { }
+
       unordered_map&
       operator=(const unordered_map& __x)
       {
@@ -385,7 +389,9 @@ 
       unordered_multimap(const _Base& __x) 
       : _Base(__x), _Safe_base() { }
 
-      unordered_multimap(unordered_multimap&& __x) 
+      unordered_multimap(unordered_multimap&& __x)
+      noexcept(__and_<is_nothrow_copy_constructible<_Hash>,
+	              is_nothrow_copy_constructible<_Pred>>::value)
       : _Base(std::move(__x)), _Safe_base() { }
 
       unordered_multimap(initializer_list<value_type> __l,
@@ -395,6 +401,8 @@ 
 			 const allocator_type& __a = allocator_type())
       : _Base(__l, __n, __hf, __eql, __a), _Safe_base() { }
 
+      ~unordered_multimap() noexcept { }
+
       unordered_multimap&
       operator=(const unordered_multimap& __x)
       {
Index: include/debug/multiset.h
===================================================================
--- include/debug/multiset.h	(revision 174521)
+++ include/debug/multiset.h	(working copy)
@@ -95,6 +95,7 @@ 
 
 #ifdef __GXX_EXPERIMENTAL_CXX0X__
       multiset(multiset&& __x)
+      noexcept(is_nothrow_copy_constructible<_Compare>::value)
       : _Base(std::move(__x)), _Safe_base()
       { this->_M_swap(__x); }
 
@@ -104,7 +105,7 @@ 
       : _Base(__l, __comp, __a), _Safe_base() { }
 #endif
 
-      ~multiset() { }
+      ~multiset() _GLIBCXX_NOEXCEPT { }
 
       multiset&
       operator=(const multiset& __x)
Index: include/debug/forward_list
===================================================================
--- include/debug/forward_list	(revision 174521)
+++ include/debug/forward_list	(working copy)
@@ -104,7 +104,7 @@ 
       : _Base(__list)
       { }
 
-      forward_list(forward_list&& __list)
+      forward_list(forward_list&& __list) noexcept
       : _Base(std::move(__list._M_base()))
       {
 	this->_M_swap(__list);
@@ -115,7 +115,7 @@ 
       : _Base(__il, __al)
       { }
 
-      ~forward_list()
+      ~forward_list() noexcept
       { }
 
       forward_list&
Index: include/debug/vector
===================================================================
--- include/debug/vector	(revision 174521)
+++ include/debug/vector	(working copy)
@@ -109,7 +109,7 @@ 
       : _Base(__x), _Safe_base(), _M_guaranteed_capacity(__x.size()) { }
 
 #ifdef __GXX_EXPERIMENTAL_CXX0X__
-      vector(vector&& __x)
+      vector(vector&& __x) noexcept
       : _Base(std::move(__x)), _Safe_base(),
 	_M_guaranteed_capacity(this->size())
       {
@@ -123,7 +123,7 @@ 
 	_M_guaranteed_capacity(__l.size()) { }
 #endif
 
-      ~vector() { }
+      ~vector() _GLIBCXX_NOEXCEPT { }
 
       vector&
       operator=(const vector& __x)
Index: include/debug/unordered_set
===================================================================
--- include/debug/unordered_set	(revision 174521)
+++ include/debug/unordered_set	(working copy)
@@ -97,7 +97,9 @@ 
       unordered_set(const _Base& __x) 
       : _Base(__x), _Safe_base() { }
 
-      unordered_set(unordered_set&& __x) 
+      unordered_set(unordered_set&& __x)
+      noexcept(__and_<is_nothrow_copy_constructible<_Hash>,
+	              is_nothrow_copy_constructible<_Pred>>::value)
       : _Base(std::move(__x)), _Safe_base() { }
 
       unordered_set(initializer_list<value_type> __l,
@@ -107,6 +109,8 @@ 
 		    const allocator_type& __a = allocator_type())
       : _Base(__l, __n, __hf, __eql, __a), _Safe_base() { }
 
+      ~unordered_set() noexcept { }
+
       unordered_set&
       operator=(const unordered_set& __x)
       {
@@ -374,7 +378,9 @@ 
       unordered_multiset(const _Base& __x) 
       : _Base(__x), _Safe_base() { }
 
-      unordered_multiset(unordered_multiset&& __x) 
+      unordered_multiset(unordered_multiset&& __x)
+      noexcept(__and_<is_nothrow_copy_constructible<_Hash>,
+	              is_nothrow_copy_constructible<_Pred>>::value)
       : _Base(std::move(__x)), _Safe_base() { }
 
       unordered_multiset(initializer_list<value_type> __l,
@@ -384,6 +390,8 @@ 
 			 const allocator_type& __a = allocator_type())
       : _Base(__l, __n, __hf, __eql, __a), _Safe_base() { }
 
+      ~unordered_multiset() noexcept { }
+
       unordered_multiset&
       operator=(const unordered_multiset& __x)
       {
Index: include/debug/deque
===================================================================
--- include/debug/deque	(revision 174521)
+++ include/debug/deque	(working copy)
@@ -113,7 +113,7 @@ 
       : _Base(__l, __a), _Safe_base() { }
 #endif
 
-      ~deque() { }
+      ~deque() _GLIBCXX_NOEXCEPT { }
 
       deque&
       operator=(const deque& __x)
Index: include/debug/map.h
===================================================================
--- include/debug/map.h	(revision 174521)
+++ include/debug/map.h	(working copy)
@@ -95,6 +95,7 @@ 
 
 #ifdef __GXX_EXPERIMENTAL_CXX0X__
       map(map&& __x)
+      noexcept(is_nothrow_copy_constructible<_Compare>::value)
       : _Base(std::move(__x)), _Safe_base()
       { this->_M_swap(__x); }
 
@@ -104,7 +105,7 @@ 
       : _Base(__l, __c, __a), _Safe_base() { }
 #endif
 
-      ~map() { }
+      ~map() _GLIBCXX_NOEXCEPT { }
 
       map&
       operator=(const map& __x)
Index: include/debug/string
===================================================================
--- include/debug/string	(revision 174521)
+++ include/debug/string	(working copy)
@@ -124,7 +124,7 @@ 
     { }
 #endif // __GXX_EXPERIMENTAL_CXX0X__
 
-    ~basic_string() { }
+    ~basic_string() _GLIBCXX_NOEXCEPT { }
 
     basic_string&
     operator=(const basic_string& __str)
Index: include/debug/list
===================================================================
--- include/debug/list	(revision 174521)
+++ include/debug/list	(working copy)
@@ -106,7 +106,7 @@ 
       : _Base(__x), _Safe_base() { }
 
 #ifdef __GXX_EXPERIMENTAL_CXX0X__
-      list(list&& __x)
+      list(list&& __x) noexcept
       : _Base(std::move(__x)), _Safe_base()
       { this->_M_swap(__x); }
 
@@ -115,7 +115,7 @@ 
         : _Base(__l, __a), _Safe_base() { }
 #endif
 
-      ~list() { }
+      ~list() _GLIBCXX_NOEXCEPT { }
 
       list&
       operator=(const list& __x)
Index: include/debug/multimap.h
===================================================================
--- include/debug/multimap.h	(revision 174521)
+++ include/debug/multimap.h	(working copy)
@@ -96,6 +96,7 @@ 
 
 #ifdef __GXX_EXPERIMENTAL_CXX0X__
       multimap(multimap&& __x)
+      noexcept(is_nothrow_copy_constructible<_Compare>::value)
       : _Base(std::move(__x)), _Safe_base()
       { this->_M_swap(__x); }
 
@@ -105,7 +106,7 @@ 
       : _Base(__l, __c, __a), _Safe_base() { }
 #endif
 
-      ~multimap() { }
+      ~multimap() _GLIBCXX_NOEXCEPT { }
 
       multimap&
       operator=(const multimap& __x)
Index: include/profile/set.h
===================================================================
--- include/profile/set.h	(revision 174521)
+++ include/profile/set.h	(working copy)
@@ -82,6 +82,7 @@ 
 
 #ifdef __GXX_EXPERIMENTAL_CXX0X__
       set(set&& __x)
+      noexcept(is_nothrow_copy_constructible<_Compare>::value)
       : _Base(std::move(__x))
       { }
 
@@ -91,7 +92,7 @@ 
       : _Base(__l, __comp, __a) { }
 #endif
 
-      ~set() { }
+      ~set() _GLIBCXX_NOEXCEPT { }
 
       set&
       operator=(const set& __x)
Index: include/profile/unordered_map
===================================================================
--- include/profile/unordered_map	(revision 174521)
+++ include/profile/unordered_map	(working copy)
@@ -104,6 +104,8 @@ 
       }
 
       unordered_map(unordered_map&& __x)
+      noexcept(__and_<is_nothrow_copy_constructible<_Hash>,
+	              is_nothrow_copy_constructible<_Pred>>::value)
       : _Base(std::move(__x)) 
       {
         __profcxx_hashtable_construct(this, _Base::bucket_count());
@@ -142,7 +144,7 @@ 
 	return *this;
       }
 
-      ~unordered_map()
+      ~unordered_map() noexcept
       {
         __profcxx_hashtable_destruct(this, _Base::bucket_count(),
 				     _Base::size());
@@ -372,6 +374,8 @@ 
       }
 
       unordered_multimap(unordered_multimap&& __x)
+      noexcept(__and_<is_nothrow_copy_constructible<_Hash>,
+	              is_nothrow_copy_constructible<_Pred>>::value)
       : _Base(std::move(__x))
       {
         __profcxx_hashtable_construct(this, _Base::bucket_count());
@@ -409,7 +413,7 @@ 
 	return *this;
       }
 
-      ~unordered_multimap()
+      ~unordered_multimap() noexcept
       {
         __profcxx_hashtable_destruct(this, _Base::bucket_count(), 
 				     _Base::size());
Index: include/profile/multiset.h
===================================================================
--- include/profile/multiset.h	(revision 174521)
+++ include/profile/multiset.h	(working copy)
@@ -82,6 +82,7 @@ 
 
 #ifdef __GXX_EXPERIMENTAL_CXX0X__
       multiset(multiset&& __x)
+      noexcept(is_nothrow_copy_constructible<_Compare>::value)
       : _Base(std::move(__x))
       { }
 
@@ -91,7 +92,7 @@ 
       : _Base(__l, __comp, __a) { }
 #endif
 
-      ~multiset() { }
+      ~multiset() _GLIBCXX_NOEXCEPT { }
 
       multiset&
       operator=(const multiset& __x)
Index: include/profile/forward_list
===================================================================
--- include/profile/forward_list	(revision 174521)
+++ include/profile/forward_list	(working copy)
@@ -83,7 +83,7 @@ 
       : _Base(__list)
       { }
 
-      forward_list(forward_list&& __list)
+      forward_list(forward_list&& __list) noexcept
       : _Base(std::move(__list)) { }
 
       forward_list(std::initializer_list<_Tp> __il,
@@ -91,7 +91,7 @@ 
       : _Base(__il, __al)
       { }
 
-      ~forward_list()
+      ~forward_list() noexcept
       { }
 
       forward_list&
Index: include/profile/unordered_set
===================================================================
--- include/profile/unordered_set	(revision 174521)
+++ include/profile/unordered_set	(working copy)
@@ -103,6 +103,8 @@ 
       }
 
       unordered_set(unordered_set&& __x)
+      noexcept(__and_<is_nothrow_copy_constructible<_Hash>,
+	              is_nothrow_copy_constructible<_Pred>>::value)
       : _Base(std::move(__x)) 
       { 
         __profcxx_hashtable_construct(this, _Base::bucket_count());
@@ -141,7 +143,7 @@ 
 	return *this;
       }
 
-      ~unordered_set()
+      ~unordered_set() noexcept
       {
         __profcxx_hashtable_destruct(this, _Base::bucket_count(), 
                                      _Base::size());
@@ -346,6 +348,8 @@ 
       }
 
       unordered_multiset(unordered_multiset&& __x)
+      noexcept(__and_<is_nothrow_copy_constructible<_Hash>,
+	              is_nothrow_copy_constructible<_Pred>>::value)
       : _Base(std::move(__x))
       {
         __profcxx_hashtable_construct(this, _Base::bucket_count());
@@ -383,7 +387,7 @@ 
 	return *this;
       }
 
-      ~unordered_multiset()
+      ~unordered_multiset() noexcept
       {
         __profcxx_hashtable_destruct(this, _Base::bucket_count(), 
                                      _Base::size());
Index: include/profile/vector
===================================================================
--- include/profile/vector	(revision 174521)
+++ include/profile/vector	(working copy)
@@ -79,7 +79,7 @@ 
       explicit
       vector(const _Allocator& __a = _Allocator())
       : _Base(__a)
-      { 
+      {
         __profcxx_vector_construct(this, this->capacity());
         __profcxx_vector_construct2(this);
       }
@@ -87,8 +87,8 @@ 
 #ifdef __GXX_EXPERIMENTAL_CXX0X__
       explicit
       vector(size_type __n)
-      :  _Base(__n)
-      { 
+      : _Base(__n)
+      {
         __profcxx_vector_construct(this, this->capacity());
         __profcxx_vector_construct2(this);
       }
@@ -96,7 +96,7 @@ 
       vector(size_type __n, const _Tp& __value,
 	     const _Allocator& __a = _Allocator())
       :  _Base(__n, __value, __a)
-      { 
+      {
         __profcxx_vector_construct(this, this->capacity());
         __profcxx_vector_construct2(this);
       }
@@ -104,8 +104,8 @@ 
       explicit
       vector(size_type __n, const _Tp& __value = _Tp(),
 	     const _Allocator& __a = _Allocator())
-      :  _Base(__n, __value, __a)
-      { 
+      : _Base(__n, __value, __a)
+      {
         __profcxx_vector_construct(this, this->capacity());
         __profcxx_vector_construct2(this);
       }
@@ -115,14 +115,14 @@ 
         vector(_InputIterator __first, _InputIterator __last,
 	       const _Allocator& __a = _Allocator())
 	: _Base(__first, __last, __a)
-      { 
-        __profcxx_vector_construct(this, this->capacity());
-        __profcxx_vector_construct2(this);
-      }
+        {
+	  __profcxx_vector_construct(this, this->capacity());
+	  __profcxx_vector_construct2(this);
+	}
 
       vector(const vector& __x)
       : _Base(__x) 
-      { 
+      {
         __profcxx_vector_construct(this, this->capacity());
         __profcxx_vector_construct2(this);
       }
@@ -136,7 +136,7 @@ 
       }
 
 #ifdef __GXX_EXPERIMENTAL_CXX0X__
-      vector(vector&& __x)
+      vector(vector&& __x) noexcept
       : _Base(std::move(__x))
       {
         __profcxx_vector_construct(this, this->capacity());
@@ -148,7 +148,7 @@ 
       : _Base(__l, __a) { }
 #endif
 
-      ~vector()
+      ~vector() _GLIBCXX_NOEXCEPT
       {
         __profcxx_vector_destruct(this, this->capacity(), this->size());
         __profcxx_vector_destruct2(this);
Index: include/profile/deque
===================================================================
--- include/profile/deque	(revision 174521)
+++ include/profile/deque	(working copy)
@@ -101,7 +101,7 @@ 
       : _Base(__l, __a) { }
 #endif
 
-      ~deque() { }
+      ~deque() _GLIBCXX_NOEXCEPT { }
 
       deque&
       operator=(const deque& __x)
Index: include/profile/map.h
===================================================================
--- include/profile/map.h	(revision 174521)
+++ include/profile/map.h	(working copy)
@@ -92,6 +92,7 @@ 
 
 #ifdef __GXX_EXPERIMENTAL_CXX0X__
       map(map&& __x)
+      noexcept(is_nothrow_copy_constructible<_Compare>::value)
       : _Base(std::move(__x))
       { }
 
@@ -101,7 +102,7 @@ 
       : _Base(__l, __c, __a) { }
 #endif
 
-      ~map()
+      ~map() _GLIBCXX_NOEXCEPT
       { __profcxx_map_to_unordered_map_destruct(this); }
 
       map&
Index: include/profile/list
===================================================================
--- include/profile/list	(revision 174521)
+++ include/profile/list	(working copy)
@@ -67,7 +67,7 @@ 
       explicit
       list(const _Allocator& __a = _Allocator())
       : _Base(__a) 
-      { 
+      {
         __profcxx_list_construct(this); 	// list2slist
         __profcxx_list_construct2(this); 	// list2vector
       }
@@ -76,7 +76,7 @@ 
       explicit
       list(size_type __n)
       : _Base(__n) 
-      { 
+      {
         __profcxx_list_construct(this); 
         __profcxx_list_construct2(this); 
       }
@@ -84,7 +84,7 @@ 
       list(size_type __n, const _Tp& __value,
 	   const _Allocator& __a = _Allocator())
       : _Base(__n, __value, __a) 
-      { 
+      {
         __profcxx_list_construct(this); 
         __profcxx_list_construct2(this); 
       }
@@ -93,7 +93,7 @@ 
       list(size_type __n, const _Tp& __value = _Tp(),
 	   const _Allocator& __a = _Allocator())
       : _Base(__n, __value, __a) 
-      { 
+      {
         __profcxx_list_construct(this); 
         __profcxx_list_construct2(this); 
       }
@@ -103,29 +103,29 @@ 
       list(_InputIterator __first, _InputIterator __last,
 	   const _Allocator& __a = _Allocator())
       : _Base(__first, __last, __a)
-      {	 
+      {
         __profcxx_list_construct(this); 
         __profcxx_list_construct2(this); 
       }
 
       list(const list& __x)
       : _Base(__x) 
-      { 
+      {
         __profcxx_list_construct(this); 
         __profcxx_list_construct2(this); 
       }
 
       list(const _Base& __x)
       : _Base(__x) 
-      { 	
+      {
         __profcxx_list_construct(this); 
         __profcxx_list_construct2(this); 
       }
 
 #ifdef __GXX_EXPERIMENTAL_CXX0X__
-      list(list&& __x)
+      list(list&& __x) noexcept
       : _Base(std::move(__x))
-      { 
+      {
         __profcxx_list_construct(this); 
         __profcxx_list_construct2(this); 
       }
@@ -135,7 +135,7 @@ 
         : _Base(__l, __a) { }
 #endif
 
-      ~list()
+      ~list() _GLIBCXX_NOEXCEPT
       { 
         __profcxx_list_destruct(this); 
         __profcxx_list_destruct2(this); 
Index: include/profile/multimap.h
===================================================================
--- include/profile/multimap.h	(revision 174521)
+++ include/profile/multimap.h	(working copy)
@@ -82,6 +82,7 @@ 
 
 #ifdef __GXX_EXPERIMENTAL_CXX0X__
       multimap(multimap&& __x)
+      noexcept(is_nothrow_copy_constructible<_Compare>::value)
       : _Base(std::move(__x))
       { }
 
@@ -91,7 +92,7 @@ 
       : _Base(__l, __c, __a) { }
 #endif
 
-      ~multimap() { }
+      ~multimap() _GLIBCXX_NOEXCEPT { }
 
       multimap&
       operator=(const multimap& __x)
Index: include/ext/vstring.h
===================================================================
--- include/ext/vstring.h	(revision 174521)
+++ include/ext/vstring.h	(working copy)
@@ -243,7 +243,7 @@ 
       /**
        *  @brief  Destroy the string instance.
        */
-      ~__versa_string() { }	
+      ~__versa_string() _GLIBCXX_NOEXCEPT { }	
 
       /**
        *  @brief  Assign the value of @a str to this string.
Index: include/bits/hashtable.h
===================================================================
--- include/bits/hashtable.h	(revision 174521)
+++ include/bits/hashtable.h	(working copy)
@@ -213,8 +213,10 @@ 
 
       _Hashtable(const _Hashtable&);
 
-      _Hashtable(_Hashtable&&);
-
+      _Hashtable(_Hashtable&&)
+      noexcept(__and_<is_nothrow_copy_constructible<_Equal>,
+	              is_nothrow_copy_constructible<_H1>>::value);
+ 
       _Hashtable&
       operator=(const _Hashtable& __ht)
       {
@@ -233,7 +235,7 @@ 
 	return *this;
       }
 
-      ~_Hashtable();
+      ~_Hashtable() noexcept;
 
       void swap(_Hashtable&);
 
@@ -672,11 +674,13 @@ 
     _Hashtable<_Key, _Value, _Allocator, _ExtractKey, _Equal,
 	       _H1, _H2, _Hash, _RehashPolicy, __chc, __cit, __uk>::
     _Hashtable(_Hashtable&& __ht)
+    noexcept(__and_<is_nothrow_copy_constructible<_Equal>,
+	            is_nothrow_copy_constructible<_H1>>::value)
     : __detail::_Rehash_base<_RehashPolicy, _Hashtable>(__ht),
       __detail::_Hash_code_base<_Key, _Value, _ExtractKey, _Equal,
 				_H1, _H2, _Hash, __chc>(__ht),
       __detail::_Map_base<_Key, _Value, _ExtractKey, __uk, _Hashtable>(__ht),
-      _M_node_allocator(__ht._M_node_allocator),
+      _M_node_allocator(std::move(__ht._M_node_allocator)),
       _M_buckets(__ht._M_buckets),
       _M_bucket_count(__ht._M_bucket_count),
       _M_begin_bucket_index(__ht._M_begin_bucket_index),
@@ -697,7 +701,7 @@ 
 	   bool __chc, bool __cit, bool __uk>
     _Hashtable<_Key, _Value, _Allocator, _ExtractKey, _Equal,
 	       _H1, _H2, _Hash, _RehashPolicy, __chc, __cit, __uk>::
-    ~_Hashtable()
+    ~_Hashtable() noexcept
     {
       clear();
       _M_deallocate_buckets(_M_buckets, _M_bucket_count);
Index: include/bits/stl_list.h
===================================================================
--- include/bits/stl_list.h	(revision 174521)
+++ include/bits/stl_list.h	(working copy)
@@ -318,6 +318,12 @@ 
 	_List_impl(const _Node_alloc_type& __a)
 	: _Node_alloc_type(__a), _M_node()
 	{ }
+
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+	_List_impl(_Node_alloc_type&& __a)
+	: _Node_alloc_type(std::move(__a)), _M_node()
+	{ }
+#endif
       };
 
       _List_impl _M_impl;
@@ -359,7 +365,7 @@ 
 
 #ifdef __GXX_EXPERIMENTAL_CXX0X__
       _List_base(_List_base&& __x)
-      : _M_impl(__x._M_get_Node_allocator())
+      : _M_impl(std::move(__x._M_get_Node_allocator()))
       {
 	_M_init();
 	__detail::_List_node_base::swap(this->_M_impl._M_node, 
@@ -368,7 +374,7 @@ 
 #endif
 
       // This is what actually destroys the list.
-      ~_List_base()
+      ~_List_base() _GLIBCXX_NOEXCEPT
       { _M_clear(); }
 
       void
@@ -580,7 +586,7 @@ 
        *  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)
+      list(list&& __x) noexcept
       : _Base(std::move(__x)) { }
 
       /**
Index: include/bits/stl_map.h
===================================================================
--- include/bits/stl_map.h	(revision 174521)
+++ include/bits/stl_map.h	(working copy)
@@ -181,6 +181,7 @@ 
        *  The contents of @a x are a valid, but unspecified %map.
        */
       map(map&& __x)
+      noexcept(is_nothrow_copy_constructible<_Compare>::value)
       : _M_t(std::move(__x._M_t)) { }
 
       /**
Index: include/bits/stl_set.h
===================================================================
--- include/bits/stl_set.h	(revision 174521)
+++ include/bits/stl_set.h	(working copy)
@@ -199,6 +199,7 @@ 
        *  The contents of @a x are a valid, but unspecified %set.
        */
       set(set&& __x)
+      noexcept(is_nothrow_copy_constructible<_Compare>::value)
       : _M_t(std::move(__x._M_t)) { }
 
       /**
Index: include/bits/forward_list.h
===================================================================
--- include/bits/forward_list.h	(revision 174521)
+++ include/bits/forward_list.h	(working copy)
@@ -290,6 +290,10 @@ 
         _Fwd_list_impl(const _Node_alloc_type& __a)
         : _Node_alloc_type(__a), _M_head()
         { }
+
+        _Fwd_list_impl(_Node_alloc_type&& __a)
+	: _Node_alloc_type(std::move(__a)), _M_head()
+        { }
       };
 
       _Fwd_list_impl _M_impl;
@@ -323,7 +327,7 @@ 
       }
 
       _Fwd_list_base(_Fwd_list_base&& __lst)
-      : _M_impl(__lst._M_get_Node_allocator())
+      : _M_impl(std::move(__lst._M_get_Node_allocator()))
       {
 	this->_M_impl._M_head._M_next = __lst._M_impl._M_head._M_next;
 	__lst._M_impl._M_head._M_next = 0;
@@ -523,7 +527,7 @@ 
        *  forward_list. The contents of @a list are a valid, but unspecified
        *  %forward_list.
        */
-      forward_list(forward_list&& __list)
+      forward_list(forward_list&& __list) noexcept
       : _Base(std::move(__list)) { }
 
       /**
@@ -542,7 +546,7 @@ 
       /**
        *  @brief  The forward_list dtor.
        */
-      ~forward_list()
+      ~forward_list() noexcept
       { }
 
       /**
Index: include/bits/move.h
===================================================================
--- include/bits/move.h	(revision 174521)
+++ include/bits/move.h	(working copy)
@@ -136,8 +136,8 @@ 
     inline void
     swap(_Tp& __a, _Tp& __b)
 #ifdef __GXX_EXPERIMENTAL_CXX0X__
-    noexcept(is_nothrow_move_constructible<_Tp>::value
-	     && is_nothrow_move_assignable<_Tp>::value)
+    noexcept(__and_<is_nothrow_move_constructible<_Tp>,
+	            is_nothrow_move_assignable<_Tp>>::value)
 #endif
     {
       // concept requirements
Index: include/bits/basic_string.h
===================================================================
--- include/bits/basic_string.h	(revision 174521)
+++ include/bits/basic_string.h	(working copy)
@@ -530,7 +530,7 @@ 
       /**
        *  @brief  Destroy the string instance.
        */
-      ~basic_string()
+      ~basic_string() _GLIBCXX_NOEXCEPT
       { _M_rep()->_M_dispose(this->get_allocator()); }
 
       /**
Index: include/bits/stl_multimap.h
===================================================================
--- include/bits/stl_multimap.h	(revision 174521)
+++ include/bits/stl_multimap.h	(working copy)
@@ -179,6 +179,7 @@ 
        *  The contents of @a x are a valid, but unspecified %multimap.
        */
       multimap(multimap&& __x)
+      noexcept(is_nothrow_copy_constructible<_Compare>::value)
       : _M_t(std::move(__x._M_t)) { }
 
       /**
Index: include/bits/stl_vector.h
===================================================================
--- include/bits/stl_vector.h	(revision 174521)
+++ include/bits/stl_vector.h	(working copy)
@@ -86,6 +86,13 @@ 
 	_Vector_impl(_Tp_alloc_type const& __a)
 	: _Tp_alloc_type(__a), _M_start(0), _M_finish(0), _M_end_of_storage(0)
 	{ }
+
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+	_Vector_impl(_Tp_alloc_type&& __a)
+	: _Tp_alloc_type(std::move(__a)),
+	  _M_start(0), _M_finish(0), _M_end_of_storage(0)
+	{ }
+#endif
       };
       
     public:
@@ -127,7 +134,7 @@ 
 
 #ifdef __GXX_EXPERIMENTAL_CXX0X__
       _Vector_base(_Vector_base&& __x)
-      : _M_impl(__x._M_get_Tp_allocator())
+      : _M_impl(std::move(__x._M_get_Tp_allocator()))
       {
 	this->_M_impl._M_start = __x._M_impl._M_start;
 	this->_M_impl._M_finish = __x._M_impl._M_finish;
@@ -291,7 +298,7 @@ 
        *  The newly-created %vector contains the exact contents of @a x.
        *  The contents of @a x are a valid, but unspecified %vector.
        */
-      vector(vector&& __x)
+      vector(vector&& __x) noexcept
       : _Base(std::move(__x)) { }
 
       /**
@@ -346,7 +353,7 @@ 
        *  not touched in any way.  Managing the pointer is the user's
        *  responsibility.
        */
-      ~vector()
+      ~vector() _GLIBCXX_NOEXCEPT
       { std::_Destroy(this->_M_impl._M_start, this->_M_impl._M_finish,
 		      _M_get_Tp_allocator()); }
 
Index: include/bits/stl_deque.h
===================================================================
--- include/bits/stl_deque.h	(revision 174521)
+++ include/bits/stl_deque.h	(working copy)
@@ -465,7 +465,7 @@ 
 
 #ifdef __GXX_EXPERIMENTAL_CXX0X__
       _Deque_base(_Deque_base&& __x)
-      : _M_impl(__x._M_get_Tp_allocator())
+      : _M_impl(std::move(__x._M_get_Tp_allocator()))
       {
 	_M_initialize_map(0);
 	if (__x._M_impl._M_map)
@@ -505,6 +505,13 @@ 
 	: _Tp_alloc_type(__a), _M_map(0), _M_map_size(0),
 	  _M_start(), _M_finish()
 	{ }
+
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+	_Deque_impl(_Tp_alloc_type&& __a)
+	: _Tp_alloc_type(std::move(__a)), _M_map(0), _M_map_size(0),
+	  _M_start(), _M_finish()
+	{ }
+#endif
       };
 
       _Tp_alloc_type&
@@ -894,7 +901,7 @@ 
        *  themselves are pointers, the pointed-to memory is not touched in any
        *  way.  Managing the pointer is the user's responsibility.
        */
-      ~deque()
+      ~deque() _GLIBCXX_NOEXCEPT
       { _M_destroy_data(begin(), end(), _M_get_Tp_allocator()); }
 
       /**
Index: include/bits/stl_multiset.h
===================================================================
--- include/bits/stl_multiset.h	(revision 174521)
+++ include/bits/stl_multiset.h	(working copy)
@@ -192,6 +192,7 @@ 
        *  The contents of @a x are a valid, but unspecified %multiset.
        */
       multiset(multiset&& __x)
+      noexcept(is_nothrow_copy_constructible<_Compare>::value)
       : _M_t(std::move(__x._M_t)) { }
 
       /**
Index: include/bits/stl_bvector.h
===================================================================
--- include/bits/stl_bvector.h	(revision 174521)
+++ include/bits/stl_bvector.h	(working copy)
@@ -392,6 +392,13 @@ 
 	_Bvector_impl(const _Bit_alloc_type& __a)
 	: _Bit_alloc_type(__a), _M_start(), _M_finish(), _M_end_of_storage(0)
 	{ }
+
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+	_Bvector_impl(_Bit_alloc_type&& __a)
+	: _Bit_alloc_type(std::move(__a)), _M_start(), _M_finish(),
+	  _M_end_of_storage(0)
+	{ }
+#endif
       };
 
     public:
@@ -416,8 +423,8 @@ 
       : _M_impl(__a) { }
 
 #ifdef __GXX_EXPERIMENTAL_CXX0X__
-      _Bvector_base(_Bvector_base&& __x)
-      : _M_impl(__x._M_get_Bit_allocator())
+      _Bvector_base(_Bvector_base&& __x) noexcept
+      : _M_impl(std::move(__x._M_get_Bit_allocator()))
       {
 	this->_M_impl._M_start = __x._M_impl._M_start;
 	this->_M_impl._M_finish = __x._M_impl._M_finish;
@@ -532,7 +539,7 @@ 
     }
 
 #ifdef __GXX_EXPERIMENTAL_CXX0X__
-    vector(vector&& __x)
+    vector(vector&& __x) noexcept
     : _Base(std::move(__x)) { }
 
     vector(initializer_list<bool> __l,
@@ -553,7 +560,7 @@ 
 	_M_initialize_dispatch(__first, __last, _Integral());
       }
 
-    ~vector() { }
+    ~vector() _GLIBCXX_NOEXCEPT { }
 
     vector&
     operator=(const vector& __x)
Index: include/bits/algorithmfwd.h
===================================================================
--- include/bits/algorithmfwd.h	(revision 174521)
+++ include/bits/algorithmfwd.h	(working copy)
@@ -551,8 +551,8 @@ 
     void 
     swap(_Tp&, _Tp&)
 #ifdef __GXX_EXPERIMENTAL_CXX0X__
-    noexcept(is_nothrow_move_constructible<_Tp>::value
-	     && is_nothrow_move_assignable<_Tp>::value)
+    noexcept(__and_<is_nothrow_move_constructible<_Tp>,
+	            is_nothrow_move_assignable<_Tp>>::value)
 #endif
     ;
 
Index: include/bits/stl_tree.h
===================================================================
--- include/bits/stl_tree.h	(revision 174521)
+++ include/bits/stl_tree.h	(working copy)
@@ -450,6 +450,13 @@ 
 	    _M_node_count(0)
 	  { _M_initialize(); }
 
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+	  _Rb_tree_impl(const _Key_compare& __comp, _Node_allocator&& __a)
+	  : _Node_allocator(std::move(__a)), _M_key_compare(__comp),
+	    _M_header(), _M_node_count(0)
+	  { _M_initialize(); }
+#endif
+
 	private:
 	  void
 	  _M_initialize()
@@ -635,7 +642,7 @@ 
       _Rb_tree(_Rb_tree&& __x);
 #endif
 
-      ~_Rb_tree()
+      ~_Rb_tree() _GLIBCXX_NOEXCEPT
       { _M_erase(_M_begin()); }
 
       _Rb_tree&
@@ -900,7 +907,8 @@ 
            typename _Compare, typename _Alloc>
     _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::
     _Rb_tree(_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>&& __x)
-    : _M_impl(__x._M_impl._M_key_compare, __x._M_get_Node_allocator())
+    : _M_impl(__x._M_impl._M_key_compare,
+	      std::move(__x._M_get_Node_allocator()))
     {
       if (__x._M_root() != 0)
 	{
Index: testsuite/21_strings/basic_string/cons/wchar_t/noexcept_move_construct.cc
===================================================================
--- testsuite/21_strings/basic_string/cons/wchar_t/noexcept_move_construct.cc	(revision 0)
+++ testsuite/21_strings/basic_string/cons/wchar_t/noexcept_move_construct.cc	(revision 0)
@@ -0,0 +1,27 @@ 
+// { dg-do compile }
+// { dg-options "-std=gnu++0x" }
+
+// 2011-06-01  Paolo Carlini  <paolo.carlini@oracle.com>
+//
+// Copyright (C) 2011 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
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+#include <string>
+
+typedef std::wstring wstype;
+
+static_assert(std::is_nothrow_move_constructible<wstype>::value, "Error");
Index: testsuite/21_strings/basic_string/cons/char/noexcept_move_construct.cc
===================================================================
--- testsuite/21_strings/basic_string/cons/char/noexcept_move_construct.cc	(revision 0)
+++ testsuite/21_strings/basic_string/cons/char/noexcept_move_construct.cc	(revision 0)
@@ -0,0 +1,27 @@ 
+// { dg-do compile }
+// { dg-options "-std=gnu++0x" }
+
+// 2011-06-01  Paolo Carlini  <paolo.carlini@oracle.com>
+//
+// Copyright (C) 2011 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
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+#include <string>
+
+typedef std::string stype;
+
+static_assert(std::is_nothrow_move_constructible<stype>::value, "Error");
Index: testsuite/ext/vstring/cons/noexcept_move_construct.cc
===================================================================
--- testsuite/ext/vstring/cons/noexcept_move_construct.cc	(revision 0)
+++ testsuite/ext/vstring/cons/noexcept_move_construct.cc	(revision 0)
@@ -0,0 +1,27 @@ 
+// { dg-do compile }
+// { dg-options "-std=gnu++0x" }
+
+// 2011-06-01  Paolo Carlini  <paolo.carlini@oracle.com>
+//
+// Copyright (C) 2011 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
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+#include <ext/vstring.h>
+
+typedef __gnu_cxx::__sso_string sstype;
+
+static_assert(std::is_nothrow_move_constructible<sstype>::value, "Error");
Index: testsuite/23_containers/unordered_map/cons/noexcept_move_construct.cc
===================================================================
--- testsuite/23_containers/unordered_map/cons/noexcept_move_construct.cc	(revision 0)
+++ testsuite/23_containers/unordered_map/cons/noexcept_move_construct.cc	(revision 0)
@@ -0,0 +1,27 @@ 
+// { dg-do compile }
+// { dg-options "-std=gnu++0x" }
+
+// 2011-06-01  Paolo Carlini  <paolo.carlini@oracle.com>
+//
+// Copyright (C) 2011 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
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+#include <unordered_map>
+
+typedef std::unordered_map<int, int> umtype;
+
+static_assert(std::is_nothrow_move_constructible<umtype>::value, "Error");
Index: testsuite/23_containers/multimap/cons/noexcept_move_construct.cc
===================================================================
--- testsuite/23_containers/multimap/cons/noexcept_move_construct.cc	(revision 0)
+++ testsuite/23_containers/multimap/cons/noexcept_move_construct.cc	(revision 0)
@@ -0,0 +1,27 @@ 
+// { dg-do compile }
+// { dg-options "-std=gnu++0x" }
+
+// 2011-06-01  Paolo Carlini  <paolo.carlini@oracle.com>
+//
+// Copyright (C) 2011 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
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+#include <map>
+
+typedef std::multimap<int, int> mmtype;
+
+static_assert(std::is_nothrow_move_constructible<mmtype>::value, "Error");
Index: testsuite/23_containers/set/cons/noexcept_move_construct.cc
===================================================================
--- testsuite/23_containers/set/cons/noexcept_move_construct.cc	(revision 0)
+++ testsuite/23_containers/set/cons/noexcept_move_construct.cc	(revision 0)
@@ -0,0 +1,27 @@ 
+// { dg-do compile }
+// { dg-options "-std=gnu++0x" }
+
+// 2011-06-01  Paolo Carlini  <paolo.carlini@oracle.com>
+//
+// Copyright (C) 2011 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
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+#include <set>
+
+typedef std::set<int> stype;
+
+static_assert(std::is_nothrow_move_constructible<stype>::value, "Error");
Index: testsuite/23_containers/unordered_multimap/cons/noexcept_move_construct.cc
===================================================================
--- testsuite/23_containers/unordered_multimap/cons/noexcept_move_construct.cc	(revision 0)
+++ testsuite/23_containers/unordered_multimap/cons/noexcept_move_construct.cc	(revision 0)
@@ -0,0 +1,27 @@ 
+// { dg-do compile }
+// { dg-options "-std=gnu++0x" }
+
+// 2011-06-01  Paolo Carlini  <paolo.carlini@oracle.com>
+//
+// Copyright (C) 2011 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
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+#include <unordered_map>
+
+typedef std::unordered_multimap<int, int> ummtype;
+
+static_assert(std::is_nothrow_move_constructible<ummtype>::value, "Error");
Index: testsuite/23_containers/forward_list/cons/noexcept_move_construct.cc
===================================================================
--- testsuite/23_containers/forward_list/cons/noexcept_move_construct.cc	(revision 0)
+++ testsuite/23_containers/forward_list/cons/noexcept_move_construct.cc	(revision 0)
@@ -0,0 +1,27 @@ 
+// { dg-do compile }
+// { dg-options "-std=gnu++0x" }
+
+// 2011-06-01  Paolo Carlini  <paolo.carlini@oracle.com>
+//
+// Copyright (C) 2011 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
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+#include <forward_list>
+
+typedef std::forward_list<int> fltype;
+
+static_assert(std::is_nothrow_move_constructible<fltype>::value, "Error");
Index: testsuite/23_containers/forward_list/requirements/dr438/assign_neg.cc
===================================================================
--- testsuite/23_containers/forward_list/requirements/dr438/assign_neg.cc	(revision 174521)
+++ testsuite/23_containers/forward_list/requirements/dr438/assign_neg.cc	(working copy)
@@ -1,6 +1,6 @@ 
 // { dg-do compile }
 // { dg-options "-std=gnu++0x" }
-// { dg-error "no matching" "" { target *-*-* } 1206 }
+// { dg-error "no matching" "" { target *-*-* } 1210 }
 // { dg-excess-errors "" }
 
 // Copyright (C) 2009, 2010 Free Software Foundation
Index: testsuite/23_containers/forward_list/requirements/dr438/insert_neg.cc
===================================================================
--- testsuite/23_containers/forward_list/requirements/dr438/insert_neg.cc	(revision 174521)
+++ testsuite/23_containers/forward_list/requirements/dr438/insert_neg.cc	(working copy)
@@ -1,6 +1,6 @@ 
 // { dg-do compile }
 // { dg-options "-std=gnu++0x" }
-// { dg-error "no matching" "" { target *-*-* } 1206 }
+// { dg-error "no matching" "" { target *-*-* } 1210 }
 // { dg-excess-errors "" }
 
 // Copyright (C) 2009, 2010, 2011 Free Software Foundation
Index: testsuite/23_containers/forward_list/requirements/dr438/constructor_1_neg.cc
===================================================================
--- testsuite/23_containers/forward_list/requirements/dr438/constructor_1_neg.cc	(revision 174521)
+++ testsuite/23_containers/forward_list/requirements/dr438/constructor_1_neg.cc	(working copy)
@@ -1,6 +1,6 @@ 
 // { dg-do compile }
 // { dg-options "-std=gnu++0x" }
-// { dg-error "no matching" "" { target *-*-* } 1206 }
+// { dg-error "no matching" "" { target *-*-* } 1210 }
 // { dg-excess-errors "" }
 
 // Copyright (C) 2009, 2010, 2011 Free Software Foundation
Index: testsuite/23_containers/forward_list/requirements/dr438/constructor_2_neg.cc
===================================================================
--- testsuite/23_containers/forward_list/requirements/dr438/constructor_2_neg.cc	(revision 174521)
+++ testsuite/23_containers/forward_list/requirements/dr438/constructor_2_neg.cc	(working copy)
@@ -1,6 +1,6 @@ 
 // { dg-do compile }
 // { dg-options "-std=gnu++0x" }
-// { dg-error "no matching" "" { target *-*-* } 1206 }
+// { dg-error "no matching" "" { target *-*-* } 1210 }
 // { dg-excess-errors "" }
 
 // Copyright (C) 2009, 2010, 2011 Free Software Foundation
Index: testsuite/23_containers/unordered_set/cons/noexcept_move_construct.cc
===================================================================
--- testsuite/23_containers/unordered_set/cons/noexcept_move_construct.cc	(revision 0)
+++ testsuite/23_containers/unordered_set/cons/noexcept_move_construct.cc	(revision 0)
@@ -0,0 +1,27 @@ 
+// { dg-do compile }
+// { dg-options "-std=gnu++0x" }
+
+// 2011-06-01  Paolo Carlini  <paolo.carlini@oracle.com>
+//
+// Copyright (C) 2011 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
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+#include <unordered_set>
+
+typedef std::unordered_set<int> ustype;
+
+static_assert(std::is_nothrow_move_constructible<ustype>::value, "Error");
Index: testsuite/23_containers/vector/requirements/dr438/assign_neg.cc
===================================================================
--- testsuite/23_containers/vector/requirements/dr438/assign_neg.cc	(revision 174521)
+++ testsuite/23_containers/vector/requirements/dr438/assign_neg.cc	(working copy)
@@ -18,7 +18,7 @@ 
 // <http://www.gnu.org/licenses/>.
 
 // { dg-do compile }
-// { dg-error "no matching" "" { target *-*-* } 1150 }
+// { dg-error "no matching" "" { target *-*-* } 1157 }
 // { dg-excess-errors "" }
 
 #include <vector>
Index: testsuite/23_containers/vector/requirements/dr438/insert_neg.cc
===================================================================
--- testsuite/23_containers/vector/requirements/dr438/insert_neg.cc	(revision 174521)
+++ testsuite/23_containers/vector/requirements/dr438/insert_neg.cc	(working copy)
@@ -18,7 +18,7 @@ 
 // <http://www.gnu.org/licenses/>.
 
 // { dg-do compile }
-// { dg-error "no matching" "" { target *-*-* } 1191 }
+// { dg-error "no matching" "" { target *-*-* } 1198 }
 // { dg-excess-errors "" }
 
 #include <vector>
Index: testsuite/23_containers/vector/requirements/dr438/constructor_1_neg.cc
===================================================================
--- testsuite/23_containers/vector/requirements/dr438/constructor_1_neg.cc	(revision 174521)
+++ testsuite/23_containers/vector/requirements/dr438/constructor_1_neg.cc	(working copy)
@@ -18,7 +18,7 @@ 
 // <http://www.gnu.org/licenses/>.
 
 // { dg-do compile }
-// { dg-error "no matching" "" { target *-*-* } 1080 }
+// { dg-error "no matching" "" { target *-*-* } 1087 }
 // { dg-excess-errors "" }
 
 #include <vector>
Index: testsuite/23_containers/vector/requirements/dr438/constructor_2_neg.cc
===================================================================
--- testsuite/23_containers/vector/requirements/dr438/constructor_2_neg.cc	(revision 174521)
+++ testsuite/23_containers/vector/requirements/dr438/constructor_2_neg.cc	(working copy)
@@ -18,7 +18,7 @@ 
 // <http://www.gnu.org/licenses/>.
 
 // { dg-do compile }
-// { dg-error "no matching" "" { target *-*-* } 1080 }
+// { dg-error "no matching" "" { target *-*-* } 1087 }
 // { dg-excess-errors "" }
 
 #include <vector>
Index: testsuite/23_containers/vector/bool/cons/noexcept_move_construct.cc
===================================================================
--- testsuite/23_containers/vector/bool/cons/noexcept_move_construct.cc	(revision 0)
+++ testsuite/23_containers/vector/bool/cons/noexcept_move_construct.cc	(revision 0)
@@ -0,0 +1,27 @@ 
+// { dg-do compile }
+// { dg-options "-std=gnu++0x" }
+
+// 2011-06-01  Paolo Carlini  <paolo.carlini@oracle.com>
+//
+// Copyright (C) 2011 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
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+#include <vector>
+
+typedef std::vector<bool> vbtype;
+
+static_assert(std::is_nothrow_move_constructible<vbtype>::value, "Error");
Index: testsuite/23_containers/vector/cons/noexcept_move_construct.cc
===================================================================
--- testsuite/23_containers/vector/cons/noexcept_move_construct.cc	(revision 0)
+++ testsuite/23_containers/vector/cons/noexcept_move_construct.cc	(revision 0)
@@ -0,0 +1,27 @@ 
+// { dg-do compile }
+// { dg-options "-std=gnu++0x" }
+
+// 2011-06-01  Paolo Carlini  <paolo.carlini@oracle.com>
+//
+// Copyright (C) 2011 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
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+#include <vector>
+
+typedef std::vector<int> vtype;
+
+static_assert(std::is_nothrow_move_constructible<vtype>::value, "Error");
Index: testsuite/23_containers/deque/requirements/dr438/assign_neg.cc
===================================================================
--- testsuite/23_containers/deque/requirements/dr438/assign_neg.cc	(revision 174521)
+++ testsuite/23_containers/deque/requirements/dr438/assign_neg.cc	(working copy)
@@ -18,7 +18,7 @@ 
 // <http://www.gnu.org/licenses/>.
 
 // { dg-do compile }
-// { dg-error "no matching" "" { target *-*-* } 1661 }
+// { dg-error "no matching" "" { target *-*-* } 1668 }
 // { dg-excess-errors "" }
 
 #include <deque>
Index: testsuite/23_containers/deque/requirements/dr438/insert_neg.cc
===================================================================
--- testsuite/23_containers/deque/requirements/dr438/insert_neg.cc	(revision 174521)
+++ testsuite/23_containers/deque/requirements/dr438/insert_neg.cc	(working copy)
@@ -18,7 +18,7 @@ 
 // <http://www.gnu.org/licenses/>.
 
 // { dg-do compile }
-// { dg-error "no matching" "" { target *-*-* } 1745 }
+// { dg-error "no matching" "" { target *-*-* } 1752 }
 // { dg-excess-errors "" }
 
 #include <deque>
Index: testsuite/23_containers/deque/requirements/dr438/constructor_1_neg.cc
===================================================================
--- testsuite/23_containers/deque/requirements/dr438/constructor_1_neg.cc	(revision 174521)
+++ testsuite/23_containers/deque/requirements/dr438/constructor_1_neg.cc	(working copy)
@@ -18,7 +18,7 @@ 
 // <http://www.gnu.org/licenses/>.
 
 // { dg-do compile }
-// { dg-error "no matching" "" { target *-*-* } 1594 }
+// { dg-error "no matching" "" { target *-*-* } 1601 }
 // { dg-excess-errors "" }
 
 #include <deque>
Index: testsuite/23_containers/deque/requirements/dr438/constructor_2_neg.cc
===================================================================
--- testsuite/23_containers/deque/requirements/dr438/constructor_2_neg.cc	(revision 174521)
+++ testsuite/23_containers/deque/requirements/dr438/constructor_2_neg.cc	(working copy)
@@ -18,7 +18,7 @@ 
 // <http://www.gnu.org/licenses/>.
 
 // { dg-do compile }
-// { dg-error "no matching" "" { target *-*-* } 1594 }
+// { dg-error "no matching" "" { target *-*-* } 1601 }
 // { dg-excess-errors "" }
 
 #include <deque>
Index: testsuite/23_containers/multiset/cons/noexcept_move_construct.cc
===================================================================
--- testsuite/23_containers/multiset/cons/noexcept_move_construct.cc	(revision 0)
+++ testsuite/23_containers/multiset/cons/noexcept_move_construct.cc	(revision 0)
@@ -0,0 +1,27 @@ 
+// { dg-do compile }
+// { dg-options "-std=gnu++0x" }
+
+// 2011-06-01  Paolo Carlini  <paolo.carlini@oracle.com>
+//
+// Copyright (C) 2011 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
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+#include <set>
+
+typedef std::multiset<int> mstype;
+
+static_assert(std::is_nothrow_move_constructible<mstype>::value, "Error");
Index: testsuite/23_containers/list/requirements/dr438/assign_neg.cc
===================================================================
--- testsuite/23_containers/list/requirements/dr438/assign_neg.cc	(revision 174521)
+++ testsuite/23_containers/list/requirements/dr438/assign_neg.cc	(working copy)
@@ -18,7 +18,7 @@ 
 // <http://www.gnu.org/licenses/>.
 
 // { dg-do compile }
-// { dg-error "no matching" "" { target *-*-* } 1491 }
+// { dg-error "no matching" "" { target *-*-* } 1497 }
 // { dg-excess-errors "" }
 
 #include <list>
Index: testsuite/23_containers/list/requirements/dr438/insert_neg.cc
===================================================================
--- testsuite/23_containers/list/requirements/dr438/insert_neg.cc	(revision 174521)
+++ testsuite/23_containers/list/requirements/dr438/insert_neg.cc	(working copy)
@@ -18,7 +18,7 @@ 
 // <http://www.gnu.org/licenses/>.
 
 // { dg-do compile }
-// { dg-error "no matching" "" { target *-*-* } 1447 }
+// { dg-error "no matching" "" { target *-*-* } 1453 }
 // { dg-excess-errors "" }
 
 #include <list>
Index: testsuite/23_containers/list/requirements/dr438/constructor_1_neg.cc
===================================================================
--- testsuite/23_containers/list/requirements/dr438/constructor_1_neg.cc	(revision 174521)
+++ testsuite/23_containers/list/requirements/dr438/constructor_1_neg.cc	(working copy)
@@ -18,7 +18,7 @@ 
 // <http://www.gnu.org/licenses/>.
 
 // { dg-do compile }
-// { dg-error "no matching" "" { target *-*-* } 1447 }
+// { dg-error "no matching" "" { target *-*-* } 1453 }
 // { dg-excess-errors "" }
 
 #include <list>
Index: testsuite/23_containers/list/requirements/dr438/constructor_2_neg.cc
===================================================================
--- testsuite/23_containers/list/requirements/dr438/constructor_2_neg.cc	(revision 174521)
+++ testsuite/23_containers/list/requirements/dr438/constructor_2_neg.cc	(working copy)
@@ -18,7 +18,7 @@ 
 // <http://www.gnu.org/licenses/>.
 
 // { dg-do compile }
-// { dg-error "no matching" "" { target *-*-* } 1447 }
+// { dg-error "no matching" "" { target *-*-* } 1453 }
 // { dg-excess-errors "" }
 
 #include <list>
Index: testsuite/23_containers/list/cons/noexcept_move_construct.cc
===================================================================
--- testsuite/23_containers/list/cons/noexcept_move_construct.cc	(revision 0)
+++ testsuite/23_containers/list/cons/noexcept_move_construct.cc	(revision 0)
@@ -0,0 +1,27 @@ 
+// { dg-do compile }
+// { dg-options "-std=gnu++0x" }
+
+// 2011-06-01  Paolo Carlini  <paolo.carlini@oracle.com>
+//
+// Copyright (C) 2011 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
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+#include <list>
+
+typedef std::list<int> ltype;
+
+static_assert(std::is_nothrow_move_constructible<ltype>::value, "Error");
Index: testsuite/23_containers/unordered_multiset/cons/noexcept_move_construct.cc
===================================================================
--- testsuite/23_containers/unordered_multiset/cons/noexcept_move_construct.cc	(revision 0)
+++ testsuite/23_containers/unordered_multiset/cons/noexcept_move_construct.cc	(revision 0)
@@ -0,0 +1,27 @@ 
+// { dg-do compile }
+// { dg-options "-std=gnu++0x" }
+
+// 2011-06-01  Paolo Carlini  <paolo.carlini@oracle.com>
+//
+// Copyright (C) 2011 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
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+#include <unordered_set>
+
+typedef std::unordered_multiset<int> umstype;
+
+static_assert(std::is_nothrow_move_constructible<umstype>::value, "Error");
Index: testsuite/23_containers/map/cons/noexcept_move_construct.cc
===================================================================
--- testsuite/23_containers/map/cons/noexcept_move_construct.cc	(revision 0)
+++ testsuite/23_containers/map/cons/noexcept_move_construct.cc	(revision 0)
@@ -0,0 +1,27 @@ 
+// { dg-do compile }
+// { dg-options "-std=gnu++0x" }
+
+// 2011-06-01  Paolo Carlini  <paolo.carlini@oracle.com>
+//
+// Copyright (C) 2011 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
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+#include <map>
+
+typedef std::map<int, int> mtype;
+
+static_assert(std::is_nothrow_move_constructible<mtype>::value, "Error");