diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2014-03-13 23:09:48 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2014-03-13 23:09:48 +0000 |
commit | a0492a1142963fdfe3ae7e409890b52ae4d25c27 (patch) | |
tree | fa0fc4d406de2ea69efb4b172a10445382f55f29 | |
parent | 68d17718e0bf76751a24d743796c8cf26a173a44 (diff) | |
download | src-a0492a1142963fdfe3ae7e409890b52ae4d25c27.tar.gz src-a0492a1142963fdfe3ae7e409890b52ae4d25c27.zip |
Pull in r201021 from upstream libc++ trunk:
Fix for PR18735 - self-assignment for map/multimap gives incorrect
results in C++03
(Please note: that is an LLVM PR identifier, not a FreeBSD one.)
Reported by: rakuco
MFC after: 3 days
Notes
Notes:
svn path=/head/; revision=263120
-rw-r--r-- | contrib/libc++/include/map | 20 | ||||
-rw-r--r-- | contrib/libc++/include/unordered_map | 28 |
2 files changed, 28 insertions, 20 deletions
diff --git a/contrib/libc++/include/map b/contrib/libc++/include/map index 009e8e2162c5..9779b70e2122 100644 --- a/contrib/libc++/include/map +++ b/contrib/libc++/include/map @@ -884,10 +884,12 @@ public: #if __cplusplus >= 201103L __tree_ = __m.__tree_; #else - __tree_.clear(); - __tree_.value_comp() = __m.__tree_.value_comp(); - __tree_.__copy_assign_alloc(__m.__tree_); - insert(__m.begin(), __m.end()); + if (this != &__m) { + __tree_.clear(); + __tree_.value_comp() = __m.__tree_.value_comp(); + __tree_.__copy_assign_alloc(__m.__tree_); + insert(__m.begin(), __m.end()); + } #endif return *this; } @@ -1616,10 +1618,12 @@ public: #if __cplusplus >= 201103L __tree_ = __m.__tree_; #else - __tree_.clear(); - __tree_.value_comp() = __m.__tree_.value_comp(); - __tree_.__copy_assign_alloc(__m.__tree_); - insert(__m.begin(), __m.end()); + if (this != &__m) { + __tree_.clear(); + __tree_.value_comp() = __m.__tree_.value_comp(); + __tree_.__copy_assign_alloc(__m.__tree_); + insert(__m.begin(), __m.end()); + } #endif return *this; } diff --git a/contrib/libc++/include/unordered_map b/contrib/libc++/include/unordered_map index 78fee4811fad..4e2298bf9b2f 100644 --- a/contrib/libc++/include/unordered_map +++ b/contrib/libc++/include/unordered_map @@ -831,12 +831,14 @@ public: #if __cplusplus >= 201103L __table_ = __u.__table_; #else - __table_.clear(); - __table_.hash_function() = __u.__table_.hash_function(); - __table_.key_eq() = __u.__table_.key_eq(); - __table_.max_load_factor() = __u.__table_.max_load_factor(); - __table_.__copy_assign_alloc(__u.__table_); - insert(__u.begin(), __u.end()); + if (this != &__u) { + __table_.clear(); + __table_.hash_function() = __u.__table_.hash_function(); + __table_.key_eq() = __u.__table_.key_eq(); + __table_.max_load_factor() = __u.__table_.max_load_factor(); + __table_.__copy_assign_alloc(__u.__table_); + insert(__u.begin(), __u.end()); + } #endif return *this; } @@ -1567,12 +1569,14 @@ public: #if __cplusplus >= 201103L __table_ = __u.__table_; #else - __table_.clear(); - __table_.hash_function() = __u.__table_.hash_function(); - __table_.key_eq() = __u.__table_.key_eq(); - __table_.max_load_factor() = __u.__table_.max_load_factor(); - __table_.__copy_assign_alloc(__u.__table_); - insert(__u.begin(), __u.end()); + if (this != &__u) { + __table_.clear(); + __table_.hash_function() = __u.__table_.hash_function(); + __table_.key_eq() = __u.__table_.key_eq(); + __table_.max_load_factor() = __u.__table_.max_load_factor(); + __table_.__copy_assign_alloc(__u.__table_); + insert(__u.begin(), __u.end()); + } #endif return *this; } |