From 61aa6013c3377203aff484cf3300ac26511c26ac Mon Sep 17 00:00:00 2001 From: Howard Hinnant Date: Fri, 1 Jul 2011 19:24:36 +0000 Subject: [PATCH] Correct for new rules regarding implicitly deleted special members. http://llvm.org/bugs/show_bug.cgi?id=10191 git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@134248 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/map | 14 ++ include/memory | 173 +++++++++++++++++- include/set | 14 ++ include/unordered_map | 14 +- include/unordered_set | 14 +- include/utility | 19 ++ .../func.wrap.func.con/copy.pass.cpp | 2 +- .../func.wrap.func.con/copy_assign.pass.cpp | 2 +- 8 files changed, 242 insertions(+), 10 deletions(-) diff --git a/include/map b/include/map index 9405617cc..2bb352376 100644 --- a/include/map +++ b/include/map @@ -755,6 +755,13 @@ public: insert(__m.begin(), __m.end()); } + _LIBCPP_INLINE_VISIBILITY + map& operator=(const map& __m) + { + __tree_ = __m.__tree_; + return *this; + } + #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES _LIBCPP_INLINE_VISIBILITY @@ -1497,6 +1504,13 @@ public: insert(__m.begin(), __m.end()); } + _LIBCPP_INLINE_VISIBILITY + multimap& operator=(const multimap& __m) + { + __tree_ = __m.__tree_; + return *this; + } + #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES _LIBCPP_INLINE_VISIBILITY diff --git a/include/memory b/include/memory index f2d6d716a..3a0064a91 100644 --- a/include/memory +++ b/include/memory @@ -1889,13 +1889,48 @@ public: _LIBCPP_INLINE_VISIBILITY __libcpp_compressed_pair_imp(_T1_param __t1, _T2_param __t2) : __first_(_VSTD::forward<_T1_param>(__t1)), __second_(_VSTD::forward<_T2_param>(__t2)) {} +#ifdef _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS + + _LIBCPP_INLINE_VISIBILITY + __libcpp_compressed_pair_imp(const __libcpp_compressed_pair_imp& __p) + _NOEXCEPT_(is_nothrow_copy_constructible<_T1>::value && + is_nothrow_copy_constructible<_T2>::value) + : __first_(__p.first()), + __second_(__p.second()) {} + + _LIBCPP_INLINE_VISIBILITY + __libcpp_compressed_pair_imp& operator=(const __libcpp_compressed_pair_imp& __p) + _NOEXCEPT_(is_nothrow_copy_assignable<_T1>::value && + is_nothrow_copy_assignable<_T2>::value) + { + __first_ = __p.first(); + __second_ = __p.second(); + return *this; + } + #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES - _LIBCPP_INLINE_VISIBILITY __libcpp_compressed_pair_imp(__libcpp_compressed_pair_imp&& __p) + + _LIBCPP_INLINE_VISIBILITY + __libcpp_compressed_pair_imp(__libcpp_compressed_pair_imp&& __p) _NOEXCEPT_(is_nothrow_move_constructible<_T1>::value && is_nothrow_move_constructible<_T2>::value) - : __first_(_VSTD::forward<_T1>(__p.first())), __second_(_VSTD::forward<_T2>(__p.second())) {} + : __first_(_VSTD::forward<_T1>(__p.first())), + __second_(_VSTD::forward<_T2>(__p.second())) {} + + _LIBCPP_INLINE_VISIBILITY + __libcpp_compressed_pair_imp& operator=(__libcpp_compressed_pair_imp&& __p) + _NOEXCEPT_(is_nothrow_move_assignable<_T1>::value && + is_nothrow_move_assignable<_T2>::value) + { + __first_ = _VSTD::forward<_T1>(__p.first()); + __second_ = _VSTD::forward<_T2>(__p.second()); + return *this; + } + #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES +#endif // _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS + _LIBCPP_INLINE_VISIBILITY _T1_reference first() _NOEXCEPT {return __first_;} _LIBCPP_INLINE_VISIBILITY _T1_const_reference first() const _NOEXCEPT {return __first_;} @@ -1936,13 +1971,46 @@ public: _LIBCPP_INLINE_VISIBILITY __libcpp_compressed_pair_imp(_T1_param __t1, _T2_param __t2) : _T1(_VSTD::forward<_T1_param>(__t1)), __second_(_VSTD::forward<_T2_param>(__t2)) {} +#ifdef _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS + + _LIBCPP_INLINE_VISIBILITY + __libcpp_compressed_pair_imp(const __libcpp_compressed_pair_imp& __p) + _NOEXCEPT_(is_nothrow_copy_constructible<_T1>::value && + is_nothrow_copy_constructible<_T2>::value) + : _T1(__p.first()), __second_(__p.second()) {} + + _LIBCPP_INLINE_VISIBILITY + __libcpp_compressed_pair_imp& operator=(const __libcpp_compressed_pair_imp& __p) + _NOEXCEPT_(is_nothrow_copy_assignable<_T1>::value && + is_nothrow_copy_assignable<_T2>::value) + { + _T1::operator=(__p.first()); + __second_ = __p.second(); + return *this; + } + #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES - _LIBCPP_INLINE_VISIBILITY __libcpp_compressed_pair_imp(__libcpp_compressed_pair_imp&& __p) + + _LIBCPP_INLINE_VISIBILITY + __libcpp_compressed_pair_imp(__libcpp_compressed_pair_imp&& __p) _NOEXCEPT_(is_nothrow_move_constructible<_T1>::value && is_nothrow_move_constructible<_T2>::value) : _T1(_VSTD::move(__p.first())), __second_(_VSTD::forward<_T2>(__p.second())) {} + + _LIBCPP_INLINE_VISIBILITY + __libcpp_compressed_pair_imp& operator=(__libcpp_compressed_pair_imp&& __p) + _NOEXCEPT_(is_nothrow_move_assignable<_T1>::value && + is_nothrow_move_assignable<_T2>::value) + { + _T1::operator=(_VSTD::move(__p.first())); + __second_ = _VSTD::forward<_T2>(__p.second()); + return *this; + } + #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES +#endif // _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS + _LIBCPP_INLINE_VISIBILITY _T1_reference first() _NOEXCEPT {return *this;} _LIBCPP_INLINE_VISIBILITY _T1_const_reference first() const _NOEXCEPT {return *this;} @@ -1984,11 +2052,46 @@ public: is_nothrow_move_constructible<_T2>::value) : _T2(_VSTD::forward<_T2_param>(__t2)), __first_(_VSTD::forward<_T1_param>(__t1)) {} +#ifdef _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS + + _LIBCPP_INLINE_VISIBILITY + __libcpp_compressed_pair_imp(const __libcpp_compressed_pair_imp& __p) + _NOEXCEPT_(is_nothrow_copy_constructible<_T1>::value && + is_nothrow_copy_constructible<_T2>::value) + : _T2(__p.second()), __first_(__p.first()) {} + + _LIBCPP_INLINE_VISIBILITY + __libcpp_compressed_pair_imp& operator=(const __libcpp_compressed_pair_imp& __p) + _NOEXCEPT_(is_nothrow_copy_assignable<_T1>::value && + is_nothrow_copy_assignable<_T2>::value) + { + _T2::operator=(__p.second()); + __first_ = __p.first(); + return *this; + } + #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + + _LIBCPP_INLINE_VISIBILITY __libcpp_compressed_pair_imp(__libcpp_compressed_pair_imp&& __p) + _NOEXCEPT_(is_nothrow_move_constructible<_T1>::value && + is_nothrow_move_constructible<_T2>::value) : _T2(_VSTD::forward<_T2>(__p.second())), __first_(_VSTD::move(__p.first())) {} + + _LIBCPP_INLINE_VISIBILITY + __libcpp_compressed_pair_imp& operator=(__libcpp_compressed_pair_imp&& __p) + _NOEXCEPT_(is_nothrow_move_assignable<_T1>::value && + is_nothrow_move_assignable<_T2>::value) + { + _T2::operator=(_VSTD::forward<_T2>(__p.second())); + __first_ = _VSTD::move(__p.first()); + return *this; + } + #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES +#endif // _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS + _LIBCPP_INLINE_VISIBILITY _T1_reference first() _NOEXCEPT {return __first_;} _LIBCPP_INLINE_VISIBILITY _T1_const_reference first() const _NOEXCEPT {return __first_;} @@ -2027,13 +2130,46 @@ public: _LIBCPP_INLINE_VISIBILITY __libcpp_compressed_pair_imp(_T1_param __t1, _T2_param __t2) : _T1(_VSTD::forward<_T1_param>(__t1)), _T2(_VSTD::forward<_T2_param>(__t2)) {} +#ifdef _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS + + _LIBCPP_INLINE_VISIBILITY + __libcpp_compressed_pair_imp(const __libcpp_compressed_pair_imp& __p) + _NOEXCEPT_(is_nothrow_copy_constructible<_T1>::value && + is_nothrow_copy_constructible<_T2>::value) + : _T1(__p.first()), _T2(__p.second()) {} + + _LIBCPP_INLINE_VISIBILITY + __libcpp_compressed_pair_imp& operator=(const __libcpp_compressed_pair_imp& __p) + _NOEXCEPT_(is_nothrow_copy_assignable<_T1>::value && + is_nothrow_copy_assignable<_T2>::value) + { + _T1::operator=(__p.first()); + _T2::operator=(__p.second()); + return *this; + } + #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES - _LIBCPP_INLINE_VISIBILITY __libcpp_compressed_pair_imp(__libcpp_compressed_pair_imp&& __p) + + _LIBCPP_INLINE_VISIBILITY + __libcpp_compressed_pair_imp(__libcpp_compressed_pair_imp&& __p) _NOEXCEPT_(is_nothrow_move_constructible<_T1>::value && is_nothrow_move_constructible<_T2>::value) : _T1(_VSTD::move(__p.first())), _T2(_VSTD::move(__p.second())) {} + + _LIBCPP_INLINE_VISIBILITY + __libcpp_compressed_pair_imp& operator=(__libcpp_compressed_pair_imp&& __p) + _NOEXCEPT_(is_nothrow_move_assignable<_T1>::value && + is_nothrow_move_assignable<_T2>::value) + { + _T1::operator=(_VSTD::move(__p.first())); + _T2::operator=(_VSTD::move(__p.second())); + return *this; + } + #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES +#endif // _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS + _LIBCPP_INLINE_VISIBILITY _T1_reference first() _NOEXCEPT {return *this;} _LIBCPP_INLINE_VISIBILITY _T1_const_reference first() const _NOEXCEPT {return *this;} @@ -2070,13 +2206,42 @@ public: _LIBCPP_INLINE_VISIBILITY __compressed_pair(_T1_param __t1, _T2_param __t2) : base(_VSTD::forward<_T1_param>(__t1), _VSTD::forward<_T2_param>(__t2)) {} +#ifdef _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS + + _LIBCPP_INLINE_VISIBILITY + __compressed_pair(const __compressed_pair& __p) + _NOEXCEPT_(is_nothrow_copy_constructible<_T1>::value && + is_nothrow_copy_constructible<_T2>::value) + : base(__p) {} + + _LIBCPP_INLINE_VISIBILITY + __compressed_pair& operator=(const __compressed_pair& __p) + _NOEXCEPT_(is_nothrow_copy_assignable<_T1>::value && + is_nothrow_copy_assignable<_T2>::value) + { + base::operator=(__p); + return *this; + } + #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES + _LIBCPP_INLINE_VISIBILITY __compressed_pair(__compressed_pair&& __p) _NOEXCEPT_(is_nothrow_move_constructible<_T1>::value && is_nothrow_move_constructible<_T2>::value) : base(_VSTD::move(__p)) {} + + _LIBCPP_INLINE_VISIBILITY + __compressed_pair& operator=(__compressed_pair&& __p) + _NOEXCEPT_(is_nothrow_move_assignable<_T1>::value && + is_nothrow_move_assignable<_T2>::value) + { + base::operator=(_VSTD::move(__p)); + return *this; + } #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES +#endif // _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS + _LIBCPP_INLINE_VISIBILITY _T1_reference first() _NOEXCEPT {return base::first();} _LIBCPP_INLINE_VISIBILITY _T1_const_reference first() const _NOEXCEPT {return base::first();} diff --git a/include/set b/include/set index 717703f19..9248fd79b 100644 --- a/include/set +++ b/include/set @@ -408,6 +408,13 @@ public: insert(__s.begin(), __s.end()); } + _LIBCPP_INLINE_VISIBILITY + set& operator=(const set& __s) + { + __tree_ = __s.__tree_; + return *this; + } + #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES _LIBCPP_INLINE_VISIBILITY set(set&& __s) @@ -738,6 +745,13 @@ public: insert(__s.begin(), __s.end()); } + _LIBCPP_INLINE_VISIBILITY + multiset& operator=(const multiset& __s) + { + __tree_ = __s.__tree_; + return *this; + } + #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES _LIBCPP_INLINE_VISIBILITY multiset(multiset&& __s) diff --git a/include/unordered_map b/include/unordered_map index 394be32df..e1381f761 100644 --- a/include/unordered_map +++ b/include/unordered_map @@ -691,7 +691,12 @@ public: const hasher& __hf, const key_equal& __eql, const allocator_type& __a); // ~unordered_map() = default; - // unordered_map& operator=(const unordered_map& __u) = default; + _LIBCPP_INLINE_VISIBILITY + unordered_map& operator=(const unordered_map& __u) + { + __table_ = __u.__table_; + return *this; + } #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES unordered_map& operator=(unordered_map&& __u) _NOEXCEPT_(is_nothrow_move_assignable<__table>::value); @@ -1295,7 +1300,12 @@ public: const hasher& __hf, const key_equal& __eql, const allocator_type& __a); // ~unordered_multimap() = default; - // unordered_multimap& operator=(const unordered_multimap& __u) = default; + _LIBCPP_INLINE_VISIBILITY + unordered_multimap& operator=(const unordered_multimap& __u) + { + __table_ = __u.__table_; + return *this; + } #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES unordered_multimap& operator=(unordered_multimap&& __u) _NOEXCEPT_(is_nothrow_move_assignable<__table>::value); diff --git a/include/unordered_set b/include/unordered_set index 2798a618a..2ef543348 100644 --- a/include/unordered_set +++ b/include/unordered_set @@ -373,7 +373,12 @@ public: const hasher& __hf, const key_equal& __eql, const allocator_type& __a); // ~unordered_set() = default; - // unordered_set& operator=(const unordered_set& __u) = default; + _LIBCPP_INLINE_VISIBILITY + unordered_set& operator=(const unordered_set& __u) + { + __table_ = __u.__table_; + return *this; + } #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES unordered_set& operator=(unordered_set&& __u) _NOEXCEPT_(is_nothrow_move_assignable<__table>::value); @@ -766,7 +771,12 @@ public: const hasher& __hf, const key_equal& __eql, const allocator_type& __a); // ~unordered_multiset() = default; - // unordered_multiset& operator=(const unordered_multiset& __u) = default; + _LIBCPP_INLINE_VISIBILITY + unordered_multiset& operator=(const unordered_multiset& __u) + { + __table_ = __u.__table_; + return *this; + } #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES unordered_multiset& operator=(unordered_multiset&& __u) _NOEXCEPT_(is_nothrow_move_assignable<__table>::value); diff --git a/include/utility b/include/utility index c4068593d..3850f8f35 100644 --- a/include/utility +++ b/include/utility @@ -231,8 +231,19 @@ struct _LIBCPP_VISIBLE pair is_convertible<_U2, _T2>::value>::type* = 0) : first(__p.first), second(__p.second) {} + _LIBCPP_INLINE_VISIBILITY + pair(const pair& __p) + _NOEXCEPT_(is_nothrow_copy_constructible::value && + is_nothrow_copy_constructible::value) + : first(__p.first), + second(__p.second) + { + } + _LIBCPP_INLINE_VISIBILITY pair& operator=(const pair& __p) + _NOEXCEPT_(is_nothrow_copy_assignable::value && + is_nothrow_copy_assignable::value) { first = __p.first; second = __p.second; @@ -258,6 +269,14 @@ struct _LIBCPP_VISIBLE pair : first(_VSTD::forward<_U1>(__p.first)), second(_VSTD::forward<_U2>(__p.second)) {} + _LIBCPP_INLINE_VISIBILITY + pair(pair&& __p) _NOEXCEPT_(is_nothrow_move_constructible::value && + is_nothrow_move_constructible::value) + : first(_VSTD::forward(__p.first)), + second(_VSTD::forward(__p.second)) + { + } + _LIBCPP_INLINE_VISIBILITY pair& operator=(pair&& __p) _NOEXCEPT_(is_nothrow_move_assignable::value && diff --git a/test/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/copy.pass.cpp b/test/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/copy.pass.cpp index bfce90105..0efb4d9ac 100644 --- a/test/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/copy.pass.cpp +++ b/test/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/copy.pass.cpp @@ -107,7 +107,7 @@ int main() assert(new_called == 1); assert(f.target()); assert(f.target() == 0); - std::function f2 = _STD::move(f); + std::function f2 = std::move(f); assert(A::count == 1); assert(new_called == 1); assert(f2.target()); diff --git a/test/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/copy_assign.pass.cpp b/test/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/copy_assign.pass.cpp index 714dbe956..544ec439b 100644 --- a/test/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/copy_assign.pass.cpp +++ b/test/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/copy_assign.pass.cpp @@ -111,7 +111,7 @@ int main() assert(f.target()); assert(f.target() == 0); std::function f2; - f2 = _STD::move(f); + f2 = std::move(f); assert(A::count == 1); assert(new_called == 1); assert(f2.target());