diff options
author | Martin Sebor <msebor@redhat.com> | 2019-12-09 20:54:11 +0000 |
---|---|---|
committer | Martin Sebor <msebor@gcc.gnu.org> | 2019-12-09 13:54:11 -0700 |
commit | 49070d06708a8d8ae3af767f89ac40c4c12dca7b (patch) | |
tree | a61f278fe57a15598a51858bffa5b56ac45978df /gcc/hash-map-tests.c | |
parent | ca6932ad0ccbbbe3c788cd71595d9a25b8ae0d20 (diff) | |
download | gcc-49070d06708a8d8ae3af767f89ac40c4c12dca7b.zip gcc-49070d06708a8d8ae3af767f89ac40c4c12dca7b.tar.gz gcc-49070d06708a8d8ae3af767f89ac40c4c12dca7b.tar.bz2 |
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
Diffstat (limited to 'gcc/hash-map-tests.c')
-rw-r--r-- | gcc/hash-map-tests.c | 25 |
1 files changed, 13 insertions, 12 deletions
diff --git a/gcc/hash-map-tests.c b/gcc/hash-map-tests.c index f3b216b..a42eac2 100644 --- a/gcc/hash-map-tests.c +++ b/gcc/hash-map-tests.c @@ -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); |