prevent hash set/map insertion of deleted entries
authorAlexandre Oliva <oliva@adacore.com>
Thu, 29 Dec 2022 17:33:07 +0000 (14:33 -0300)
committerAlexandre Oliva <oliva@gnu.org>
Thu, 29 Dec 2022 17:39:47 +0000 (14:39 -0300)
Just like the recently-added checks for empty entries, add checks for
deleted entries as well.  This didn't catch any problems, but it might
prevent future accidents.  Suggested by David Malcolm.

for  gcc/ChangeLog

* hash-map.h (put, get_or_insert): Check that added entry
doesn't look deleted either.
* hash-set.h (add): Likewise.

gcc/hash-map.h
gcc/hash-set.h

index 63fa21c..e6ca9cf 100644 (file)
@@ -173,8 +173,9 @@ public:
       if (ins)
        {
          e->m_key = k;
-         new ((void *) &e->m_value) Value (v);
-         gcc_checking_assert (!Traits::is_empty (*e));
+         new ((void *)&e->m_value) Value (v);
+         gcc_checking_assert (!Traits::is_empty (*e)
+                              && !Traits::is_deleted (*e));
        }
       else
        e->m_value = v;
@@ -204,7 +205,8 @@ public:
        {
          e->m_key = k;
          new ((void *)&e->m_value) Value ();
-         gcc_checking_assert (!Traits::is_empty (*e));
+         gcc_checking_assert (!Traits::is_empty (*e)
+                              && !Traits::is_deleted (*e));
        }
 
       if (existed != NULL)
index a98121a..08e1851 100644 (file)
@@ -61,7 +61,8 @@ public:
        {
          new (e) Key (k);
          // Catch attempts to insert e.g. a NULL pointer.
-         gcc_checking_assert (!Traits::is_empty (*e));
+         gcc_checking_assert (!Traits::is_empty (*e)
+                              && !Traits::is_deleted (*e));
        }
 
       return existed;