diff options
| author | Howard Hinnant <hhinnant@apple.com> | 2013-04-05 00:18:49 +0000 |
|---|---|---|
| committer | Howard Hinnant <hhinnant@apple.com> | 2013-04-05 00:18:49 +0000 |
| commit | b0e4c9d01bcba7480975e4cf94d6b568cd938298 (patch) | |
| tree | cc8d3d6773c0a301f4f1dbe13353a6957ba3d8ce /libcxx | |
| parent | 830f0b8d9f49157cbc270272fb86bae2d480364b (diff) | |
| download | bcm5719-llvm-b0e4c9d01bcba7480975e4cf94d6b568cd938298.tar.gz bcm5719-llvm-b0e4c9d01bcba7480975e4cf94d6b568cd938298.zip | |
More work on debug mode for list.
llvm-svn: 178819
Diffstat (limited to 'libcxx')
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 } |

