https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92761
Martin Sebor <msebor at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Keywords| |build Status|RESOLVED |UNCONFIRMED Resolution|WONTFIX |--- --- Comment #5 from Martin Sebor <msebor at gcc dot gnu.org> --- Andrew, please avoid closing reports of valid problems that you don't understand. As I explained in comment #0, the hash_table invokes the assignment operator directly, without going through the traits class. The hash traits classes also don't provide an "assign" function, so defining such a class is not a solution. A test case that includes a traits class is below. struct S { S (): p (&p) { } S (const S &s): p (&p) { gcc_assert (s.p == &s.p); } S& operator= (const S &s) { gcc_assert (p == &p); gcc_assert (s.p == &s.p); return *this; } ~S () { gcc_assert (p == &p); } void *p; }; typedef int_hash<int, INT_MIN, 0> IntHash; template <class T> void destroy (T &x) { x.~T (); } template <> struct simple_hashmap_traits<IntHash, S> { typedef IntHash Traits; typedef Traits::value_type key_type; static hashval_t hash (key_type x) { return x; } static bool equal_keys (key_type x, key_type y) { return x == y; } template <typename T> static void remove (T &x) { Traits::remove (x.m_key); destroy (x.m_value); } template <typename T> static bool is_empty (const T &x) { return Traits::is_empty (x.m_key); } template <typename T> static bool is_deleted (const T &x) { return Traits::is_deleted (x.m_key); } template <typename T> static void mark_empty (T &x) { Traits::mark_empty (x.m_key); } template <typename T> static void mark_deleted (T &x) { Traits::mark_deleted (x.m_key); } }; hash_map<int, S, simple_hashmap_traits<IntHash, S> > x; static void test_hash_table () { for (int i = 1; i != 32; ++i) x.put (i, S ()); x.empty (); } /* Parse one entire translation unit. */ void c_parse_file (void) { test_hash_table (); ... } internal compiler error: in operator=, at cp/parser.c:43419 0xaeedd1 S::operator=(S const&) /src/gcc/61339/gcc/cp/parser.c:43419 0xaf3bb2 hash_map<int, S, simple_hashmap_traits<int_hash<int, -2147483648, 0>, S> >::hash_entry::operator=(hash_map<int, S, simple_hashmap_traits<int_hash<int, -2147483648, 0>, S> >::hash_entry const&) /src/gcc/61339/gcc/hash-map.h:42 0xaf3d58 hash_table<hash_map<int, S, simple_hashmap_traits<int_hash<int, -2147483648, 0>, S> >::hash_entry, false, xcallocator>::expand() /src/gcc/61339/gcc/hash-table.h:822 0xaf2259 hash_table<hash_map<int, S, simple_hashmap_traits<int_hash<int, -2147483648, 0>, S> >::hash_entry, false, xcallocator>::find_slot_with_hash(int const&, unsigned int, insert_option) /src/gcc/61339/gcc/hash-table.h:971 0xaf03b1 hash_map<int, S, simple_hashmap_traits<int_hash<int, -2147483648, 0>, S> >::put(int const&, S const&) /src/gcc/61339/gcc/hash-map.h:165 0xaea3b9 test_hash_table /src/gcc/61339/gcc/cp/parser.c:43477 0xaea3eb c_parse_file() /src/gcc/61339/gcc/cp/parser.c:43487 0xcd3645 c_common_parse_file() /src/gcc/61339/gcc/c-family/c-opts.c:1185 Please submit a full bug report,