meta: safe self-assignment for meta_any

This commit is contained in:
skypjack
2025-10-07 17:33:45 +02:00
parent 740cf006d9
commit f73409e9ad
2 changed files with 14 additions and 14 deletions

View File

@@ -351,15 +351,10 @@ public:
/**
* @brief Move assignment operator.
*
* @warning
* Self-moving puts objects in a safe but unspecified state.
*
* @param other The instance to move from.
* @return This meta any object.
*/
meta_any &operator=(meta_any &&other) noexcept {
reset();
storage = std::move(other.storage);
ctx = other.ctx;
resolve = std::exchange(other.resolve, nullptr);

View File

@@ -372,9 +372,11 @@ TEST_F(MetaAny, SBOSelfMoveAssignment) {
// avoid warnings due to self-assignment
any = std::move(*&any);
ASSERT_FALSE(any);
ASSERT_FALSE(any.type());
ASSERT_EQ(any.base().data(), nullptr);
ASSERT_TRUE(any);
ASSERT_FALSE(any.try_cast<std::size_t>());
ASSERT_EQ(any.cast<int>(), 3);
ASSERT_EQ(any, entt::meta_any{3});
ASSERT_NE(any, entt::meta_any{0});
}
TEST_F(MetaAny, SBODirectAssignment) {
@@ -707,9 +709,11 @@ TEST_F(MetaAny, NoSBOSelfMoveAssignment) {
// avoid warnings due to self-assignment
any = std::move(*&any);
ASSERT_FALSE(any);
ASSERT_FALSE(any.type());
ASSERT_EQ(any.base().data(), nullptr);
ASSERT_TRUE(any);
ASSERT_FALSE(any.try_cast<std::size_t>());
ASSERT_EQ(any.cast<fat>(), instance);
ASSERT_EQ(any, entt::meta_any{instance});
ASSERT_NE(any, fat{});
}
TEST_F(MetaAny, NoSBODirectAssignment) {
@@ -962,9 +966,10 @@ TEST_F(MetaAny, VoidSelfMoveAssignment) {
// avoid warnings due to self-assignment
any = std::move(*&any);
ASSERT_FALSE(any);
ASSERT_FALSE(any.type());
ASSERT_EQ(any.base().data(), nullptr);
ASSERT_TRUE(any);
ASSERT_FALSE(any.try_cast<std::size_t>());
ASSERT_EQ(any.type(), entt::resolve<void>());
ASSERT_EQ(any, entt::meta_any{std::in_place_type<void>});
}
TEST_F(MetaAny, SBOMoveInvalidate) {