From 287596d62d870ebf19c59226a93e80ba852497d9 Mon Sep 17 00:00:00 2001 From: Dmitry Marakasov <amdmi3@amdmi3.ru> Date: Fri, 3 Feb 2023 18:22:06 +0300 Subject: [PATCH] Handle the case when size_t and unsigned int are the same type Fixes #5527 --- CMakeLists.txt | 3 +++ buildopts.h.cmakein | 1 + src/lua/LuaPushPull.h | 5 +++++ 3 files changed, 9 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index c5c43b2059..e24c311c66 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -71,6 +71,9 @@ if (HAS_FECLEAREXCEPT AND HAS_FEENABLEEXCEPT AND HAS_FEDISABLEEXCEPT) set(HAS_FPE_OPS ON) endif() +include(CheckCXXSourceCompiles) +check_cxx_source_compiles("#include <cstddef>\nvoid foo(size_t){}; void foo(unsigned int){};int main(){}" SIZE_T_AND_UNSIGNED_INT_ARE_DIFFERENT_TYPES) + if (NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING "Choose the type of build, options are: None(CMAKE_CXX_FLAGS or CMAKE_C_FLAGS used) Debug Release RelWithDebInfo MinSizeRel." diff --git a/buildopts.h.cmakein b/buildopts.h.cmakein index 850b26f65b..0a879b63fd 100644 --- a/buildopts.h.cmakein +++ b/buildopts.h.cmakein @@ -9,6 +9,7 @@ #cmakedefine01 WITH_OBJECTVIEWER #cmakedefine01 WITH_DEVKEYS #cmakedefine01 HAS_FPE_OPS +#cmakedefine01 SIZE_T_AND_UNSIGNED_INT_ARE_DIFFERENT_TYPES #cmakedefine REMOTE_LUA_REPL #endif /* BUILDOPTS_H */ diff --git a/src/lua/LuaPushPull.h b/src/lua/LuaPushPull.h index 852f99ffd8..4a6981d80c 100644 --- a/src/lua/LuaPushPull.h +++ b/src/lua/LuaPushPull.h @@ -5,6 +5,7 @@ #define _LUAPUSHPULL_H #include "Lua.h" +#include "buildopts.h" #include <lua.hpp> #include <cstddef> @@ -15,7 +16,9 @@ inline void pi_lua_generic_push(lua_State *l, bool value) { lua_pushboolean(l, v inline void pi_lua_generic_push(lua_State *l, int value) { lua_pushinteger(l, value); } inline void pi_lua_generic_push(lua_State *l, int64_t value) { lua_pushinteger(l, value); } inline void pi_lua_generic_push(lua_State *l, unsigned int value) { lua_pushinteger(l, value); } +#if SIZE_T_AND_UNSIGNED_INT_ARE_DIFFERENT_TYPES inline void pi_lua_generic_push(lua_State *l, size_t value) { lua_pushinteger(l, value); } +#endif inline void pi_lua_generic_push(lua_State *l, double value) { lua_pushnumber(l, value); } inline void pi_lua_generic_push(lua_State *l, const char *value) { lua_pushstring(l, value); } inline void pi_lua_generic_push(lua_State *l, const std::string &value) @@ -32,7 +35,9 @@ inline void pi_lua_generic_pull(lua_State *l, int index, bool &out) { out = lua_ inline void pi_lua_generic_pull(lua_State *l, int index, int &out) { out = luaL_checkinteger(l, index); } inline void pi_lua_generic_pull(lua_State *l, int index, int64_t &out) { out = luaL_checkinteger(l, index); } inline void pi_lua_generic_pull(lua_State *l, int index, unsigned int &out) { out = luaL_checkunsigned(l, index); } +#if SIZE_T_AND_UNSIGNED_INT_ARE_DIFFERENT_TYPES inline void pi_lua_generic_pull(lua_State *l, int index, size_t &out) { out = luaL_checkunsigned(l, index); } +#endif inline void pi_lua_generic_pull(lua_State *l, int index, float &out) { out = luaL_checknumber(l, index); } inline void pi_lua_generic_pull(lua_State *l, int index, double &out) { out = luaL_checknumber(l, index); } inline void pi_lua_generic_pull(lua_State *l, int index, const char *&out) { out = luaL_checkstring(l, index); }