PR middle-end/92761 - hash_table::expand invokes assignment on invalid objects
PR middle-end/92761 - hash_table::expand invokes assignment on invalid objects PR middle-end/92762 - hash_table::empty_slow invokes assignment on invalid objects gcc/ChangeLog: 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. From-SVN: r279139
This commit is contained in:
parent
ca6932ad0c
commit
49070d0670
3 changed files with 27 additions and 22 deletions
|
@ -1,3 +1,14 @@
|
|||
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
|
||||
|
|
|
@ -117,23 +117,26 @@ public:
|
|||
++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;
|
||||
|
@ -184,7 +187,6 @@ test_map_of_type_with_ctor_and_dtor ()
|
|||
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);
|
||||
|
@ -207,7 +209,6 @@ test_map_of_type_with_ctor_and_dtor ()
|
|||
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);
|
||||
|
|
|
@ -818,8 +818,7 @@ hash_table<Descriptor, Lazy, Allocator>::expand ()
|
|||
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++;
|
||||
|
@ -869,14 +868,8 @@ hash_table<Descriptor, Lazy, Allocator>::empty_slow ()
|
|||
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;
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue