summaryrefslogtreecommitdiff
path: root/libstdc++-v3
diff options
context:
space:
mode:
authorFrançois Dumont <fdumont@gcc.gnu.org>2013-03-08 20:08:20 +0000
committerFrançois Dumont <fdumont@gcc.gnu.org>2013-03-08 20:08:20 +0000
commit68d047cb48654a89da139e03c6c5e424734a194e (patch)
treeee1852eb35cadccb3742d5a9dfee615de4b02cba /libstdc++-v3
parent6384c29bfc15a772d876f5e26b68808560cf0ac3 (diff)
downloadgcc-68d047cb48654a89da139e03c6c5e424734a194e.tar.gz
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
Diffstat (limited to 'libstdc++-v3')
-rw-r--r--libstdc++-v3/ChangeLog26
-rw-r--r--libstdc++-v3/include/bits/vector.tcc3
-rw-r--r--libstdc++-v3/testsuite/23_containers/forward_list/allocator/copy.cc2
-rw-r--r--libstdc++-v3/testsuite/23_containers/forward_list/allocator/copy_assign.cc4
-rw-r--r--libstdc++-v3/testsuite/23_containers/forward_list/allocator/minimal.cc1
-rw-r--r--libstdc++-v3/testsuite/23_containers/forward_list/allocator/move_assign.cc4
-rw-r--r--libstdc++-v3/testsuite/23_containers/forward_list/allocator/swap.cc6
-rw-r--r--libstdc++-v3/testsuite/23_containers/vector/allocator/copy.cc2
-rw-r--r--libstdc++-v3/testsuite/23_containers/vector/allocator/copy_assign.cc4
-rw-r--r--libstdc++-v3/testsuite/23_containers/vector/allocator/minimal.cc1
-rw-r--r--libstdc++-v3/testsuite/23_containers/vector/allocator/move_assign.cc4
-rw-r--r--libstdc++-v3/testsuite/23_containers/vector/allocator/swap.cc4
12 files changed, 61 insertions, 0 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 3e1a53eb1ec..342c6a42d62 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -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>
* config/abi/post/i386-linux-gnu/baseline_symbols.txt: Update.
diff --git a/libstdc++-v3/include/bits/vector.tcc b/libstdc++-v3/include/bits/vector.tcc
index d48412ae65d..0882fe6884a 100644
--- a/libstdc++-v3/include/bits/vector.tcc
+++ b/libstdc++-v3/include/bits/vector.tcc
@@ -173,6 +173,9 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
_M_deallocate(this->_M_impl._M_start,
this->_M_impl._M_end_of_storage
- 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(),
__x._M_get_Tp_allocator());
diff --git a/libstdc++-v3/testsuite/23_containers/forward_list/allocator/copy.cc b/libstdc++-v3/testsuite/23_containers/forward_list/allocator/copy.cc
index 0c66c5153f2..f7e781ce9ec 100644
--- a/libstdc++-v3/testsuite/23_containers/forward_list/allocator/copy.cc
+++ b/libstdc++-v3/testsuite/23_containers/forward_list/allocator/copy.cc
@@ -31,6 +31,7 @@ void test01()
typedef propagating_allocator<T, false> alloc_type;
typedef std::forward_list<T, alloc_type> test_type;
test_type v1(alloc_type(1));
+ v1.push_front(T());
test_type v2(v1);
VERIFY(1 == v1.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 std::forward_list<T, alloc_type> test_type;
test_type v1(alloc_type(1));
+ v1.push_front(T());
test_type v2(v1);
VERIFY(1 == v1.get_allocator().get_personality());
VERIFY(1 == v2.get_allocator().get_personality());
diff --git a/libstdc++-v3/testsuite/23_containers/forward_list/allocator/copy_assign.cc b/libstdc++-v3/testsuite/23_containers/forward_list/allocator/copy_assign.cc
index 6f0f8e3bd11..e673b2e9e00 100644
--- a/libstdc++-v3/testsuite/23_containers/forward_list/allocator/copy_assign.cc
+++ b/libstdc++-v3/testsuite/23_containers/forward_list/allocator/copy_assign.cc
@@ -31,7 +31,9 @@ void test01()
typedef propagating_allocator<T, false> alloc_type;
typedef std::forward_list<T, alloc_type> test_type;
test_type v1(alloc_type(1));
+ v1.push_front(T());
test_type v2(alloc_type(2));
+ v2.push_front(T());
v2 = v1;
VERIFY(1 == v1.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 std::forward_list<T, alloc_type> test_type;
test_type v1(alloc_type(1));
+ v1.push_front(T());
test_type v2(alloc_type(2));
+ v2.push_front(T());
v2 = v1;
VERIFY(1 == v1.get_allocator().get_personality());
VERIFY(1 == v2.get_allocator().get_personality());
diff --git a/libstdc++-v3/testsuite/23_containers/forward_list/allocator/minimal.cc b/libstdc++-v3/testsuite/23_containers/forward_list/allocator/minimal.cc
index f6caecc1165..4d2a97856e0 100644
--- a/libstdc++-v3/testsuite/23_containers/forward_list/allocator/minimal.cc
+++ b/libstdc++-v3/testsuite/23_containers/forward_list/allocator/minimal.cc
@@ -37,6 +37,7 @@ void test01()
typedef std::allocator_traits<alloc_type> traits_type;
typedef std::forward_list<T, alloc_type> test_type;
test_type v(alloc_type{});
+ v.push_front(T());
VERIFY( v.max_size() == traits_type::max_size(v.get_allocator()) );
}
diff --git a/libstdc++-v3/testsuite/23_containers/forward_list/allocator/move_assign.cc b/libstdc++-v3/testsuite/23_containers/forward_list/allocator/move_assign.cc
index ae85f876670..b3532392cb9 100644
--- a/libstdc++-v3/testsuite/23_containers/forward_list/allocator/move_assign.cc
+++ b/libstdc++-v3/testsuite/23_containers/forward_list/allocator/move_assign.cc
@@ -31,7 +31,9 @@ void test01()
typedef propagating_allocator<T, false> alloc_type;
typedef std::forward_list<T, alloc_type> test_type;
test_type v1(alloc_type(1));
+ v1.push_front(T());
test_type v2(alloc_type(2));
+ v2.push_front(T());
v2 = std::move(v1);
VERIFY(1 == v1.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 std::forward_list<T, alloc_type> test_type;
test_type v1(alloc_type(1));
+ v1.push_front(T());
test_type v2(alloc_type(2));
+ v2.push_front(T());
v2 = std::move(v1);
VERIFY(0 == v1.get_allocator().get_personality());
VERIFY(1 == v2.get_allocator().get_personality());
diff --git a/libstdc++-v3/testsuite/23_containers/forward_list/allocator/swap.cc b/libstdc++-v3/testsuite/23_containers/forward_list/allocator/swap.cc
index a2e70b79862..b5b4480264b 100644
--- a/libstdc++-v3/testsuite/23_containers/forward_list/allocator/swap.cc
+++ b/libstdc++-v3/testsuite/23_containers/forward_list/allocator/swap.cc
@@ -48,10 +48,14 @@ void test01()
typedef propagating_allocator<T, false> alloc_type;
typedef std::forward_list<T, alloc_type> test_type;
test_type v1(alloc_type(1));
+ v1.push_front(T());
test_type v2(alloc_type(2));
+ v2.push_front(T());
std::swap(v1, v2);
VERIFY(1 == v1.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()
@@ -60,7 +64,9 @@ void test02()
typedef propagating_allocator<T, true> alloc_type;
typedef std::forward_list<T, alloc_type> test_type;
test_type v1(alloc_type(1));
+ v1.push_front(T());
test_type v2(alloc_type(2));
+ v2.push_front(T());
std::swap(v1, v2);
VERIFY(2 == v1.get_allocator().get_personality());
VERIFY(1 == v2.get_allocator().get_personality());
diff --git a/libstdc++-v3/testsuite/23_containers/vector/allocator/copy.cc b/libstdc++-v3/testsuite/23_containers/vector/allocator/copy.cc
index 5621a29e40f..f95c345b853 100644
--- a/libstdc++-v3/testsuite/23_containers/vector/allocator/copy.cc
+++ b/libstdc++-v3/testsuite/23_containers/vector/allocator/copy.cc
@@ -31,6 +31,7 @@ void test01()
typedef propagating_allocator<T, false> alloc_type;
typedef std::vector<T, alloc_type> test_type;
test_type v1(alloc_type(1));
+ v1.push_back(T());
test_type v2(v1);
VERIFY(1 == v1.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 std::vector<T, alloc_type> test_type;
test_type v1(alloc_type(1));
+ v1.push_back(T());
test_type v2(v1);
VERIFY(1 == v1.get_allocator().get_personality());
VERIFY(1 == v2.get_allocator().get_personality());
diff --git a/libstdc++-v3/testsuite/23_containers/vector/allocator/copy_assign.cc b/libstdc++-v3/testsuite/23_containers/vector/allocator/copy_assign.cc
index 49df3606185..89aac6f56da 100644
--- a/libstdc++-v3/testsuite/23_containers/vector/allocator/copy_assign.cc
+++ b/libstdc++-v3/testsuite/23_containers/vector/allocator/copy_assign.cc
@@ -31,7 +31,9 @@ void test01()
typedef propagating_allocator<T, false> alloc_type;
typedef std::vector<T, alloc_type> test_type;
test_type v1(alloc_type(1));
+ v1.push_back(T());
test_type v2(alloc_type(2));
+ v2.push_back(T());
v2 = v1;
VERIFY(1 == v1.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 std::vector<T, alloc_type> test_type;
test_type v1(alloc_type(1));
+ v1.push_back(T());
test_type v2(alloc_type(2));
+ v2.push_back(T());
v2 = v1;
VERIFY(1 == v1.get_allocator().get_personality());
VERIFY(1 == v2.get_allocator().get_personality());
diff --git a/libstdc++-v3/testsuite/23_containers/vector/allocator/minimal.cc b/libstdc++-v3/testsuite/23_containers/vector/allocator/minimal.cc
index e2600ae322b..1b66b50973a 100644
--- a/libstdc++-v3/testsuite/23_containers/vector/allocator/minimal.cc
+++ b/libstdc++-v3/testsuite/23_containers/vector/allocator/minimal.cc
@@ -35,6 +35,7 @@ void test01()
typedef std::allocator_traits<alloc_type> traits_type;
typedef std::vector<T, alloc_type> test_type;
test_type v(alloc_type{});
+ v.push_back(T());
VERIFY( v.max_size() == traits_type::max_size(v.get_allocator()) );
}
diff --git a/libstdc++-v3/testsuite/23_containers/vector/allocator/move_assign.cc b/libstdc++-v3/testsuite/23_containers/vector/allocator/move_assign.cc
index 6544493f512..64795d361c9 100644
--- a/libstdc++-v3/testsuite/23_containers/vector/allocator/move_assign.cc
+++ b/libstdc++-v3/testsuite/23_containers/vector/allocator/move_assign.cc
@@ -31,7 +31,9 @@ void test01()
typedef propagating_allocator<T, false> alloc_type;
typedef std::vector<T, alloc_type> test_type;
test_type v1(alloc_type(1));
+ v1.push_back(T());
test_type v2(alloc_type(2));
+ v2.push_back(T());
v2 = std::move(v1);
VERIFY(1 == v1.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 std::vector<T, alloc_type> test_type;
test_type v1(alloc_type(1));
+ v1.push_back(T());
test_type v2(alloc_type(2));
v2 = std::move(v1);
+ v2.push_back(T());
VERIFY(0 == v1.get_allocator().get_personality());
VERIFY(1 == v2.get_allocator().get_personality());
}
diff --git a/libstdc++-v3/testsuite/23_containers/vector/allocator/swap.cc b/libstdc++-v3/testsuite/23_containers/vector/allocator/swap.cc
index 70822c35a91..ce44cf80f88 100644
--- a/libstdc++-v3/testsuite/23_containers/vector/allocator/swap.cc
+++ b/libstdc++-v3/testsuite/23_containers/vector/allocator/swap.cc
@@ -48,10 +48,14 @@ void test01()
typedef propagating_allocator<T, false> alloc_type;
typedef std::vector<T, alloc_type> test_type;
test_type v1(alloc_type(1));
+ v1.push_back(T());
test_type v2(alloc_type(2));
+ v2.push_back(T());
std::swap(v1, v2);
VERIFY(1 == v1.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()