diff --git a/src/entt/core/any.hpp b/src/entt/core/any.hpp index dbdb3e7ea..13372ad93 100644 --- a/src/entt/core/any.hpp +++ b/src/entt/core/any.hpp @@ -484,7 +484,18 @@ public: */ [[nodiscard]] basic_any as_ref() noexcept { basic_any other = std::as_const(*this).as_ref(); - other.mode = (mode == any_policy::cref ? any_policy::cref : any_policy::ref); + + switch(mode) { + using enum any_policy; + case cref: + case empty: + other.mode = mode; + break; + default: + other.mode = any_policy::ref; + break; + } + return other; } diff --git a/test/entt/core/any.cpp b/test/entt/core/any.cpp index d70c7e17f..7c4f98796 100644 --- a/test/entt/core/any.cpp +++ b/test/entt/core/any.cpp @@ -57,6 +57,26 @@ TEST(Any, Empty) { ASSERT_EQ(any.data(), nullptr); } +TEST(Any, EmptyAsRef) { + entt::any any{}; + + ASSERT_FALSE(any); + ASSERT_FALSE(any.owner()); + ASSERT_EQ(any.policy(), entt::any_policy::empty); + ASSERT_EQ(any.info(), entt::type_id()); + ASSERT_EQ(entt::any_cast(&any), nullptr); + ASSERT_EQ(any.data(), nullptr); + + auto other = any.as_ref(); + + ASSERT_FALSE(other); + ASSERT_FALSE(other.owner()); + ASSERT_EQ(other.policy(), entt::any_policy::empty); + ASSERT_EQ(other.info(), entt::type_id()); + ASSERT_EQ(entt::any_cast(&other), nullptr); + ASSERT_EQ(other.data(), nullptr); +} + TEST(Any, HasValue) { entt::any any{}; diff --git a/test/entt/meta/meta_any.cpp b/test/entt/meta/meta_any.cpp index 2bc8bc6e6..d7c0305b3 100644 --- a/test/entt/meta/meta_any.cpp +++ b/test/entt/meta/meta_any.cpp @@ -131,6 +131,22 @@ TEST_F(MetaAny, Empty) { ASSERT_FALSE(std::as_const(any).as_associative_container()); } +TEST_F(MetaAny, EmptyAsRef) { + entt::meta_any any{}; + + ASSERT_FALSE(any); + ASSERT_FALSE(any.type()); + ASSERT_EQ(any.base().data(), nullptr); + ASSERT_EQ(any, entt::meta_any{}); + + auto other = any.as_ref(); + + ASSERT_FALSE(other); + ASSERT_FALSE(other.type()); + ASSERT_EQ(other.base().data(), nullptr); + ASSERT_EQ(other, entt::meta_any{}); +} + TEST_F(MetaAny, Context) { entt::meta_any any{}; const entt::meta_ctx ctx{};