From 7608b4aac2bcdaa948387355a2248884758482ea Mon Sep 17 00:00:00 2001 From: Howard Hinnant Date: Fri, 16 Sep 2011 19:52:23 +0000 Subject: [PATCH] Doug Gregor pointed out some problems with debug mode enabled in one TU and not another. This patch helps detect those situations and offers improved error messages to help get debug mode enabled in more TU's when it is absolutely necessary to do so. Thanks Doug. git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@139933 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/__debug | 1 + include/iterator | 7 ++++++- src/debug.cpp | 23 +++++++++++++++++++---- 3 files changed, 26 insertions(+), 5 deletions(-) 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