diff --git a/src/entt/container/dense_set.hpp b/src/entt/container/dense_set.hpp index fb604fb5b..9337bb6f9 100644 --- a/src/entt/container/dense_set.hpp +++ b/src/entt/container/dense_set.hpp @@ -275,8 +275,8 @@ class dense_set { return std::make_pair(it, false); } - const auto next = std::exchange(sparse.first()[index], packed.first().size()); - packed.first().emplace_back(next, std::forward(value)); + packed.first().emplace_back(sparse.first()[index], std::forward(value)); + sparse.first()[index] = packed.first().size() - 1u; rehash_if_required(); return std::make_pair(--end(), true); diff --git a/test/entt/container/dense_set.cpp b/test/entt/container/dense_set.cpp index a255774d9..b6d1a7875 100644 --- a/test/entt/container/dense_set.cpp +++ b/test/entt/container/dense_set.cpp @@ -832,6 +832,21 @@ TEST(DenseSet, ThrowingAllocator) { ASSERT_EQ(set.bucket_count(), minimum_bucket_count); ASSERT_THROW(set.reserve(2u * set.bucket_count()), packed_exception); ASSERT_EQ(set.bucket_count(), minimum_bucket_count); + + packed_allocator::trigger_on_allocate = true; + + ASSERT_THROW(set.emplace(), packed_exception); + ASSERT_FALSE(set.contains(0u)); + + packed_allocator::trigger_on_allocate = true; + + ASSERT_THROW(set.emplace(std::size_t{}), packed_exception); + ASSERT_FALSE(set.contains(0u)); + + packed_allocator::trigger_on_allocate = true; + + ASSERT_THROW(set.insert(0u), packed_exception); + ASSERT_FALSE(set.contains(0u)); } #if defined(ENTT_HAS_TRACKED_MEMORY_RESOURCE)