summaryrefslogtreecommitdiffstats
path: root/libcxx
diff options
context:
space:
mode:
Diffstat (limited to 'libcxx')
-rw-r--r--libcxx/include/__debug1
-rw-r--r--libcxx/include/iterator7
-rw-r--r--libcxx/src/debug.cpp23
3 files changed, 26 insertions, 5 deletions
diff --git a/libcxx/include/__debug b/libcxx/include/__debug
index 4e80c6f8d74..e807fa5a41b 100644
--- a/libcxx/include/__debug
+++ b/libcxx/include/__debug
@@ -148,6 +148,7 @@ public:
::new(__n) _C_node<_Cont>(__n->__c_, __n->__next_);
}
+ void __insert_i(void* __i);
__c_node* __insert_c(void* __c);
void __erase_c(void* __c);
diff --git a/libcxx/include/iterator b/libcxx/include/iterator
index d5f1eb7da38..05019fddcef 100644
--- a/libcxx/include/iterator
+++ b/libcxx/include/iterator
@@ -1063,7 +1063,12 @@ public:
private:
iterator_type __i;
public:
- _LIBCPP_INLINE_VISIBILITY __wrap_iter() _NOEXCEPT {}
+ _LIBCPP_INLINE_VISIBILITY __wrap_iter() _NOEXCEPT
+ {
+#if _LIBCPP_DEBUG_LEVEL >= 2
+ __get_db()->__insert_i(this);
+#endif
+ }
template <class _Up> _LIBCPP_INLINE_VISIBILITY __wrap_iter(const __wrap_iter<_Up>& __u,
typename enable_if<is_convertible<_Up, iterator_type>::value>::type* = 0) _NOEXCEPT
: __i(__u.base())
diff --git a/libcxx/src/debug.cpp b/libcxx/src/debug.cpp
index 04d506341aa..2d2d6432df1 100644
--- a/libcxx/src/debug.cpp
+++ b/libcxx/src/debug.cpp
@@ -110,7 +110,9 @@ __libcpp_db::__find_c_from_i(void* __i) const
{
RLock _(mut());
__i_node* i = __find_iterator(__i);
- return i != nullptr ? (i->__c_ != nullptr ? i->__c_->__c_ : nullptr) : nullptr;
+ _LIBCPP_ASSERT(i != nullptr, "iterator constructed in translation unit with debug mode not enabled."
+ " #define _LIBCPP_DEBUG2 1 for that translation unit.");
+ return i->__c_ != nullptr ? i->__c_->__c_ : nullptr;
}
void
@@ -118,14 +120,20 @@ __libcpp_db::__insert_ic(void* __i, const void* __c)
{
WLock _(mut());
__i_node* i = __insert_iterator(__i);
- _LIBCPP_ASSERT(__cbeg_ != __cend_, "debug mode internal logic error __insert_ic A");
+ _LIBCPP_ASSERT(__cbeg_ != __cend_, "Container constructed in a translation unit with debug mode disabled."
+ " But it is being used in a translation unit with debug mode enabled."
+ " Enable it in the other translation unit with #define _LIBCPP_DEBUG2 1");
size_t hc = hash<const void*>()(__c) % (__cend_ - __cbeg_);
__c_node* c = __cbeg_[hc];
- _LIBCPP_ASSERT(c != nullptr, "debug mode internal logic error __insert_ic B");
+ _LIBCPP_ASSERT(c != nullptr, "Container constructed in a translation unit with debug mode disabled."
+ " But it is being used in a translation unit with debug mode enabled."
+ " Enable it in the other translation unit with #define _LIBCPP_DEBUG2 1");
while (c->__c_ != __c)
{
c = c->__next_;
- _LIBCPP_ASSERT(c != nullptr, "debug mode internal logic error __insert_ic C");
+ _LIBCPP_ASSERT(c != nullptr, "Container constructed in a translation unit with debug mode disabled."
+ " But it is being used in a translation unit with debug mode enabled."
+ " Enable it in the other translation unit with #define _LIBCPP_DEBUG2 1");
}
c->__add(i);
i->__c_ = c;
@@ -365,6 +373,13 @@ __libcpp_db::swap(void* c1, void* c2)
(*p)->__c_ = p2;
}
+void
+__libcpp_db::__insert_i(void* __i)
+{
+ WLock _(mut());
+ __insert_iterator(__i);
+}
+
// private api
_LIBCPP_HIDDEN
OpenPOWER on IntegriCloud