This patch was generated from the headers installed by MacPorts gcc-4.4 on OS X 10.6. You can apply it there with `cd /opt/local/include/gcc44/c++ ; sudo patch -p1 <this_patch`, or similar on other operating systems. Mail cfe-dev if you find other problems in the standard headers. This patch is offered under the same modified GPLv3 as libstdc++-4.4. diff -ur a/bits/forward_list.h b/bits/forward_list.h --- a/bits/forward_list.h 2011-03-15 14:49:05.000000000 -0700 +++ b/bits/forward_list.h 2011-05-02 23:51:33.000000000 -0700 @@ -983,7 +983,7 @@ * function. */ void - swap(forward_list&& __list) + swap(forward_list& __list) { _Node_base::swap(this->_M_impl._M_head, __list._M_impl._M_head); } /** diff -ur a/bits/move.h b/bits/move.h --- a/bits/move.h 2011-03-15 14:49:05.000000000 -0700 +++ b/bits/move.h 2011-03-29 10:33:39.000000000 -0700 @@ -48,13 +48,35 @@ template<typename _Tp> inline _Tp&& - forward(typename std::identity<_Tp>::type&& __t) + forward(typename std::remove_reference<_Tp>::type& __t) +#ifdef __clang__ + { return static_cast<_Tp&&>(__t); } +#else { return __t; } +#endif + + template<typename _Tp> + inline _Tp&& + forward(typename std::remove_reference<_Tp>::type&& __t) + { +#ifdef __clang__ + static_assert(!std::is_lvalue_reference<_Tp>::value, + "Can't instantiate this forward() with an" + " lvalue reference type."); + return static_cast<_Tp&&>(__t); +#else + return __t; +#endif + } template<typename _Tp> inline typename std::remove_reference<_Tp>::type&& move(_Tp&& __t) +#ifdef __clang__ + { return static_cast<typename std::remove_reference<_Tp>::type&&>(__t); } +#else { return __t; } +#endif _GLIBCXX_END_NAMESPACE diff -ur a/bits/shared_ptr.h b/bits/shared_ptr.h --- a/bits/shared_ptr.h 2011-03-15 14:49:05.000000000 -0700 +++ b/bits/shared_ptr.h 2011-03-31 16:40:45.000000000 -0700 @@ -833,7 +833,7 @@ { return _M_refcount._M_get_use_count(); } void - swap(__shared_ptr<_Tp, _Lp>&& __other) // never throws + swap(__shared_ptr<_Tp, _Lp>& __other) // never throws { std::swap(_M_ptr, __other._M_ptr); _M_refcount._M_swap(__other._M_refcount); @@ -943,16 +943,6 @@ swap(__shared_ptr<_Tp, _Lp>& __a, __shared_ptr<_Tp, _Lp>& __b) { __a.swap(__b); } - template<typename _Tp, _Lock_policy _Lp> - inline void - swap(__shared_ptr<_Tp, _Lp>&& __a, __shared_ptr<_Tp, _Lp>& __b) - { __a.swap(__b); } - - template<typename _Tp, _Lock_policy _Lp> - inline void - swap(__shared_ptr<_Tp, _Lp>& __a, __shared_ptr<_Tp, _Lp>&& __b) - { __a.swap(__b); } - // 2.2.3.9 shared_ptr casts /** @warning The seemingly equivalent * <code>shared_ptr<_Tp, _Lp>(static_cast<_Tp*>(__r.get()))</code> @@ -1372,16 +1362,6 @@ swap(shared_ptr<_Tp>& __a, shared_ptr<_Tp>& __b) { __a.swap(__b); } - template<typename _Tp> - inline void - swap(shared_ptr<_Tp>&& __a, shared_ptr<_Tp>& __b) - { __a.swap(__b); } - - template<typename _Tp> - inline void - swap(shared_ptr<_Tp>& __a, shared_ptr<_Tp>&& __b) - { __a.swap(__b); } - // 20.8.13.2.10 shared_ptr casts. template<typename _Tp, typename _Tp1> inline shared_ptr<_Tp> diff -ur a/bits/stl_bvector.h b/bits/stl_bvector.h --- a/bits/stl_bvector.h 2011-03-15 14:49:05.000000000 -0700 +++ b/bits/stl_bvector.h 2011-05-02 23:34:46.000000000 -0700 @@ -743,11 +743,7 @@ } void -#ifdef __GXX_EXPERIMENTAL_CXX0X__ - swap(vector&& __x) -#else swap(vector& __x) -#endif { std::swap(this->_M_impl._M_start, __x._M_impl._M_start); std::swap(this->_M_impl._M_finish, __x._M_impl._M_finish); diff -ur a/bits/stl_deque.h b/bits/stl_deque.h --- a/bits/stl_deque.h 2011-03-15 14:49:05.000000000 -0700 +++ b/bits/stl_deque.h 2011-03-29 10:33:39.000000000 -0700 @@ -1395,11 +1395,7 @@ * std::swap(d1,d2) will feed to this function. */ void -#ifdef __GXX_EXPERIMENTAL_CXX0X__ - swap(deque&& __x) -#else swap(deque& __x) -#endif { std::swap(this->_M_impl._M_start, __x._M_impl._M_start); std::swap(this->_M_impl._M_finish, __x._M_impl._M_finish); diff -ur a/bits/stl_iterator.h b/bits/stl_iterator.h --- a/bits/stl_iterator.h 2011-03-15 14:49:05.000000000 -0700 +++ b/bits/stl_iterator.h 2011-03-29 10:33:39.000000000 -0700 @@ -913,7 +913,7 @@ reference operator*() const - { return *_M_current; } + { return std::move(*_M_current); } pointer operator->() const diff -ur a/bits/stl_list.h b/bits/stl_list.h --- a/bits/stl_list.h 2011-03-15 14:49:05.000000000 -0700 +++ b/bits/stl_list.h 2011-03-29 10:33:39.000000000 -0700 @@ -1106,11 +1106,7 @@ * function. */ void -#ifdef __GXX_EXPERIMENTAL_CXX0X__ - swap(list&& __x) -#else swap(list& __x) -#endif { _List_node_base::swap(this->_M_impl._M_node, __x._M_impl._M_node); @@ -1160,6 +1156,12 @@ } } +#ifdef __GXX_EXPERIMENTAL_CXX0X__ + void + splice(iterator __position, list& __x) + { splice(__position, std::move(__x)); } +#endif + /** * @brief Insert element from another %list. * @param position Iterator referencing the element to insert before. @@ -1187,6 +1189,12 @@ this->_M_transfer(__position, __i, __j); } +#ifdef __GXX_EXPERIMENTAL_CXX0X__ + void + splice(iterator __position, list& __x, iterator __i) + { splice(__position, std::move(__x), __i); } +#endif + /** * @brief Insert range from another %list. * @param position Iterator referencing the element to insert before. @@ -1217,6 +1225,13 @@ } } +#ifdef __GXX_EXPERIMENTAL_CXX0X__ + void + splice(iterator __position, list& __x, iterator __first, + iterator __last) + { splice(__position, std::move(__x), __first, __last); } +#endif + /** * @brief Remove all elements equal to value. * @param value The value to remove. @@ -1287,6 +1302,10 @@ void #ifdef __GXX_EXPERIMENTAL_CXX0X__ merge(list&& __x); + + void + merge(list& __x) + { merge(std::move(__x)); } #else merge(list& __x); #endif @@ -1307,6 +1326,11 @@ void #ifdef __GXX_EXPERIMENTAL_CXX0X__ merge(list&&, _StrictWeakOrdering); + + template<typename _StrictWeakOrdering> + void + merge(list& __l, _StrictWeakOrdering __comp) + { merge(std::move(__l), __comp); } #else merge(list&, _StrictWeakOrdering); #endif diff -ur a/bits/stl_map.h b/bits/stl_map.h --- a/bits/stl_map.h 2011-03-15 14:49:05.000000000 -0700 +++ b/bits/stl_map.h 2011-03-29 10:33:39.000000000 -0700 @@ -608,11 +608,7 @@ * that std::swap(m1,m2) will feed to this function. */ void -#ifdef __GXX_EXPERIMENTAL_CXX0X__ - swap(map&& __x) -#else swap(map& __x) -#endif { _M_t.swap(__x._M_t); } /** diff -ur a/bits/stl_multimap.h b/bits/stl_multimap.h --- a/bits/stl_multimap.h 2011-03-15 14:49:05.000000000 -0700 +++ b/bits/stl_multimap.h 2011-03-29 10:33:39.000000000 -0700 @@ -544,11 +544,7 @@ * std::swap(m1,m2) will feed to this function. */ void -#ifdef __GXX_EXPERIMENTAL_CXX0X__ - swap(multimap&& __x) -#else swap(multimap& __x) -#endif { _M_t.swap(__x._M_t); } /** diff -ur a/bits/stl_multiset.h b/bits/stl_multiset.h --- a/bits/stl_multiset.h 2011-03-15 14:49:05.000000000 -0700 +++ b/bits/stl_multiset.h 2011-03-29 10:33:39.000000000 -0700 @@ -376,11 +376,7 @@ * std::swap(s1,s2) will feed to this function. */ void -#ifdef __GXX_EXPERIMENTAL_CXX0X__ - swap(multiset&& __x) -#else swap(multiset& __x) -#endif { _M_t.swap(__x._M_t); } // insert/erase diff -ur a/bits/stl_pair.h b/bits/stl_pair.h --- a/bits/stl_pair.h 2011-03-15 14:49:05.000000000 -0700 +++ b/bits/stl_pair.h 2011-03-29 10:33:39.000000000 -0700 @@ -84,10 +84,21 @@ : first(__a), second(__b) { } #ifdef __GXX_EXPERIMENTAL_CXX0X__ - template<class _U1, class _U2> + template<class _U1, class = typename + std::enable_if<std::is_convertible<_U1, _T1>::value>::type> + pair(_U1&& __x, const _T2& __y) + : first(std::forward<_U1>(__x)), second(__y) { } + + template<class _U2, class = typename + std::enable_if<std::is_convertible<_U2, _T2>::value>::type> + pair(const _T1& __x, _U2&& __y) + : first(__x), second(std::forward<_U2>(__y)) { } + + template<class _U1, class _U2, class = typename + std::enable_if<std::is_convertible<_U1, _T1>::value + && std::is_convertible<_U2, _T2>::value>::type> pair(_U1&& __x, _U2&& __y) - : first(std::forward<_U1>(__x)), - second(std::forward<_U2>(__y)) { } + : first(std::forward<_U1>(__x)), second(std::forward<_U2>(__y)) { } pair(pair&& __p) : first(std::move(__p.first)), @@ -107,11 +118,19 @@ second(std::move(__p.second)) { } // http://gcc.gnu.org/ml/libstdc++/2007-08/msg00052.html + +#if 0 + // This constructor is incompatible with libstdc++-4.6, and it + // interferes with passing NULL pointers to the 2-argument + // constructors, so we disable it. map::emplace isn't + // implemented in libstdc++-4.4 anyway, and that's what this + // constructor was here for. template<class _U1, class _Arg0, class... _Args> pair(_U1&& __x, _Arg0&& __arg0, _Args&&... __args) : first(std::forward<_U1>(__x)), second(std::forward<_Arg0>(__arg0), std::forward<_Args>(__args)...) { } +#endif pair& operator=(pair&& __p) @@ -131,7 +150,7 @@ } void - swap(pair&& __p) + swap(pair& __p) { using std::swap; swap(first, __p.first); diff -ur a/bits/stl_queue.h b/bits/stl_queue.h --- a/bits/stl_queue.h 2011-03-15 14:49:05.000000000 -0700 +++ b/bits/stl_queue.h 2011-05-02 23:36:15.000000000 -0700 @@ -249,7 +249,7 @@ #ifdef __GXX_EXPERIMENTAL_CXX0X__ void - swap(queue&& __q) + swap(queue& __q) { c.swap(__q.c); } #endif }; @@ -550,7 +550,7 @@ #ifdef __GXX_EXPERIMENTAL_CXX0X__ void - swap(priority_queue&& __pq) + swap(priority_queue& __pq) { using std::swap; c.swap(__pq.c); diff -ur a/bits/stl_set.h b/bits/stl_set.h --- a/bits/stl_set.h 2011-03-15 14:49:05.000000000 -0700 +++ b/bits/stl_set.h 2011-03-29 10:33:39.000000000 -0700 @@ -383,11 +383,7 @@ * std::swap(s1,s2) will feed to this function. */ void -#ifdef __GXX_EXPERIMENTAL_CXX0X__ - swap(set&& __x) -#else swap(set& __x) -#endif { _M_t.swap(__x._M_t); } // insert/erase diff -ur a/bits/stl_stack.h b/bits/stl_stack.h --- a/bits/stl_stack.h 2011-03-15 14:49:05.000000000 -0700 +++ b/bits/stl_stack.h 2011-05-02 23:36:36.000000000 -0700 @@ -213,7 +213,7 @@ #ifdef __GXX_EXPERIMENTAL_CXX0X__ void - swap(stack&& __s) + swap(stack& __s) { c.swap(__s.c); } #endif }; diff -ur a/bits/stl_tree.h b/bits/stl_tree.h --- a/bits/stl_tree.h 2011-03-15 14:49:05.000000000 -0700 +++ b/bits/stl_tree.h 2011-03-29 10:33:39.000000000 -0700 @@ -675,11 +675,7 @@ { return _M_get_Node_allocator().max_size(); } void -#ifdef __GXX_EXPERIMENTAL_CXX0X__ - swap(_Rb_tree&& __t); -#else swap(_Rb_tree& __t); -#endif // Insert/erase. pair<iterator, bool> @@ -1104,11 +1100,7 @@ typename _Compare, typename _Alloc> void _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>:: -#ifdef __GXX_EXPERIMENTAL_CXX0X__ - swap(_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>&& __t) -#else swap(_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>& __t) -#endif { if (_M_root() == 0) { diff -ur a/bits/stl_vector.h b/bits/stl_vector.h --- a/bits/stl_vector.h 2011-03-15 14:49:05.000000000 -0700 +++ b/bits/stl_vector.h 2011-03-29 10:33:39.000000000 -0700 @@ -923,11 +923,7 @@ * std::swap(v1,v2) will feed to this function. */ void -#ifdef __GXX_EXPERIMENTAL_CXX0X__ - swap(vector&& __x) -#else swap(vector& __x) -#endif { std::swap(this->_M_impl._M_start, __x._M_impl._M_start); std::swap(this->_M_impl._M_finish, __x._M_impl._M_finish); diff -ur a/bits/unique_ptr.h b/bits/unique_ptr.h --- a/bits/unique_ptr.h 2011-03-15 14:49:05.000000000 -0700 +++ b/bits/unique_ptr.h 2011-03-31 16:40:45.000000000 -0700 @@ -204,7 +204,7 @@ } void - swap(unique_ptr&& __u) + swap(unique_ptr& __u) { using std::swap; swap(_M_t, __u._M_t); @@ -350,7 +350,7 @@ void reset(_Up) = delete; void - swap(unique_ptr&& __u) + swap(unique_ptr& __u) { using std::swap; swap(_M_t, __u._M_t); @@ -389,18 +389,6 @@ unique_ptr<_Tp, _Tp_Deleter>& __y) { __x.swap(__y); } - template<typename _Tp, typename _Tp_Deleter> - inline void - swap(unique_ptr<_Tp, _Tp_Deleter>&& __x, - unique_ptr<_Tp, _Tp_Deleter>& __y) - { __x.swap(__y); } - - template<typename _Tp, typename _Tp_Deleter> - inline void - swap(unique_ptr<_Tp, _Tp_Deleter>& __x, - unique_ptr<_Tp, _Tp_Deleter>&& __y) - { __x.swap(__y); } - template<typename _Tp, typename _Tp_Deleter, typename _Up, typename _Up_Deleter> inline bool diff -ur a/exception_ptr.h b/exception_ptr.h --- a/exception_ptr.h 2011-03-15 14:49:08.000000000 -0700 +++ b/exception_ptr.h 2011-03-29 10:33:39.000000000 -0700 @@ -140,7 +140,7 @@ friend bool operator==(const exception_ptr&, const exception_ptr&) throw(); - const type_info* + const class type_info* __cxa_exception_type() const throw(); }; diff -ur a/ext/algorithm b/ext/algorithm --- a/ext/algorithm 2011-03-15 14:49:05.000000000 -0700 +++ b/ext/algorithm 2011-03-29 10:33:39.000000000 -0700 @@ -423,6 +423,9 @@ __out_last - __out_first); } +#ifdef __GXX_EXPERIMENTAL_CXX0X__ + using std::is_heap; +#else /** * This is an SGI extension. * @ingroup SGIextensions @@ -462,6 +465,7 @@ return std::__is_heap(__first, __comp, __last - __first); } +#endif // is_sorted, a predicated testing whether a range is sorted in // nondescending order. This is an extension, not part of the C++ diff -ur a/ext/vstring.h b/ext/vstring.h --- a/ext/vstring.h 2011-03-15 14:49:05.000000000 -0700 +++ b/ext/vstring.h 2011-03-29 10:33:39.000000000 -0700 @@ -152,7 +152,7 @@ * string. */ __versa_string(__versa_string&& __str) - : __vstring_base(std::forward<__vstring_base>(__str)) { } + : __vstring_base(std::move(__str)) { } /** * @brief Construct string from an initializer list. @@ -1439,11 +1439,7 @@ * constant time. */ void -#ifdef __GXX_EXPERIMENTAL_CXX0X__ - swap(__versa_string&& __s) -#else swap(__versa_string& __s) -#endif { this->_M_swap(__s); } // String operations: diff -ur a/tr1_impl/hashtable b/tr1_impl/hashtable --- a/tr1_impl/hashtable 2011-03-15 14:49:07.000000000 -0700 +++ b/tr1_impl/hashtable 2011-05-02 23:41:55.000000000 -0700 @@ -225,11 +225,7 @@ ~_Hashtable(); -#ifdef _GLIBCXX_INCLUDE_AS_CXX0X - void swap(_Hashtable&&); -#else void swap(_Hashtable&); -#endif // Basic container operations iterator @@ -732,11 +728,7 @@ void _Hashtable<_Key, _Value, _Allocator, _ExtractKey, _Equal, _H1, _H2, _Hash, _RehashPolicy, __chc, __cit, __uk>:: -#ifdef _GLIBCXX_INCLUDE_AS_CXX0X - swap(_Hashtable&& __x) -#else swap(_Hashtable& __x) -#endif { // The only base class with member variables is hash_code_base. We // define _Hash_code_base::_M_swap because different specializations diff -ur a/tuple b/tuple --- a/tuple 2011-03-15 14:49:07.000000000 -0700 +++ b/tuple 2011-05-02 23:33:23.000000000 -0700 @@ -77,7 +77,7 @@ _Head& _M_head() { return *this; } const _Head& _M_head() const { return *this; } - void _M_swap_impl(_Head&&) { /* no-op */ } + void _M_swap_impl(_Head&) { /* no-op */ } }; template<std::size_t _Idx, typename _Head> @@ -97,7 +97,7 @@ const _Head& _M_head() const { return _M_head_impl; } void - _M_swap_impl(_Head&& __h) + _M_swap_impl(_Head& __h) { using std::swap; swap(__h, _M_head_impl); @@ -125,7 +125,7 @@ struct _Tuple_impl<_Idx> { protected: - void _M_swap_impl(_Tuple_impl&&) { /* no-op */ } + void _M_swap_impl(_Tuple_impl&) { /* no-op */ } }; /** @@ -214,7 +214,7 @@ protected: void - _M_swap_impl(_Tuple_impl&& __in) + _M_swap_impl(_Tuple_impl& __in) { _Base::_M_swap_impl(__in._M_head()); _Inherited::_M_swap_impl(__in._M_tail()); @@ -292,7 +292,7 @@ } void - swap(tuple&& __in) + swap(tuple& __in) { _Inherited::_M_swap_impl(__in); } }; @@ -301,7 +301,7 @@ class tuple<> { public: - void swap(tuple&&) { /* no-op */ } + void swap(tuple&) { /* no-op */ } }; /// tuple (2-element), with construction and assignment from a pair. @@ -394,7 +394,7 @@ } void - swap(tuple&& __in) + swap(tuple& __in) { using std::swap; swap(this->_M_head(), __in._M_head());