Bug in vector::swap() with unequal allocators ---------------------------------------------
Key: STDCXX-1037 URL: https://issues.apache.org/jira/browse/STDCXX-1037 Project: C++ Standard Library Issue Type: Bug Components: 23. Containers Affects Versions: 4.2.1, 4.2.0, 4.1.4, 4.1.3 Environment: All Reporter: Farid Zaripov Assignee: Farid Zaripov Priority: Minor Fix For: 4.2.2 The test below fails with assertion: {noformat} Assertion failed: 1 == v1.size() && 2 == v1.front(), file test.cpp, line 32 This application has requested the Runtime to terminate it in an unusual way. Please contact the application's support team for more information. {noformat} {code:title=test.cpp} #include <cassert> #include <memory> #include <vector> template <typename T> class Alloc : public std::allocator<T> { public: Alloc(int i) : i_(i) { } int i_; }; template <typename T> bool operator==(const Alloc<T>& a1, const Alloc<T>& a2) { return a1.i_ == a2.i_; } int main () { std::vector<int, Alloc<int> > v1(Alloc<int>(1)); v1.push_back(1); assert(1 == v1.size() && 1 == v1.front()); std::vector<int, Alloc<int> > v2(Alloc<int>(2)); v2.push_back(2); assert(1 == v2.size() && 2 == v2.front()); v1.swap(v2); assert(1 == v1.size() && 2 == v1.front()); assert(1 == v2.size() && 1 == v2.front()); return 0; } {code} The bug was introduced in [r355174|http://svn.apache.org/viewvc?view=rev&revision=355174] The proposed patch: {code:title=vector.cc.diff} Index: vector.cc =================================================================== --- vector.cc (revision 800774) +++ vector.cc (working copy) @@ -133,6 +133,7 @@ _RWSTD_ASSERT (__tmp.get_allocator () == __other.get_allocator ()); __tmp.assign (begin (), end ()); + assign (__other.begin (), __other.end ()); __other.swap (__tmp); } {code} -- This message is automatically generated by JIRA. - You can reply to this email to add a comment to the issue online.