mirror of git://gcc.gnu.org/git/gcc.git
vector.tcc (vector<>operator=(const vector<>&): Reset pointers after deallocation when memory can be reused.
2013-03-08 François Dumont <fdumont@gcc.gnu.org> * include/bits/vector.tcc (vector<>operator=(const vector<>&): Reset pointers after deallocation when memory can be reused. * testsuite/23_containers/vector/allocator/minimal.cc: Insert elements to really challenge C++11 allocator integration. * testsuite/23_containers/vector/allocator/copy.cc: Likewise. * testsuite/23_containers/vector/allocator/copy_assign.cc: Likewise. * testsuite/23_containers/vector/allocator/move_assign.cc: Likewise. * testsuite/23_containers/vector/allocator/swap.cc: Likewise and swap vector back before checks on memory/personality mapping are performed. * testsuite/23_containers/forward_list/allocator/minimal.cc: Insert element to really challenge C++11 allocator integration. * testsuite/23_containers/forward_list/allocator/copy.cc: Likewise. * testsuite/23_containers/forward_list/allocator/copy_assign.cc: Likewise. * testsuite/23_containers/forward_list/allocator/move_assign.cc: Likewise. * testsuite/23_containers/forward_list/allocator/swap.cc: Likewise and swap forward_list back before checks on memory/personality mapping are performed. From-SVN: r196557
This commit is contained in:
parent
6384c29bfc
commit
68d047cb48
|
|
@ -1,3 +1,29 @@
|
||||||
|
2013-03-08 François Dumont <fdumont@gcc.gnu.org>
|
||||||
|
|
||||||
|
* include/bits/vector.tcc (vector<>operator=(const vector<>&):
|
||||||
|
Reset pointers after deallocation when memory can be reused.
|
||||||
|
* testsuite/23_containers/vector/allocator/minimal.cc: Insert
|
||||||
|
elements to really challenge C++11 allocator integration.
|
||||||
|
* testsuite/23_containers/vector/allocator/copy.cc: Likewise.
|
||||||
|
* testsuite/23_containers/vector/allocator/copy_assign.cc:
|
||||||
|
Likewise.
|
||||||
|
* testsuite/23_containers/vector/allocator/move_assign.cc:
|
||||||
|
Likewise.
|
||||||
|
* testsuite/23_containers/vector/allocator/swap.cc: Likewise and
|
||||||
|
swap vector back before checks on memory/personality mapping are
|
||||||
|
performed.
|
||||||
|
* testsuite/23_containers/forward_list/allocator/minimal.cc:
|
||||||
|
Insert element to really challenge C++11 allocator integration.
|
||||||
|
* testsuite/23_containers/forward_list/allocator/copy.cc:
|
||||||
|
Likewise.
|
||||||
|
* testsuite/23_containers/forward_list/allocator/copy_assign.cc:
|
||||||
|
Likewise.
|
||||||
|
* testsuite/23_containers/forward_list/allocator/move_assign.cc:
|
||||||
|
Likewise.
|
||||||
|
* testsuite/23_containers/forward_list/allocator/swap.cc: Likewise
|
||||||
|
and swap forward_list back before checks on memory/personality
|
||||||
|
mapping are performed.
|
||||||
|
|
||||||
2013-03-07 Jakub Jelinek <jakub@redhat.com>
|
2013-03-07 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
* config/abi/post/i386-linux-gnu/baseline_symbols.txt: Update.
|
* config/abi/post/i386-linux-gnu/baseline_symbols.txt: Update.
|
||||||
|
|
|
||||||
|
|
@ -173,6 +173,9 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
|
||||||
_M_deallocate(this->_M_impl._M_start,
|
_M_deallocate(this->_M_impl._M_start,
|
||||||
this->_M_impl._M_end_of_storage
|
this->_M_impl._M_end_of_storage
|
||||||
- this->_M_impl._M_start);
|
- this->_M_impl._M_start);
|
||||||
|
this->_M_impl._M_start = nullptr;
|
||||||
|
this->_M_impl._M_finish = nullptr;
|
||||||
|
this->_M_impl._M_end_of_storage = nullptr;
|
||||||
}
|
}
|
||||||
std::__alloc_on_copy(_M_get_Tp_allocator(),
|
std::__alloc_on_copy(_M_get_Tp_allocator(),
|
||||||
__x._M_get_Tp_allocator());
|
__x._M_get_Tp_allocator());
|
||||||
|
|
|
||||||
|
|
@ -31,6 +31,7 @@ void test01()
|
||||||
typedef propagating_allocator<T, false> alloc_type;
|
typedef propagating_allocator<T, false> alloc_type;
|
||||||
typedef std::forward_list<T, alloc_type> test_type;
|
typedef std::forward_list<T, alloc_type> test_type;
|
||||||
test_type v1(alloc_type(1));
|
test_type v1(alloc_type(1));
|
||||||
|
v1.push_front(T());
|
||||||
test_type v2(v1);
|
test_type v2(v1);
|
||||||
VERIFY(1 == v1.get_allocator().get_personality());
|
VERIFY(1 == v1.get_allocator().get_personality());
|
||||||
VERIFY(0 == v2.get_allocator().get_personality());
|
VERIFY(0 == v2.get_allocator().get_personality());
|
||||||
|
|
@ -42,6 +43,7 @@ void test02()
|
||||||
typedef propagating_allocator<T, true> alloc_type;
|
typedef propagating_allocator<T, true> alloc_type;
|
||||||
typedef std::forward_list<T, alloc_type> test_type;
|
typedef std::forward_list<T, alloc_type> test_type;
|
||||||
test_type v1(alloc_type(1));
|
test_type v1(alloc_type(1));
|
||||||
|
v1.push_front(T());
|
||||||
test_type v2(v1);
|
test_type v2(v1);
|
||||||
VERIFY(1 == v1.get_allocator().get_personality());
|
VERIFY(1 == v1.get_allocator().get_personality());
|
||||||
VERIFY(1 == v2.get_allocator().get_personality());
|
VERIFY(1 == v2.get_allocator().get_personality());
|
||||||
|
|
|
||||||
|
|
@ -31,7 +31,9 @@ void test01()
|
||||||
typedef propagating_allocator<T, false> alloc_type;
|
typedef propagating_allocator<T, false> alloc_type;
|
||||||
typedef std::forward_list<T, alloc_type> test_type;
|
typedef std::forward_list<T, alloc_type> test_type;
|
||||||
test_type v1(alloc_type(1));
|
test_type v1(alloc_type(1));
|
||||||
|
v1.push_front(T());
|
||||||
test_type v2(alloc_type(2));
|
test_type v2(alloc_type(2));
|
||||||
|
v2.push_front(T());
|
||||||
v2 = v1;
|
v2 = v1;
|
||||||
VERIFY(1 == v1.get_allocator().get_personality());
|
VERIFY(1 == v1.get_allocator().get_personality());
|
||||||
VERIFY(2 == v2.get_allocator().get_personality());
|
VERIFY(2 == v2.get_allocator().get_personality());
|
||||||
|
|
@ -43,7 +45,9 @@ void test02()
|
||||||
typedef propagating_allocator<T, true> alloc_type;
|
typedef propagating_allocator<T, true> alloc_type;
|
||||||
typedef std::forward_list<T, alloc_type> test_type;
|
typedef std::forward_list<T, alloc_type> test_type;
|
||||||
test_type v1(alloc_type(1));
|
test_type v1(alloc_type(1));
|
||||||
|
v1.push_front(T());
|
||||||
test_type v2(alloc_type(2));
|
test_type v2(alloc_type(2));
|
||||||
|
v2.push_front(T());
|
||||||
v2 = v1;
|
v2 = v1;
|
||||||
VERIFY(1 == v1.get_allocator().get_personality());
|
VERIFY(1 == v1.get_allocator().get_personality());
|
||||||
VERIFY(1 == v2.get_allocator().get_personality());
|
VERIFY(1 == v2.get_allocator().get_personality());
|
||||||
|
|
|
||||||
|
|
@ -37,6 +37,7 @@ void test01()
|
||||||
typedef std::allocator_traits<alloc_type> traits_type;
|
typedef std::allocator_traits<alloc_type> traits_type;
|
||||||
typedef std::forward_list<T, alloc_type> test_type;
|
typedef std::forward_list<T, alloc_type> test_type;
|
||||||
test_type v(alloc_type{});
|
test_type v(alloc_type{});
|
||||||
|
v.push_front(T());
|
||||||
VERIFY( v.max_size() == traits_type::max_size(v.get_allocator()) );
|
VERIFY( v.max_size() == traits_type::max_size(v.get_allocator()) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -31,7 +31,9 @@ void test01()
|
||||||
typedef propagating_allocator<T, false> alloc_type;
|
typedef propagating_allocator<T, false> alloc_type;
|
||||||
typedef std::forward_list<T, alloc_type> test_type;
|
typedef std::forward_list<T, alloc_type> test_type;
|
||||||
test_type v1(alloc_type(1));
|
test_type v1(alloc_type(1));
|
||||||
|
v1.push_front(T());
|
||||||
test_type v2(alloc_type(2));
|
test_type v2(alloc_type(2));
|
||||||
|
v2.push_front(T());
|
||||||
v2 = std::move(v1);
|
v2 = std::move(v1);
|
||||||
VERIFY(1 == v1.get_allocator().get_personality());
|
VERIFY(1 == v1.get_allocator().get_personality());
|
||||||
VERIFY(2 == v2.get_allocator().get_personality());
|
VERIFY(2 == v2.get_allocator().get_personality());
|
||||||
|
|
@ -43,7 +45,9 @@ void test02()
|
||||||
typedef propagating_allocator<T, true> alloc_type;
|
typedef propagating_allocator<T, true> alloc_type;
|
||||||
typedef std::forward_list<T, alloc_type> test_type;
|
typedef std::forward_list<T, alloc_type> test_type;
|
||||||
test_type v1(alloc_type(1));
|
test_type v1(alloc_type(1));
|
||||||
|
v1.push_front(T());
|
||||||
test_type v2(alloc_type(2));
|
test_type v2(alloc_type(2));
|
||||||
|
v2.push_front(T());
|
||||||
v2 = std::move(v1);
|
v2 = std::move(v1);
|
||||||
VERIFY(0 == v1.get_allocator().get_personality());
|
VERIFY(0 == v1.get_allocator().get_personality());
|
||||||
VERIFY(1 == v2.get_allocator().get_personality());
|
VERIFY(1 == v2.get_allocator().get_personality());
|
||||||
|
|
|
||||||
|
|
@ -48,10 +48,14 @@ void test01()
|
||||||
typedef propagating_allocator<T, false> alloc_type;
|
typedef propagating_allocator<T, false> alloc_type;
|
||||||
typedef std::forward_list<T, alloc_type> test_type;
|
typedef std::forward_list<T, alloc_type> test_type;
|
||||||
test_type v1(alloc_type(1));
|
test_type v1(alloc_type(1));
|
||||||
|
v1.push_front(T());
|
||||||
test_type v2(alloc_type(2));
|
test_type v2(alloc_type(2));
|
||||||
|
v2.push_front(T());
|
||||||
std::swap(v1, v2);
|
std::swap(v1, v2);
|
||||||
VERIFY(1 == v1.get_allocator().get_personality());
|
VERIFY(1 == v1.get_allocator().get_personality());
|
||||||
VERIFY(2 == v2.get_allocator().get_personality());
|
VERIFY(2 == v2.get_allocator().get_personality());
|
||||||
|
// swap back so assertions in uneq_allocator::deallocate don't fail
|
||||||
|
std::swap(v1, v2);
|
||||||
}
|
}
|
||||||
|
|
||||||
void test02()
|
void test02()
|
||||||
|
|
@ -60,7 +64,9 @@ void test02()
|
||||||
typedef propagating_allocator<T, true> alloc_type;
|
typedef propagating_allocator<T, true> alloc_type;
|
||||||
typedef std::forward_list<T, alloc_type> test_type;
|
typedef std::forward_list<T, alloc_type> test_type;
|
||||||
test_type v1(alloc_type(1));
|
test_type v1(alloc_type(1));
|
||||||
|
v1.push_front(T());
|
||||||
test_type v2(alloc_type(2));
|
test_type v2(alloc_type(2));
|
||||||
|
v2.push_front(T());
|
||||||
std::swap(v1, v2);
|
std::swap(v1, v2);
|
||||||
VERIFY(2 == v1.get_allocator().get_personality());
|
VERIFY(2 == v1.get_allocator().get_personality());
|
||||||
VERIFY(1 == v2.get_allocator().get_personality());
|
VERIFY(1 == v2.get_allocator().get_personality());
|
||||||
|
|
|
||||||
|
|
@ -31,6 +31,7 @@ void test01()
|
||||||
typedef propagating_allocator<T, false> alloc_type;
|
typedef propagating_allocator<T, false> alloc_type;
|
||||||
typedef std::vector<T, alloc_type> test_type;
|
typedef std::vector<T, alloc_type> test_type;
|
||||||
test_type v1(alloc_type(1));
|
test_type v1(alloc_type(1));
|
||||||
|
v1.push_back(T());
|
||||||
test_type v2(v1);
|
test_type v2(v1);
|
||||||
VERIFY(1 == v1.get_allocator().get_personality());
|
VERIFY(1 == v1.get_allocator().get_personality());
|
||||||
VERIFY(0 == v2.get_allocator().get_personality());
|
VERIFY(0 == v2.get_allocator().get_personality());
|
||||||
|
|
@ -42,6 +43,7 @@ void test02()
|
||||||
typedef propagating_allocator<T, true> alloc_type;
|
typedef propagating_allocator<T, true> alloc_type;
|
||||||
typedef std::vector<T, alloc_type> test_type;
|
typedef std::vector<T, alloc_type> test_type;
|
||||||
test_type v1(alloc_type(1));
|
test_type v1(alloc_type(1));
|
||||||
|
v1.push_back(T());
|
||||||
test_type v2(v1);
|
test_type v2(v1);
|
||||||
VERIFY(1 == v1.get_allocator().get_personality());
|
VERIFY(1 == v1.get_allocator().get_personality());
|
||||||
VERIFY(1 == v2.get_allocator().get_personality());
|
VERIFY(1 == v2.get_allocator().get_personality());
|
||||||
|
|
|
||||||
|
|
@ -31,7 +31,9 @@ void test01()
|
||||||
typedef propagating_allocator<T, false> alloc_type;
|
typedef propagating_allocator<T, false> alloc_type;
|
||||||
typedef std::vector<T, alloc_type> test_type;
|
typedef std::vector<T, alloc_type> test_type;
|
||||||
test_type v1(alloc_type(1));
|
test_type v1(alloc_type(1));
|
||||||
|
v1.push_back(T());
|
||||||
test_type v2(alloc_type(2));
|
test_type v2(alloc_type(2));
|
||||||
|
v2.push_back(T());
|
||||||
v2 = v1;
|
v2 = v1;
|
||||||
VERIFY(1 == v1.get_allocator().get_personality());
|
VERIFY(1 == v1.get_allocator().get_personality());
|
||||||
VERIFY(2 == v2.get_allocator().get_personality());
|
VERIFY(2 == v2.get_allocator().get_personality());
|
||||||
|
|
@ -43,7 +45,9 @@ void test02()
|
||||||
typedef propagating_allocator<T, true> alloc_type;
|
typedef propagating_allocator<T, true> alloc_type;
|
||||||
typedef std::vector<T, alloc_type> test_type;
|
typedef std::vector<T, alloc_type> test_type;
|
||||||
test_type v1(alloc_type(1));
|
test_type v1(alloc_type(1));
|
||||||
|
v1.push_back(T());
|
||||||
test_type v2(alloc_type(2));
|
test_type v2(alloc_type(2));
|
||||||
|
v2.push_back(T());
|
||||||
v2 = v1;
|
v2 = v1;
|
||||||
VERIFY(1 == v1.get_allocator().get_personality());
|
VERIFY(1 == v1.get_allocator().get_personality());
|
||||||
VERIFY(1 == v2.get_allocator().get_personality());
|
VERIFY(1 == v2.get_allocator().get_personality());
|
||||||
|
|
|
||||||
|
|
@ -35,6 +35,7 @@ void test01()
|
||||||
typedef std::allocator_traits<alloc_type> traits_type;
|
typedef std::allocator_traits<alloc_type> traits_type;
|
||||||
typedef std::vector<T, alloc_type> test_type;
|
typedef std::vector<T, alloc_type> test_type;
|
||||||
test_type v(alloc_type{});
|
test_type v(alloc_type{});
|
||||||
|
v.push_back(T());
|
||||||
VERIFY( v.max_size() == traits_type::max_size(v.get_allocator()) );
|
VERIFY( v.max_size() == traits_type::max_size(v.get_allocator()) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -31,7 +31,9 @@ void test01()
|
||||||
typedef propagating_allocator<T, false> alloc_type;
|
typedef propagating_allocator<T, false> alloc_type;
|
||||||
typedef std::vector<T, alloc_type> test_type;
|
typedef std::vector<T, alloc_type> test_type;
|
||||||
test_type v1(alloc_type(1));
|
test_type v1(alloc_type(1));
|
||||||
|
v1.push_back(T());
|
||||||
test_type v2(alloc_type(2));
|
test_type v2(alloc_type(2));
|
||||||
|
v2.push_back(T());
|
||||||
v2 = std::move(v1);
|
v2 = std::move(v1);
|
||||||
VERIFY(1 == v1.get_allocator().get_personality());
|
VERIFY(1 == v1.get_allocator().get_personality());
|
||||||
VERIFY(2 == v2.get_allocator().get_personality());
|
VERIFY(2 == v2.get_allocator().get_personality());
|
||||||
|
|
@ -43,8 +45,10 @@ void test02()
|
||||||
typedef propagating_allocator<T, true> alloc_type;
|
typedef propagating_allocator<T, true> alloc_type;
|
||||||
typedef std::vector<T, alloc_type> test_type;
|
typedef std::vector<T, alloc_type> test_type;
|
||||||
test_type v1(alloc_type(1));
|
test_type v1(alloc_type(1));
|
||||||
|
v1.push_back(T());
|
||||||
test_type v2(alloc_type(2));
|
test_type v2(alloc_type(2));
|
||||||
v2 = std::move(v1);
|
v2 = std::move(v1);
|
||||||
|
v2.push_back(T());
|
||||||
VERIFY(0 == v1.get_allocator().get_personality());
|
VERIFY(0 == v1.get_allocator().get_personality());
|
||||||
VERIFY(1 == v2.get_allocator().get_personality());
|
VERIFY(1 == v2.get_allocator().get_personality());
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -48,10 +48,14 @@ void test01()
|
||||||
typedef propagating_allocator<T, false> alloc_type;
|
typedef propagating_allocator<T, false> alloc_type;
|
||||||
typedef std::vector<T, alloc_type> test_type;
|
typedef std::vector<T, alloc_type> test_type;
|
||||||
test_type v1(alloc_type(1));
|
test_type v1(alloc_type(1));
|
||||||
|
v1.push_back(T());
|
||||||
test_type v2(alloc_type(2));
|
test_type v2(alloc_type(2));
|
||||||
|
v2.push_back(T());
|
||||||
std::swap(v1, v2);
|
std::swap(v1, v2);
|
||||||
VERIFY(1 == v1.get_allocator().get_personality());
|
VERIFY(1 == v1.get_allocator().get_personality());
|
||||||
VERIFY(2 == v2.get_allocator().get_personality());
|
VERIFY(2 == v2.get_allocator().get_personality());
|
||||||
|
// swap back so assertions in uneq_allocator::deallocate don't fail
|
||||||
|
std::swap(v1, v2);
|
||||||
}
|
}
|
||||||
|
|
||||||
void test02()
|
void test02()
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue