1 This patch was generated from the headers installed by MacPorts 2 gcc-4.4 on OS X 10.6. You can apply it there with 3 `cd /opt/local/include/gcc44/c++ ; sudo patch -p1 <this_patch`, or similar 4 on other operating systems. Mail cfe-dev if you find other problems in the 5 standard headers. 6 7 This patch is offered under the same modified GPLv3 as libstdc++-4.4. 8 9 diff -ur a/bits/forward_list.h b/bits/forward_list.h 10 --- a/bits/forward_list.h 2011-03-15 14:49:05.000000000 -0700 11 +++ b/bits/forward_list.h 2011-05-02 23:51:33.000000000 -0700 12 @@ -983,7 +983,7 @@ 13 * function. 14 */ 15 void 16 - swap(forward_list&& __list) 17 + swap(forward_list& __list) 18 { _Node_base::swap(this->_M_impl._M_head, __list._M_impl._M_head); } 19 20 /** 21 diff -ur a/bits/move.h b/bits/move.h 22 --- a/bits/move.h 2011-03-15 14:49:05.000000000 -0700 23 +++ b/bits/move.h 2011-03-29 10:33:39.000000000 -0700 24 @@ -48,13 +48,35 @@ 25 26 template<typename _Tp> 27 inline _Tp&& 28 - forward(typename std::identity<_Tp>::type&& __t) 29 + forward(typename std::remove_reference<_Tp>::type& __t) 30 +#ifdef __clang__ 31 + { return static_cast<_Tp&&>(__t); } 32 +#else 33 { return __t; } 34 +#endif 35 + 36 + template<typename _Tp> 37 + inline _Tp&& 38 + forward(typename std::remove_reference<_Tp>::type&& __t) 39 + { 40 +#ifdef __clang__ 41 + static_assert(!std::is_lvalue_reference<_Tp>::value, 42 + "Can't instantiate this forward() with an" 43 + " lvalue reference type."); 44 + return static_cast<_Tp&&>(__t); 45 +#else 46 + return __t; 47 +#endif 48 + } 49 50 template<typename _Tp> 51 inline typename std::remove_reference<_Tp>::type&& 52 move(_Tp&& __t) 53 +#ifdef __clang__ 54 + { return static_cast<typename std::remove_reference<_Tp>::type&&>(__t); } 55 +#else 56 { return __t; } 57 +#endif 58 59 _GLIBCXX_END_NAMESPACE 60 61 diff -ur a/bits/shared_ptr.h b/bits/shared_ptr.h 62 --- a/bits/shared_ptr.h 2011-03-15 14:49:05.000000000 -0700 63 +++ b/bits/shared_ptr.h 2011-03-31 16:40:45.000000000 -0700 64 @@ -833,7 +833,7 @@ 65 { return _M_refcount._M_get_use_count(); } 66 67 void 68 - swap(__shared_ptr<_Tp, _Lp>&& __other) // never throws 69 + swap(__shared_ptr<_Tp, _Lp>& __other) // never throws 70 { 71 std::swap(_M_ptr, __other._M_ptr); 72 _M_refcount._M_swap(__other._M_refcount); 73 @@ -943,16 +943,6 @@ 74 swap(__shared_ptr<_Tp, _Lp>& __a, __shared_ptr<_Tp, _Lp>& __b) 75 { __a.swap(__b); } 76 77 - template<typename _Tp, _Lock_policy _Lp> 78 - inline void 79 - swap(__shared_ptr<_Tp, _Lp>&& __a, __shared_ptr<_Tp, _Lp>& __b) 80 - { __a.swap(__b); } 81 - 82 - template<typename _Tp, _Lock_policy _Lp> 83 - inline void 84 - swap(__shared_ptr<_Tp, _Lp>& __a, __shared_ptr<_Tp, _Lp>&& __b) 85 - { __a.swap(__b); } 86 - 87 // 2.2.3.9 shared_ptr casts 88 /** @warning The seemingly equivalent 89 * <code>shared_ptr<_Tp, _Lp>(static_cast<_Tp*>(__r.get()))</code> 90 @@ -1372,16 +1362,6 @@ 91 swap(shared_ptr<_Tp>& __a, shared_ptr<_Tp>& __b) 92 { __a.swap(__b); } 93 94 - template<typename _Tp> 95 - inline void 96 - swap(shared_ptr<_Tp>&& __a, shared_ptr<_Tp>& __b) 97 - { __a.swap(__b); } 98 - 99 - template<typename _Tp> 100 - inline void 101 - swap(shared_ptr<_Tp>& __a, shared_ptr<_Tp>&& __b) 102 - { __a.swap(__b); } 103 - 104 // 20.8.13.2.10 shared_ptr casts. 105 template<typename _Tp, typename _Tp1> 106 inline shared_ptr<_Tp> 107 diff -ur a/bits/stl_bvector.h b/bits/stl_bvector.h 108 --- a/bits/stl_bvector.h 2011-03-15 14:49:05.000000000 -0700 109 +++ b/bits/stl_bvector.h 2011-05-02 23:34:46.000000000 -0700 110 @@ -743,11 +743,7 @@ 111 } 112 113 void 114 -#ifdef __GXX_EXPERIMENTAL_CXX0X__ 115 - swap(vector&& __x) 116 -#else 117 swap(vector& __x) 118 -#endif 119 { 120 std::swap(this->_M_impl._M_start, __x._M_impl._M_start); 121 std::swap(this->_M_impl._M_finish, __x._M_impl._M_finish); 122 diff -ur a/bits/stl_deque.h b/bits/stl_deque.h 123 --- a/bits/stl_deque.h 2011-03-15 14:49:05.000000000 -0700 124 +++ b/bits/stl_deque.h 2011-03-29 10:33:39.000000000 -0700 125 @@ -1395,11 +1395,7 @@ 126 * std::swap(d1,d2) will feed to this function. 127 */ 128 void 129 -#ifdef __GXX_EXPERIMENTAL_CXX0X__ 130 - swap(deque&& __x) 131 -#else 132 swap(deque& __x) 133 -#endif 134 { 135 std::swap(this->_M_impl._M_start, __x._M_impl._M_start); 136 std::swap(this->_M_impl._M_finish, __x._M_impl._M_finish); 137 diff -ur a/bits/stl_iterator.h b/bits/stl_iterator.h 138 --- a/bits/stl_iterator.h 2011-03-15 14:49:05.000000000 -0700 139 +++ b/bits/stl_iterator.h 2011-03-29 10:33:39.000000000 -0700 140 @@ -913,7 +913,7 @@ 141 142 reference 143 operator*() const 144 - { return *_M_current; } 145 + { return std::move(*_M_current); } 146 147 pointer 148 operator->() const 149 diff -ur a/bits/stl_list.h b/bits/stl_list.h 150 --- a/bits/stl_list.h 2011-03-15 14:49:05.000000000 -0700 151 +++ b/bits/stl_list.h 2011-03-29 10:33:39.000000000 -0700 152 @@ -1106,11 +1106,7 @@ 153 * function. 154 */ 155 void 156 -#ifdef __GXX_EXPERIMENTAL_CXX0X__ 157 - swap(list&& __x) 158 -#else 159 swap(list& __x) 160 -#endif 161 { 162 _List_node_base::swap(this->_M_impl._M_node, __x._M_impl._M_node); 163 164 @@ -1160,6 +1156,12 @@ 165 } 166 } 167 168 +#ifdef __GXX_EXPERIMENTAL_CXX0X__ 169 + void 170 + splice(iterator __position, list& __x) 171 + { splice(__position, std::move(__x)); } 172 +#endif 173 + 174 /** 175 * @brief Insert element from another %list. 176 * @param position Iterator referencing the element to insert before. 177 @@ -1187,6 +1189,12 @@ 178 this->_M_transfer(__position, __i, __j); 179 } 180 181 +#ifdef __GXX_EXPERIMENTAL_CXX0X__ 182 + void 183 + splice(iterator __position, list& __x, iterator __i) 184 + { splice(__position, std::move(__x), __i); } 185 +#endif 186 + 187 /** 188 * @brief Insert range from another %list. 189 * @param position Iterator referencing the element to insert before. 190 @@ -1217,6 +1225,13 @@ 191 } 192 } 193 194 +#ifdef __GXX_EXPERIMENTAL_CXX0X__ 195 + void 196 + splice(iterator __position, list& __x, iterator __first, 197 + iterator __last) 198 + { splice(__position, std::move(__x), __first, __last); } 199 +#endif 200 + 201 /** 202 * @brief Remove all elements equal to value. 203 * @param value The value to remove. 204 @@ -1287,6 +1302,10 @@ 205 void 206 #ifdef __GXX_EXPERIMENTAL_CXX0X__ 207 merge(list&& __x); 208 + 209 + void 210 + merge(list& __x) 211 + { merge(std::move(__x)); } 212 #else 213 merge(list& __x); 214 #endif 215 @@ -1307,6 +1326,11 @@ 216 void 217 #ifdef __GXX_EXPERIMENTAL_CXX0X__ 218 merge(list&&, _StrictWeakOrdering); 219 + 220 + template<typename _StrictWeakOrdering> 221 + void 222 + merge(list& __l, _StrictWeakOrdering __comp) 223 + { merge(std::move(__l), __comp); } 224 #else 225 merge(list&, _StrictWeakOrdering); 226 #endif 227 diff -ur a/bits/stl_map.h b/bits/stl_map.h 228 --- a/bits/stl_map.h 2011-03-15 14:49:05.000000000 -0700 229 +++ b/bits/stl_map.h 2011-03-29 10:33:39.000000000 -0700 230 @@ -608,11 +608,7 @@ 231 * that std::swap(m1,m2) will feed to this function. 232 */ 233 void 234 -#ifdef __GXX_EXPERIMENTAL_CXX0X__ 235 - swap(map&& __x) 236 -#else 237 swap(map& __x) 238 -#endif 239 { _M_t.swap(__x._M_t); } 240 241 /** 242 diff -ur a/bits/stl_multimap.h b/bits/stl_multimap.h 243 --- a/bits/stl_multimap.h 2011-03-15 14:49:05.000000000 -0700 244 +++ b/bits/stl_multimap.h 2011-03-29 10:33:39.000000000 -0700 245 @@ -544,11 +544,7 @@ 246 * std::swap(m1,m2) will feed to this function. 247 */ 248 void 249 -#ifdef __GXX_EXPERIMENTAL_CXX0X__ 250 - swap(multimap&& __x) 251 -#else 252 swap(multimap& __x) 253 -#endif 254 { _M_t.swap(__x._M_t); } 255 256 /** 257 diff -ur a/bits/stl_multiset.h b/bits/stl_multiset.h 258 --- a/bits/stl_multiset.h 2011-03-15 14:49:05.000000000 -0700 259 +++ b/bits/stl_multiset.h 2011-03-29 10:33:39.000000000 -0700 260 @@ -376,11 +376,7 @@ 261 * std::swap(s1,s2) will feed to this function. 262 */ 263 void 264 -#ifdef __GXX_EXPERIMENTAL_CXX0X__ 265 - swap(multiset&& __x) 266 -#else 267 swap(multiset& __x) 268 -#endif 269 { _M_t.swap(__x._M_t); } 270 271 // insert/erase 272 diff -ur a/bits/stl_pair.h b/bits/stl_pair.h 273 --- a/bits/stl_pair.h 2011-03-15 14:49:05.000000000 -0700 274 +++ b/bits/stl_pair.h 2011-03-29 10:33:39.000000000 -0700 275 @@ -84,10 +84,21 @@ 276 : first(__a), second(__b) { } 277 278 #ifdef __GXX_EXPERIMENTAL_CXX0X__ 279 - template<class _U1, class _U2> 280 + template<class _U1, class = typename 281 + std::enable_if<std::is_convertible<_U1, _T1>::value>::type> 282 + pair(_U1&& __x, const _T2& __y) 283 + : first(std::forward<_U1>(__x)), second(__y) { } 284 + 285 + template<class _U2, class = typename 286 + std::enable_if<std::is_convertible<_U2, _T2>::value>::type> 287 + pair(const _T1& __x, _U2&& __y) 288 + : first(__x), second(std::forward<_U2>(__y)) { } 289 + 290 + template<class _U1, class _U2, class = typename 291 + std::enable_if<std::is_convertible<_U1, _T1>::value 292 + && std::is_convertible<_U2, _T2>::value>::type> 293 pair(_U1&& __x, _U2&& __y) 294 - : first(std::forward<_U1>(__x)), 295 - second(std::forward<_U2>(__y)) { } 296 + : first(std::forward<_U1>(__x)), second(std::forward<_U2>(__y)) { } 297 298 pair(pair&& __p) 299 : first(std::move(__p.first)), 300 @@ -107,11 +118,19 @@ 301 second(std::move(__p.second)) { } 302 303 // http://gcc.gnu.org/ml/libstdc++/2007-08/msg00052.html 304 + 305 +#if 0 306 + // This constructor is incompatible with libstdc++-4.6, and it 307 + // interferes with passing NULL pointers to the 2-argument 308 + // constructors, so we disable it. map::emplace isn't 309 + // implemented in libstdc++-4.4 anyway, and that's what this 310 + // constructor was here for. 311 template<class _U1, class _Arg0, class... _Args> 312 pair(_U1&& __x, _Arg0&& __arg0, _Args&&... __args) 313 : first(std::forward<_U1>(__x)), 314 second(std::forward<_Arg0>(__arg0), 315 std::forward<_Args>(__args)...) { } 316 +#endif 317 318 pair& 319 operator=(pair&& __p) 320 @@ -131,7 +150,7 @@ 321 } 322 323 void 324 - swap(pair&& __p) 325 + swap(pair& __p) 326 { 327 using std::swap; 328 swap(first, __p.first); 329 diff -ur a/bits/stl_queue.h b/bits/stl_queue.h 330 --- a/bits/stl_queue.h 2011-03-15 14:49:05.000000000 -0700 331 +++ b/bits/stl_queue.h 2011-05-02 23:36:15.000000000 -0700 332 @@ -249,7 +249,7 @@ 333 334 #ifdef __GXX_EXPERIMENTAL_CXX0X__ 335 void 336 - swap(queue&& __q) 337 + swap(queue& __q) 338 { c.swap(__q.c); } 339 #endif 340 }; 341 @@ -550,7 +550,7 @@ 342 343 #ifdef __GXX_EXPERIMENTAL_CXX0X__ 344 void 345 - swap(priority_queue&& __pq) 346 + swap(priority_queue& __pq) 347 { 348 using std::swap; 349 c.swap(__pq.c); 350 diff -ur a/bits/stl_set.h b/bits/stl_set.h 351 --- a/bits/stl_set.h 2011-03-15 14:49:05.000000000 -0700 352 +++ b/bits/stl_set.h 2011-03-29 10:33:39.000000000 -0700 353 @@ -383,11 +383,7 @@ 354 * std::swap(s1,s2) will feed to this function. 355 */ 356 void 357 -#ifdef __GXX_EXPERIMENTAL_CXX0X__ 358 - swap(set&& __x) 359 -#else 360 swap(set& __x) 361 -#endif 362 { _M_t.swap(__x._M_t); } 363 364 // insert/erase 365 diff -ur a/bits/stl_stack.h b/bits/stl_stack.h 366 --- a/bits/stl_stack.h 2011-03-15 14:49:05.000000000 -0700 367 +++ b/bits/stl_stack.h 2011-05-02 23:36:36.000000000 -0700 368 @@ -213,7 +213,7 @@ 369 370 #ifdef __GXX_EXPERIMENTAL_CXX0X__ 371 void 372 - swap(stack&& __s) 373 + swap(stack& __s) 374 { c.swap(__s.c); } 375 #endif 376 }; 377 diff -ur a/bits/stl_tree.h b/bits/stl_tree.h 378 --- a/bits/stl_tree.h 2011-03-15 14:49:05.000000000 -0700 379 +++ b/bits/stl_tree.h 2011-03-29 10:33:39.000000000 -0700 380 @@ -675,11 +675,7 @@ 381 { return _M_get_Node_allocator().max_size(); } 382 383 void 384 -#ifdef __GXX_EXPERIMENTAL_CXX0X__ 385 - swap(_Rb_tree&& __t); 386 -#else 387 swap(_Rb_tree& __t); 388 -#endif 389 390 // Insert/erase. 391 pair<iterator, bool> 392 @@ -1104,11 +1100,7 @@ 393 typename _Compare, typename _Alloc> 394 void 395 _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>:: 396 -#ifdef __GXX_EXPERIMENTAL_CXX0X__ 397 - swap(_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>&& __t) 398 -#else 399 swap(_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>& __t) 400 -#endif 401 { 402 if (_M_root() == 0) 403 { 404 diff -ur a/bits/stl_vector.h b/bits/stl_vector.h 405 --- a/bits/stl_vector.h 2011-03-15 14:49:05.000000000 -0700 406 +++ b/bits/stl_vector.h 2011-03-29 10:33:39.000000000 -0700 407 @@ -923,11 +923,7 @@ 408 * std::swap(v1,v2) will feed to this function. 409 */ 410 void 411 -#ifdef __GXX_EXPERIMENTAL_CXX0X__ 412 - swap(vector&& __x) 413 -#else 414 swap(vector& __x) 415 -#endif 416 { 417 std::swap(this->_M_impl._M_start, __x._M_impl._M_start); 418 std::swap(this->_M_impl._M_finish, __x._M_impl._M_finish); 419 diff -ur a/bits/unique_ptr.h b/bits/unique_ptr.h 420 --- a/bits/unique_ptr.h 2011-03-15 14:49:05.000000000 -0700 421 +++ b/bits/unique_ptr.h 2011-03-31 16:40:45.000000000 -0700 422 @@ -204,7 +204,7 @@ 423 } 424 425 void 426 - swap(unique_ptr&& __u) 427 + swap(unique_ptr& __u) 428 { 429 using std::swap; 430 swap(_M_t, __u._M_t); 431 @@ -350,7 +350,7 @@ 432 void reset(_Up) = delete; 433 434 void 435 - swap(unique_ptr&& __u) 436 + swap(unique_ptr& __u) 437 { 438 using std::swap; 439 swap(_M_t, __u._M_t); 440 @@ -389,18 +389,6 @@ 441 unique_ptr<_Tp, _Tp_Deleter>& __y) 442 { __x.swap(__y); } 443 444 - template<typename _Tp, typename _Tp_Deleter> 445 - inline void 446 - swap(unique_ptr<_Tp, _Tp_Deleter>&& __x, 447 - unique_ptr<_Tp, _Tp_Deleter>& __y) 448 - { __x.swap(__y); } 449 - 450 - template<typename _Tp, typename _Tp_Deleter> 451 - inline void 452 - swap(unique_ptr<_Tp, _Tp_Deleter>& __x, 453 - unique_ptr<_Tp, _Tp_Deleter>&& __y) 454 - { __x.swap(__y); } 455 - 456 template<typename _Tp, typename _Tp_Deleter, 457 typename _Up, typename _Up_Deleter> 458 inline bool 459 diff -ur a/exception_ptr.h b/exception_ptr.h 460 --- a/exception_ptr.h 2011-03-15 14:49:08.000000000 -0700 461 +++ b/exception_ptr.h 2011-03-29 10:33:39.000000000 -0700 462 @@ -140,7 +140,7 @@ 463 friend bool 464 operator==(const exception_ptr&, const exception_ptr&) throw(); 465 466 - const type_info* 467 + const class type_info* 468 __cxa_exception_type() const throw(); 469 }; 470 471 diff -ur a/ext/algorithm b/ext/algorithm 472 --- a/ext/algorithm 2011-03-15 14:49:05.000000000 -0700 473 +++ b/ext/algorithm 2011-03-29 10:33:39.000000000 -0700 474 @@ -423,6 +423,9 @@ 475 __out_last - __out_first); 476 } 477 478 +#ifdef __GXX_EXPERIMENTAL_CXX0X__ 479 + using std::is_heap; 480 +#else 481 /** 482 * This is an SGI extension. 483 * @ingroup SGIextensions 484 @@ -462,6 +465,7 @@ 485 486 return std::__is_heap(__first, __comp, __last - __first); 487 } 488 +#endif 489 490 // is_sorted, a predicated testing whether a range is sorted in 491 // nondescending order. This is an extension, not part of the C++ 492 diff -ur a/ext/vstring.h b/ext/vstring.h 493 --- a/ext/vstring.h 2011-03-15 14:49:05.000000000 -0700 494 +++ b/ext/vstring.h 2011-03-29 10:33:39.000000000 -0700 495 @@ -152,7 +152,7 @@ 496 * string. 497 */ 498 __versa_string(__versa_string&& __str) 499 - : __vstring_base(std::forward<__vstring_base>(__str)) { } 500 + : __vstring_base(std::move(__str)) { } 501 502 /** 503 * @brief Construct string from an initializer list. 504 @@ -1439,11 +1439,7 @@ 505 * constant time. 506 */ 507 void 508 -#ifdef __GXX_EXPERIMENTAL_CXX0X__ 509 - swap(__versa_string&& __s) 510 -#else 511 swap(__versa_string& __s) 512 -#endif 513 { this->_M_swap(__s); } 514 515 // String operations: 516 diff -ur a/tr1_impl/hashtable b/tr1_impl/hashtable 517 --- a/tr1_impl/hashtable 2011-03-15 14:49:07.000000000 -0700 518 +++ b/tr1_impl/hashtable 2011-05-02 23:41:55.000000000 -0700 519 @@ -225,11 +225,7 @@ 520 521 ~_Hashtable(); 522 523 -#ifdef _GLIBCXX_INCLUDE_AS_CXX0X 524 - void swap(_Hashtable&&); 525 -#else 526 void swap(_Hashtable&); 527 -#endif 528 529 // Basic container operations 530 iterator 531 @@ -732,11 +728,7 @@ 532 void 533 _Hashtable<_Key, _Value, _Allocator, _ExtractKey, _Equal, 534 _H1, _H2, _Hash, _RehashPolicy, __chc, __cit, __uk>:: 535 -#ifdef _GLIBCXX_INCLUDE_AS_CXX0X 536 - swap(_Hashtable&& __x) 537 -#else 538 swap(_Hashtable& __x) 539 -#endif 540 { 541 // The only base class with member variables is hash_code_base. We 542 // define _Hash_code_base::_M_swap because different specializations 543 diff -ur a/tuple b/tuple 544 --- a/tuple 2011-03-15 14:49:07.000000000 -0700 545 +++ b/tuple 2011-05-02 23:33:23.000000000 -0700 546 @@ -77,7 +77,7 @@ 547 _Head& _M_head() { return *this; } 548 const _Head& _M_head() const { return *this; } 549 550 - void _M_swap_impl(_Head&&) { /* no-op */ } 551 + void _M_swap_impl(_Head&) { /* no-op */ } 552 }; 553 554 template<std::size_t _Idx, typename _Head> 555 @@ -97,7 +97,7 @@ 556 const _Head& _M_head() const { return _M_head_impl; } 557 558 void 559 - _M_swap_impl(_Head&& __h) 560 + _M_swap_impl(_Head& __h) 561 { 562 using std::swap; 563 swap(__h, _M_head_impl); 564 @@ -125,7 +125,7 @@ 565 struct _Tuple_impl<_Idx> 566 { 567 protected: 568 - void _M_swap_impl(_Tuple_impl&&) { /* no-op */ } 569 + void _M_swap_impl(_Tuple_impl&) { /* no-op */ } 570 }; 571 572 /** 573 @@ -214,7 +214,7 @@ 574 575 protected: 576 void 577 - _M_swap_impl(_Tuple_impl&& __in) 578 + _M_swap_impl(_Tuple_impl& __in) 579 { 580 _Base::_M_swap_impl(__in._M_head()); 581 _Inherited::_M_swap_impl(__in._M_tail()); 582 @@ -292,7 +292,7 @@ 583 } 584 585 void 586 - swap(tuple&& __in) 587 + swap(tuple& __in) 588 { _Inherited::_M_swap_impl(__in); } 589 }; 590 591 @@ -301,7 +301,7 @@ 592 class tuple<> 593 { 594 public: 595 - void swap(tuple&&) { /* no-op */ } 596 + void swap(tuple&) { /* no-op */ } 597 }; 598 599 /// tuple (2-element), with construction and assignment from a pair. 600 @@ -394,7 +394,7 @@ 601 } 602 603 void 604 - swap(tuple&& __in) 605 + swap(tuple& __in) 606 { 607 using std::swap; 608 swap(this->_M_head(), __in._M_head()); 609