summaryrefslogtreecommitdiffstats
path: root/libcxx
diff options
context:
space:
mode:
authorHoward Hinnant <hhinnant@apple.com>2013-04-05 00:18:49 +0000
committerHoward Hinnant <hhinnant@apple.com>2013-04-05 00:18:49 +0000
commitb0e4c9d01bcba7480975e4cf94d6b568cd938298 (patch)
treecc8d3d6773c0a301f4f1dbe13353a6957ba3d8ce /libcxx
parent830f0b8d9f49157cbc270272fb86bae2d480364b (diff)
downloadbcm5719-llvm-b0e4c9d01bcba7480975e4cf94d6b568cd938298.tar.gz
bcm5719-llvm-b0e4c9d01bcba7480975e4cf94d6b568cd938298.zip
More work on debug mode for list.
llvm-svn: 178819
Diffstat (limited to 'libcxx')
-rw-r--r--libcxx/include/list11
-rw-r--r--libcxx/test/containers/sequences/list/list.modifiers/emplace.pass.cpp12
-rw-r--r--libcxx/test/containers/sequences/list/list.modifiers/insert_iter_iter_iter.pass.cpp19
-rw-r--r--libcxx/test/containers/sequences/list/list.modifiers/insert_iter_rvalue.pass.cpp12
-rw-r--r--libcxx/test/containers/sequences/list/list.modifiers/insert_iter_size_value.pass.cpp12
-rw-r--r--libcxx/test/containers/sequences/list/list.modifiers/insert_iter_value.pass.cpp13
-rw-r--r--libcxx/test/containers/sequences/list/list.modifiers/pop_back.pass.cpp8
7 files changed, 87 insertions, 0 deletions
diff --git a/libcxx/include/list b/libcxx/include/list
index 06904d965f1..6040e7a4cc9 100644
--- a/libcxx/include/list
+++ b/libcxx/include/list
@@ -1292,7 +1292,11 @@ list<_Tp, _Alloc>::insert(const_iterator __p, const value_type& __x)
__node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), __x);
__link_nodes(const_cast<__node&>(*__p.__ptr_), *__hold, *__hold);
++base::__sz();
+#if _LIBCPP_DEBUG_LEVEL >= 2
+ return iterator(__hold.release(), this);
+#else
return iterator(__hold.release());
+#endif
}
template <class _Tp, class _Alloc>
@@ -1518,6 +1522,11 @@ template <class... _Args>
typename list<_Tp, _Alloc>::iterator
list<_Tp, _Alloc>::emplace(const_iterator __p, _Args&&... __args)
{
+#if _LIBCPP_DEBUG_LEVEL >= 2
+ _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
+ "list::emplace(iterator, args...) called with an iterator not"
+ " referring to this list");
+#endif
__node_allocator& __na = base::__node_alloc();
typedef __allocator_destructor<__node_allocator> _Dp;
unique_ptr<__node, _Dp> __hold(__node_alloc_traits::allocate(__na, 1), _Dp(__na, 1));
@@ -1624,6 +1633,8 @@ list<_Tp, _Alloc>::erase(const_iterator __p)
"list::erase(iterator) called with an iterator not"
" referring to this list");
#endif
+ _LIBCPP_ASSERT(__p != end(),
+ "list::erase(iterator) called with a non-dereferenceable iterator");
__node_allocator& __na = base::__node_alloc();
__node& __n = const_cast<__node&>(*__p.__ptr_);
__node_pointer __r = __n.__next_;
diff --git a/libcxx/test/containers/sequences/list/list.modifiers/emplace.pass.cpp b/libcxx/test/containers/sequences/list/list.modifiers/emplace.pass.cpp
index 703b034b053..218c42b8117 100644
--- a/libcxx/test/containers/sequences/list/list.modifiers/emplace.pass.cpp
+++ b/libcxx/test/containers/sequences/list/list.modifiers/emplace.pass.cpp
@@ -11,6 +11,10 @@
// template <class... Args> void emplace(const_iterator p, Args&&... args);
+#if _LIBCPP_DEBUG2 >= 1
+#define _LIBCPP_ASSERT(x, m) ((x) ? (void)0 : std::exit(0))
+#endif
+
#include <list>
#include <cassert>
@@ -44,4 +48,12 @@ int main()
assert(c.back().geti() == 3);
assert(c.back().getd() == 4.5);
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
+#if _LIBCPP_DEBUG2 >= 1
+ {
+ std::list<A> c1;
+ std::list<A> c2;
+ std::list<A>::iterator i = c1.emplace(c2.cbegin(), 2, 3.5);
+ assert(false);
+ }
+#endif
}
diff --git a/libcxx/test/containers/sequences/list/list.modifiers/insert_iter_iter_iter.pass.cpp b/libcxx/test/containers/sequences/list/list.modifiers/insert_iter_iter_iter.pass.cpp
index 37f3e85685f..e8ea2a87997 100644
--- a/libcxx/test/containers/sequences/list/list.modifiers/insert_iter_iter_iter.pass.cpp
+++ b/libcxx/test/containers/sequences/list/list.modifiers/insert_iter_iter_iter.pass.cpp
@@ -12,9 +12,14 @@
// template <InputIterator Iter>
// iterator insert(const_iterator position, Iter first, Iter last);
+#if _LIBCPP_DEBUG2 >= 1
+#define _LIBCPP_ASSERT(x, m) ((x) ? (void)0 : std::exit(0))
+#endif
+
#include <list>
#include <cstdlib>
#include <cassert>
+#include "test_iterators.h"
int throw_next = 0xFFFF;
int count = 0;
@@ -36,6 +41,7 @@ void operator delete(void* p) throw()
int main()
{
+ {
int a1[] = {1, 2, 3};
std::list<int> l1;
std::list<int>::iterator i = l1.insert(l1.begin(), a1, a1+3);
@@ -90,4 +96,17 @@ int main()
assert(*i == 6);
++i;
assert(*i == 3);
+ }
+#if _LIBCPP_DEBUG2 >= 1
+ {
+ throw_next = 0xFFFF;
+ std::list<int> v(100);
+ std::list<int> v2(100);
+ int a[] = {1, 2, 3, 4, 5};
+ const int N = sizeof(a)/sizeof(a[0]);
+ std::list<int>::iterator i = v.insert(next(v2.cbegin(), 10), input_iterator<const int*>(a),
+ input_iterator<const int*>(a+N));
+ assert(false);
+ }
+#endif
}
diff --git a/libcxx/test/containers/sequences/list/list.modifiers/insert_iter_rvalue.pass.cpp b/libcxx/test/containers/sequences/list/list.modifiers/insert_iter_rvalue.pass.cpp
index d5ca6e5a8f4..3c352249c67 100644
--- a/libcxx/test/containers/sequences/list/list.modifiers/insert_iter_rvalue.pass.cpp
+++ b/libcxx/test/containers/sequences/list/list.modifiers/insert_iter_rvalue.pass.cpp
@@ -11,6 +11,10 @@
// iterator insert(const_iterator position, value_type&& x);
+#if _LIBCPP_DEBUG2 >= 1
+#define _LIBCPP_ASSERT(x, m) ((x) ? (void)0 : std::exit(0))
+#endif
+
#include <list>
#include <cassert>
@@ -28,4 +32,12 @@ int main()
assert(l1.front() == MoveOnly(2));
assert(l1.back() == MoveOnly(1));
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
+#if _LIBCPP_DEBUG2 >= 1
+ {
+ std::list<int> v1(3);
+ std::list<int> v2(3);
+ v1.insert(v2.begin(), 4);
+ assert(false);
+ }
+#endif
}
diff --git a/libcxx/test/containers/sequences/list/list.modifiers/insert_iter_size_value.pass.cpp b/libcxx/test/containers/sequences/list/list.modifiers/insert_iter_size_value.pass.cpp
index acb9e148256..9221a7fef44 100644
--- a/libcxx/test/containers/sequences/list/list.modifiers/insert_iter_size_value.pass.cpp
+++ b/libcxx/test/containers/sequences/list/list.modifiers/insert_iter_size_value.pass.cpp
@@ -11,6 +11,10 @@
// iterator insert(const_iterator position, size_type n, const value_type& x);
+#if _LIBCPP_DEBUG2 >= 1
+#define _LIBCPP_ASSERT(x, m) ((x) ? (void)0 : std::exit(0))
+#endif
+
#include <list>
#include <cstdlib>
#include <cassert>
@@ -54,4 +58,12 @@ int main()
throw_next = 0xFFFF;
assert(save_count == count);
assert(l1 == std::list<int>(a2, a2+8));
+#if _LIBCPP_DEBUG2 >= 1
+ {
+ std::list<int> c1(100);
+ std::list<int> c2;
+ std::list<int>::iterator i = c1.insert(next(c2.cbegin(), 10), 5, 1);
+ assert(false);
+ }
+#endif
}
diff --git a/libcxx/test/containers/sequences/list/list.modifiers/insert_iter_value.pass.cpp b/libcxx/test/containers/sequences/list/list.modifiers/insert_iter_value.pass.cpp
index fb09d77326b..6ea2a176aa4 100644
--- a/libcxx/test/containers/sequences/list/list.modifiers/insert_iter_value.pass.cpp
+++ b/libcxx/test/containers/sequences/list/list.modifiers/insert_iter_value.pass.cpp
@@ -11,6 +11,10 @@
// iterator insert(const_iterator position, const value_type& x);
+#if _LIBCPP_DEBUG2 >= 1
+#define _LIBCPP_ASSERT(x, m) ((x) ? (void)0 : std::exit(0))
+#endif
+
#include <list>
#include <cstdlib>
#include <cassert>
@@ -56,4 +60,13 @@ int main()
throw_next = 0xFFFF;
assert(save_count == count);
assert(l1 == std::list<int>(a2, a2+4));
+#if _LIBCPP_DEBUG2 >= 1
+ {
+ std::list<int> v1(3);
+ std::list<int> v2(3);
+ int i = 4;
+ v1.insert(v2.begin(), i);
+ assert(false);
+ }
+#endif
}
diff --git a/libcxx/test/containers/sequences/list/list.modifiers/pop_back.pass.cpp b/libcxx/test/containers/sequences/list/list.modifiers/pop_back.pass.cpp
index cb25c3c2b62..97105fd80db 100644
--- a/libcxx/test/containers/sequences/list/list.modifiers/pop_back.pass.cpp
+++ b/libcxx/test/containers/sequences/list/list.modifiers/pop_back.pass.cpp
@@ -11,6 +11,10 @@
// void pop_back();
+#if _LIBCPP_DEBUG2 >= 1
+#define _LIBCPP_ASSERT(x, m) ((x) ? (void)0 : std::exit(0))
+#endif
+
#include <list>
#include <cassert>
@@ -24,4 +28,8 @@ int main()
assert(c == std::list<int>(a, a+1));
c.pop_back();
assert(c.empty());
+#if _LIBCPP_DEBUG2 >= 1
+ c.pop_back();
+ assert(false);
+#endif
}
OpenPOWER on IntegriCloud