diff --git a/include/__debug b/include/__debug index 4e80c6f8d..e807fa5a4 100644 --- a/include/__debug +++ b/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/include/iterator b/include/iterator index d5f1eb7da..05019fddc 100644 --- a/include/iterator +++ b/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 _LIBCPP_INLINE_VISIBILITY __wrap_iter(const __wrap_iter<_Up>& __u, typename enable_if::value>::type* = 0) _NOEXCEPT : __i(__u.base()) diff --git a/src/debug.cpp b/src/debug.cpp index 04d506341..2d2d6432d 100644 --- a/src/debug.cpp +++ b/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()(__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