diff options
Diffstat (limited to 'libcxx')
-rw-r--r-- | libcxx/include/__debug | 1 | ||||
-rw-r--r-- | libcxx/include/iterator | 7 | ||||
-rw-r--r-- | libcxx/src/debug.cpp | 23 |
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 |