Browse Source

meta: add missing checks on factory<...>::data

Michele Caini 2 years ago
parent
commit
28f03ff9ce
1 changed files with 10 additions and 8 deletions
  1. 10 8
      src/entt/meta/factory.hpp

+ 10 - 8
src/entt/meta/factory.hpp

@@ -330,32 +330,34 @@ public:
     template<auto Data, typename Policy = as_is_t>
     template<auto Data, typename Policy = as_is_t>
     auto data(const id_type id) noexcept {
     auto data(const id_type id) noexcept {
         if constexpr(std::is_member_object_pointer_v<decltype(Data)>) {
         if constexpr(std::is_member_object_pointer_v<decltype(Data)>) {
-            using data_type = std::remove_reference_t<std::invoke_result_t<decltype(Data), Type &>>;
+            using data_type = std::invoke_result_t<decltype(Data), Type &>;
+            static_assert(Policy::template value<data_type>, "Invalid return type for the given policy");
 
 
             auto &&elem = internal::meta_extend(
             auto &&elem = internal::meta_extend(
                 internal::owner(*ctx, *info),
                 internal::owner(*ctx, *info),
                 id,
                 id,
                 internal::meta_data_node{
                 internal::meta_data_node{
                     /* this is never static */
                     /* this is never static */
-                    std::is_const_v<data_type> ? internal::meta_traits::is_const : internal::meta_traits::is_none,
+                    std::is_const_v<std::remove_reference_t<data_type>> ? internal::meta_traits::is_const : internal::meta_traits::is_none,
                     1u,
                     1u,
-                    &internal::resolve<std::remove_cv_t<data_type>>,
-                    &meta_arg<type_list<std::remove_cv_t<data_type>>>,
+                    &internal::resolve<std::remove_cv_t<std::remove_reference_t<data_type>>>,
+                    &meta_arg<type_list<std::remove_cv_t<std::remove_reference_t<data_type>>>>,
                     &meta_setter<Type, Data>,
                     &meta_setter<Type, Data>,
                     &meta_getter<Type, Data, Policy>});
                     &meta_getter<Type, Data, Policy>});
 
 
             bucket = &elem.prop;
             bucket = &elem.prop;
         } else {
         } else {
-            using data_type = std::remove_reference_t<std::remove_pointer_t<decltype(Data)>>;
+            using data_type = std::remove_pointer_t<decltype(Data)>;
+            static_assert(Policy::template value<data_type>, "Invalid return type for the given policy");
 
 
             auto &&elem = internal::meta_extend(
             auto &&elem = internal::meta_extend(
                 internal::owner(*ctx, *info),
                 internal::owner(*ctx, *info),
                 id,
                 id,
                 internal::meta_data_node{
                 internal::meta_data_node{
-                    ((std::is_same_v<Type, std::remove_cv_t<data_type>> || std::is_const_v<data_type>) ? internal::meta_traits::is_const : internal::meta_traits::is_none) | internal::meta_traits::is_static,
+                    ((std::is_same_v<Type, std::remove_cv_t<std::remove_reference_t<data_type>>> || std::is_const_v<std::remove_reference_t<data_type>>) ? internal::meta_traits::is_const : internal::meta_traits::is_none) | internal::meta_traits::is_static,
                     1u,
                     1u,
-                    &internal::resolve<std::remove_cv_t<data_type>>,
-                    &meta_arg<type_list<std::remove_cv_t<data_type>>>,
+                    &internal::resolve<std::remove_cv_t<std::remove_reference_t<data_type>>>,
+                    &meta_arg<type_list<std::remove_cv_t<std::remove_reference_t<data_type>>>>,
                     &meta_setter<Type, Data>,
                     &meta_setter<Type, Data>,
                     &meta_getter<Type, Data, Policy>});
                     &meta_getter<Type, Data, Policy>});