https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82977

Jakub Jelinek <jakub at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|NEW                         |ASSIGNED
           Assignee|unassigned at gcc dot gnu.org      |jakub at gcc dot gnu.org

--- Comment #3 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
Created attachment 42599
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=42599&action=edit
gcc8-pr82977.patch

Untested fix.  The bug is obvious, hash_map::put does:
  bool put (const Key &k, const Value &v)
    {
      hash_entry *e = m_table.find_slot_with_hash (k, Traits::hash (k),
                                                   INSERT);
      bool existed = !hash_entry::is_empty (*e);
      if (!existed)
        e->m_key = k;

      e->m_value = v;
      return existed;
    }
so passing it a reference to a value inside of the hash map is wrong, because
if the hash map needs to be reallocated, it will make the reference refer to
freed memory.

I'll bootstrap/regtest this.

In any case,
static hash_map<tree, stridx_strlenloc> strlen_to_stridx;
is also wrong because it uselessly requires static initialization.  See e.g.
decl_to_stridxlist_htab next to it, that is a pointer to hash_map instead.

Reply via email to