summaryrefslogtreecommitdiffstats
path: root/libcxx/test/std/containers
diff options
context:
space:
mode:
authorEric Fiselier <eric@efcs.ca>2019-07-11 23:13:38 +0000
committerEric Fiselier <eric@efcs.ca>2019-07-11 23:13:38 +0000
commit41798c05cd20401b3f77d12b8bfcb0437132021f (patch)
tree7cc2e4424b6e3dc941421df29e7d90adc5ac2369 /libcxx/test/std/containers
parent6f8f1a7db7b23dfa30d8de9df9450d8355475974 (diff)
downloadbcm5719-llvm-41798c05cd20401b3f77d12b8bfcb0437132021f.tar.gz
bcm5719-llvm-41798c05cd20401b3f77d12b8bfcb0437132021f.zip
Fix memory leak in set and map.
When assigning an initializer list into set/map, libc++ would leak memory if the initializer list contained equivalent keys because we failed to check if the insertion was successful. llvm-svn: 365840
Diffstat (limited to 'libcxx/test/std/containers')
-rw-r--r--libcxx/test/std/containers/associative/map/map.cons/assign_initializer_list.pass.cpp28
-rw-r--r--libcxx/test/std/containers/associative/set/set.cons/assign_initializer_list.pass.cpp35
2 files changed, 53 insertions, 10 deletions
diff --git a/libcxx/test/std/containers/associative/map/map.cons/assign_initializer_list.pass.cpp b/libcxx/test/std/containers/associative/map/map.cons/assign_initializer_list.pass.cpp
index c277e9e192d..f955135209c 100644
--- a/libcxx/test/std/containers/associative/map/map.cons/assign_initializer_list.pass.cpp
+++ b/libcxx/test/std/containers/associative/map/map.cons/assign_initializer_list.pass.cpp
@@ -19,10 +19,10 @@
#include "test_macros.h"
#include "min_allocator.h"
+#include "test_allocator.h"
-int main(int, char**)
-{
- {
+void test_basic() {
+ {
typedef std::pair<const int, double> V;
std::map<int, double> m =
{
@@ -70,6 +70,28 @@ int main(int, char**)
assert(*next(m.begin()) == V(2, 1));
assert(*next(m.begin(), 2) == V(3, 1));
}
+}
+
+
+void duplicate_keys_test() {
+ typedef std::map<int, int, std::less<int>, test_allocator<std::pair<const int, int> > > Map;
+ typedef test_alloc_base AllocBase;
+ {
+ LIBCPP_ASSERT(AllocBase::alloc_count == 0);
+ Map s = {{1, 0}, {2, 0}, {3, 0}};
+ LIBCPP_ASSERT(AllocBase::alloc_count == 3);
+ s = {{4, 0}, {4, 0}, {4, 0}, {4, 0}};
+ LIBCPP_ASSERT(AllocBase::alloc_count == 1);
+ assert(s.size() == 1);
+ assert(s.begin()->first == 4);
+ }
+ LIBCPP_ASSERT(AllocBase::alloc_count == 0);
+}
+
+int main(int, char**)
+{
+ test_basic();
+ duplicate_keys_test();
return 0;
}
diff --git a/libcxx/test/std/containers/associative/set/set.cons/assign_initializer_list.pass.cpp b/libcxx/test/std/containers/associative/set/set.cons/assign_initializer_list.pass.cpp
index e04f49c9993..3762446467e 100644
--- a/libcxx/test/std/containers/associative/set/set.cons/assign_initializer_list.pass.cpp
+++ b/libcxx/test/std/containers/associative/set/set.cons/assign_initializer_list.pass.cpp
@@ -16,13 +16,14 @@
#include <set>
#include <cassert>
+#include <iostream>
#include "test_macros.h"
#include "min_allocator.h"
+#include "test_allocator.h"
-int main(int, char**)
-{
- {
+void basic_test() {
+ {
typedef std::set<int> C;
typedef C::value_type V;
C m = {10, 8};
@@ -36,9 +37,9 @@ int main(int, char**)
assert(*++i == V(4));
assert(*++i == V(5));
assert(*++i == V(6));
- }
- {
- typedef std::set<int, std::less<int>, min_allocator<int>> C;
+ }
+ {
+ typedef std::set<int, std::less<int>, min_allocator<int> > C;
typedef C::value_type V;
C m = {10, 8};
m = {1, 2, 3, 4, 5, 6};
@@ -51,7 +52,27 @@ int main(int, char**)
assert(*++i == V(4));
assert(*++i == V(5));
assert(*++i == V(6));
- }
+ }
+}
+
+void duplicate_keys_test() {
+ typedef std::set<int, std::less<int>, test_allocator<int> > Set;
+ typedef test_alloc_base AllocBase;
+ {
+ LIBCPP_ASSERT(AllocBase::alloc_count == 0);
+ Set s = {1, 2, 3};
+ LIBCPP_ASSERT(AllocBase::alloc_count == 3);
+ s = {4, 4, 4, 4, 4};
+ LIBCPP_ASSERT(AllocBase::alloc_count == 1);
+ assert(s.size() == 1);
+ assert(*s.begin() == 4);
+ }
+ LIBCPP_ASSERT(AllocBase::alloc_count == 0);
+}
+
+int main(int, char**) {
+ basic_test();
+ duplicate_keys_test();
return 0;
}
OpenPOWER on IntegriCloud