From 28f03ff9ce96ad6fd4d845bd9840cd50e06c9538 Mon Sep 17 00:00:00 2001 From: Michele Caini Date: Mon, 24 Apr 2023 09:50:57 +0200 Subject: [PATCH] meta: add missing checks on factory<...>::data --- src/entt/meta/factory.hpp | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/entt/meta/factory.hpp b/src/entt/meta/factory.hpp index d0cd1e113..006637f26 100644 --- a/src/entt/meta/factory.hpp +++ b/src/entt/meta/factory.hpp @@ -330,32 +330,34 @@ public: template auto data(const id_type id) noexcept { if constexpr(std::is_member_object_pointer_v) { - using data_type = std::remove_reference_t>; + using data_type = std::invoke_result_t; + static_assert(Policy::template value, "Invalid return type for the given policy"); auto &&elem = internal::meta_extend( internal::owner(*ctx, *info), id, internal::meta_data_node{ /* this is never static */ - std::is_const_v ? internal::meta_traits::is_const : internal::meta_traits::is_none, + std::is_const_v> ? internal::meta_traits::is_const : internal::meta_traits::is_none, 1u, - &internal::resolve>, - &meta_arg>>, + &internal::resolve>>, + &meta_arg>>>, &meta_setter, &meta_getter}); bucket = &elem.prop; } else { - using data_type = std::remove_reference_t>; + using data_type = std::remove_pointer_t; + static_assert(Policy::template value, "Invalid return type for the given policy"); auto &&elem = internal::meta_extend( internal::owner(*ctx, *info), id, internal::meta_data_node{ - ((std::is_same_v> || std::is_const_v) ? internal::meta_traits::is_const : internal::meta_traits::is_none) | internal::meta_traits::is_static, + ((std::is_same_v>> || std::is_const_v>) ? internal::meta_traits::is_const : internal::meta_traits::is_none) | internal::meta_traits::is_static, 1u, - &internal::resolve>, - &meta_arg>>, + &internal::resolve>>, + &meta_arg>>>, &meta_setter, &meta_getter});