[llvm] [StringMap] Invalidate iterators on mutation (PR #202237)

Felipe de Azevedo Piovezan via llvm-commits llvm-commits at lists.llvm.org
Wed Jun 10 07:08:41 PDT 2026


================
@@ -472,20 +490,31 @@ template <typename ValueTy, bool IsConst> class StringMapIterBase {
 
   StringMapIterBase() = default;
 
-  explicit StringMapIterBase(StringMapEntryBase **Bucket, bool Advance = false)
-      : Ptr(Bucket) {
+  explicit StringMapIterBase(const DebugEpochBase *Epoch,
+                             StringMapEntryBase **Bucket, bool Advance = false)
+      : DebugEpochBase::HandleBase(Epoch), Ptr(Bucket) {
     if (Advance)
       AdvancePastEmptyBuckets();
   }
 
+  // Converting ctor from non-const to const iterators. SFINAE'd out for const
+  // sources so it doesn't shadow the implicit copy constructor.
+  template <bool IsConstSrc,
+            typename = std::enable_if_t<!IsConstSrc && IsConst>>
+  StringMapIterBase(const StringMapIterBase<ValueTy, IsConstSrc> &I)
+      : DebugEpochBase::HandleBase(I), Ptr(I.Ptr) {}
+
   [[nodiscard]] reference operator*() const {
+    assert(isHandleInSync() && "invalid iterator access!");
     return *static_cast<value_type *>(*Ptr);
   }
   [[nodiscard]] pointer operator->() const {
+    assert(isHandleInSync() && "invalid iterator access!");
     return static_cast<value_type *>(*Ptr);
   }
 
   StringMapIterBase &operator++() { // Preincrement
+    assert(isHandleInSync() && "invalid iterator access!");
----------------
felipepiovezan wrote:

I think this assert is firing in an LLDB test.

https://github.com/llvm/llvm-project/pull/202237


More information about the llvm-commits mailing list