From f73409e9adc3cf8243312060dff2ace1619dfe1f Mon Sep 17 00:00:00 2001 From: skypjack Date: Tue, 7 Oct 2025 17:33:45 +0200 Subject: [PATCH] meta: safe self-assignment for meta_any --- src/entt/meta/meta.hpp | 5 ----- test/entt/meta/meta_any.cpp | 23 ++++++++++++++--------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/entt/meta/meta.hpp b/src/entt/meta/meta.hpp index 43935f04a..c037ef232 100644 --- a/src/entt/meta/meta.hpp +++ b/src/entt/meta/meta.hpp @@ -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); diff --git a/test/entt/meta/meta_any.cpp b/test/entt/meta/meta_any.cpp index a7c2e87db..c3cb27b56 100644 --- a/test/entt/meta/meta_any.cpp +++ b/test/entt/meta/meta_any.cpp @@ -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()); + ASSERT_EQ(any.cast(), 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()); + ASSERT_EQ(any.cast(), 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()); + ASSERT_EQ(any.type(), entt::resolve()); + ASSERT_EQ(any, entt::meta_any{std::in_place_type}); } TEST_F(MetaAny, SBOMoveInvalidate) {