Просмотр исходного кода

meta: refine internal::meta_arg_node + code coverage

Michele Caini 3 лет назад
Родитель
Сommit
2f59f5a8fa
2 измененных файлов с 10 добавлено и 0 удалено
  1. 2 0
      src/entt/meta/node.hpp
  2. 8 0
      test/entt/meta/meta_utility.cpp

+ 2 - 0
src/entt/meta/node.hpp

@@ -5,6 +5,7 @@
 #include <memory>
 #include <type_traits>
 #include <utility>
+#include "../config/config.h"
 #include "../container/dense_map.hpp"
 #include "../core/attribute.h"
 #include "../core/enum.hpp"
@@ -141,6 +142,7 @@ template<typename... Args>
         return static_cast<element_type>(nullptr);
     } else {
         const element_type args[sizeof...(Args)]{&internal::resolve<std::remove_cv_t<std::remove_reference_t<Args>>>...};
+        ENTT_ASSERT(index < sizeof...(Args), "Out of bounds");
         return args[index];
     }
 }

+ 8 - 0
test/entt/meta/meta_utility.cpp

@@ -4,6 +4,7 @@
 #include <entt/meta/meta.hpp>
 #include <entt/meta/resolve.hpp>
 #include <entt/meta/utility.hpp>
+#include "../common/config.h"
 
 struct clazz {
     void setter(int v) {
@@ -51,6 +52,8 @@ struct MetaUtility: ::testing::Test {
     }
 };
 
+using MetaUtilityDeathTest = MetaUtility;
+
 TEST_F(MetaUtility, MetaDispatch) {
     int value = 42;
 
@@ -79,6 +82,11 @@ TEST_F(MetaUtility, MetaArg) {
     ASSERT_EQ((entt::meta_arg<entt::type_list<int, char>>(1u)), entt::resolve<char>());
 }
 
+ENTT_DEBUG_TEST_F(MetaUtilityDeathTest, MetaArg) {
+    ASSERT_DEATH([[maybe_unused]] auto type = entt::meta_arg<entt::type_list<>>(0u), "");
+    ASSERT_DEATH([[maybe_unused]] auto type = entt::meta_arg<entt::type_list<int>>(3u), "");
+}
+
 TEST_F(MetaUtility, MetaSetter) {
     const int invalid{};
     clazz instance{};