+2019-12-09 Martin Sebor <msebor@redhat.com>
+
+ PR middle-end/92761
+ PR middle-end/92762
+ * hash-map-tests.c (test_map_of_type_with_ctor_and_dtor): Tighten
+ up tests.
+ * hash-table.h (hash_table::expand): Use placement new to copy
+ construct objects in uninitialized storage.
+ (hash_table::empty_slow): Avoid invoking copy assignment on
+ uninitialized objects.
+
2019-12-09 Lewis Hyatt <lhyatt@gmail.com>
PR preprocessor/49973
++ndefault;
}
- hash_map_test_val_t (const hash_map_test_val_t &)
+ hash_map_test_val_t (const hash_map_test_val_t &rhs)
: ptr (&ptr)
{
++ncopy;
+ gcc_assert (rhs.ptr == &rhs.ptr);
}
- hash_map_test_val_t& operator= (const hash_map_test_val_t &)
- {
- ++nassign;
- return *this;
- }
+ hash_map_test_val_t& operator= (const hash_map_test_val_t &rhs)
+ {
+ ++nassign;
+ gcc_assert (ptr == &ptr);
+ gcc_assert (rhs.ptr == &rhs.ptr);
+ return *this;
+ }
~hash_map_test_val_t ()
- {
- gcc_assert (ptr == &ptr);
- ++ndtor;
- }
+ {
+ gcc_assert (ptr == &ptr);
+ ++ndtor;
+ }
void *ptr;
} val_t;
ASSERT_TRUE (nassign == val_t::nassign);
ASSERT_TRUE (&rv1 != pv2);
- ASSERT_TRUE (pv2->ptr == &pv2->ptr);
}
ASSERT_TRUE (val_t::ndefault + val_t::ncopy == val_t::ndtor);
ASSERT_TRUE (nassign + 1 == val_t::nassign);
ASSERT_TRUE (&rv1 != pv2);
- ASSERT_TRUE (pv2->ptr == &pv2->ptr);
}
ASSERT_TRUE (val_t::ndefault + val_t::ncopy == val_t::ndtor);
if (!is_empty (x) && !is_deleted (x))
{
value_type *q = find_empty_slot_for_expand (Descriptor::hash (x));
-
- *q = x;
+ new ((void*) q) value_type (x);
}
p++;
m_size_prime_index = nindex;
}
else
- {
-#ifndef BROKEN_VALUE_INITIALIZATION
- for ( ; size; ++entries, --size)
- *entries = value_type ();
-#else
- memset (entries, 0, size * sizeof (value_type));
-#endif
- }
+ memset ((void *) entries, 0, size * sizeof (value_type));
+
m_n_deleted = 0;
m_n_elements = 0;
}