Skip to content

Commit

Permalink
πŸ›  Address lifetime issues through Lua references in iterators.
Browse files Browse the repository at this point in the history
β€” πŸ“ Fixes #1315, #1374, and #1400.
β€” πŸ“ Lifetime in iterators was referencing the wrong stack (the main thread) rather than the coroutine's stack at time of creation.
β€” πŸ“ Using main_reference/main_* objects was a suitable enough fix for most of these problems.
β€” βš‘πŸ›  Prevent performance and usability issues from changing containers by storing the being/end iterator separately, rather than continually invoking `deferred_uc::end(…)` every time.
β€” πŸ›  Improve sizes for stored iterators in select cases.
β€” πŸ›  Allow for sentinel-style C++20-and-beyond ranges.
β€” πŸ”§ Improve single file generation CMake.
β€” πŸ‘·β€β™€οΈ Fix up internal Lua build system issues.
  • Loading branch information
ShepherdSoasis committed Jul 17, 2023
1 parent eab1430 commit 334f855
Show file tree
Hide file tree
Showing 46 changed files with 712 additions and 136 deletions.
2 changes: 1 addition & 1 deletion cmake/Packages/FindKaguyaBuild.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ ExternalProject_Add(KAGUYA_BUILD_SOURCE
add_library(${kaguya_lib} INTERFACE)
add_dependencies(${kaguya_lib} KAGUYA_BUILD_SOURCE)
target_include_directories(${kaguya_lib} INTERFACE ${kaguya_include_dirs})
target_link_libraries(${kaguya_lib} INTERFACE ${LUA_LIBRARIES})
target_link_libraries(${kaguya_lib} INTERFACE Lua::Lua)
if (NOT MSVC)
target_compile_options(${kaguya_lib} INTERFACE
-Wno-noexcept-type -Wno-ignored-qualifiers -Wno-unused-parameter)
Expand Down
2 changes: 1 addition & 1 deletion cmake/Packages/FindLuaBridgeBuild.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ ExternalProject_Add(LUABRIDGE_BUILD_SOURCE
add_library(${luabridge_lib} INTERFACE)
add_dependencies(${luabridge_lib} LUABRIDGE_BUILD_SOURCE)
target_include_directories(${luabridge_lib} INTERFACE ${luabridge_include_dirs})
target_link_libraries(${luabridge_lib} INTERFACE ${LUA_LIBRARIES})
target_link_libraries(${luabridge_lib} INTERFACE Lua::Lua)
if (NOT MSVC)
target_compile_options(${luabridge_lib} INTERFACE
-Wno-noexcept-type -Wno-ignored-qualifiers -Wno-unused-parameter)
Expand Down
2 changes: 1 addition & 1 deletion cmake/Packages/FindLuaBuild.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ function(find_lua_build LUA_VERSION)
endif()

# # Export variables to the parent scope
set(LUA_LIBRARIES ${LUA_LIBRARIES} PARENT_SCOPE)
set(LUA_LIBRARIES Lua::Lua PARENT_SCOPE)
set(LUA_INTERPRETER ${LUA_INTERPRETER} PARENT_SCOPE)
set(LUA_INCLUDE_DIRS ${LUA_INCLUDE_DIRS} PARENT_SCOPE)
set(LUA_VERSION_STRING ${LUA_VERSION_STRING} PARENT_SCOPE)
Expand Down
43 changes: 23 additions & 20 deletions cmake/Packages/FindLuaBuild/LuaVanilla.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -103,20 +103,20 @@ if (LUA_VANILLA_VERSION MATCHES "^5\\.1")
lbaselib.c ldblib.c liolib.c lmathlib.c loslib.c ltablib.c
lstrlib.c loadlib.c linit.c)
set(LUA_VANILLA_LUA_SOURCES lua.c )
if (LUA_BUILD_LUA_COMPILER)
set(LUA_VANILLA_LUAC_SOURCES luac.c print.c )
endif()
if (LUA_BUILD_LUA_COMPILER)
set(LUA_VANILLA_LUAC_SOURCES luac.c print.c)
endif()
set(LUA_VANILLA_GENERATE_LUA_HPP true)
elseif (LUA_VANILLA_VERSION MATCHES "^5\\.2")
set(LUA_VANILLA_LIB_SOURCES lapi.c lcode.c lctype.c ldebug.c ldo.c ldump.c
set(LUA_VANILLA_LIB_SOURCES lapi.c lbitlib.c lcode.c lctype.c ldebug.c ldo.c ldump.c
lfunc.c lgc.c llex.c lmem.c lobject.c lopcodes.c lparser.c
lstate.c lstring.c ltable.c ltm.c lundump.c lvm.c lzio.c
lauxlib.c lbaselib.c lcorolib.c ldblib.c liolib.c
lmathlib.c loslib.c lstrlib.c ltablib.c loadlib.c linit.c)
set(LUA_VANILLA_LUA_SOURCES lua.c )
if (LUA_BUILD_LUA_COMPILER)
set(LUA_VANILLA_LUAC_SOURCES luac.c )
endif()
set(LUA_VANILLA_LUA_SOURCES lua.c)
if (LUA_BUILD_LUA_COMPILER)
set(LUA_VANILLA_LUAC_SOURCES luac.c)
endif()
set(LUA_VANILLA_GENERATE_LUA_HPP false)
elseif (LUA_VANILLA_VERSION MATCHES "^5\\.3")
set(LUA_VANILLA_LIB_SOURCES lapi.c lcode.c lctype.c ldebug.c ldo.c ldump.c
Expand All @@ -125,9 +125,9 @@ elseif (LUA_VANILLA_VERSION MATCHES "^5\\.3")
lbaselib.c lbitlib.c lcorolib.c ldblib.c liolib.c lmathlib.c
loslib.c lstrlib.c ltablib.c lutf8lib.c loadlib.c linit.c)
set(LUA_VANILLA_LUA_SOURCES lua.c )
if (LUA_BUILD_LUA_COMPILER)
set(LUA_VANILLA_LUAC_SOURCES luac.c )
endif()
if (LUA_BUILD_LUA_COMPILER)
set(LUA_VANILLA_LUAC_SOURCES luac.c)
endif()
set(LUA_VANILLA_GENERATE_LUA_HPP false)
elseif (LUA_VANILLA_VERSION MATCHES "^5\\.4")
if (LUA_VANILLA_VERSION MATCHES "work" OR LUA_VANILLA_VERSION MATCHES "alpha" OR LUA_VANILLA_VERSION MATCHES "beta")
Expand All @@ -138,10 +138,10 @@ elseif (LUA_VANILLA_VERSION MATCHES "^5\\.4")
llex.c lmathlib.c lmem.c loadlib.c lobject.c lopcodes.c loslib.c
lparser.c lstate.c lstring.c lstrlib.c ltable.c ltablib.c ltm.c lundump.c
lutf8lib.c lvm.c lzio.c)
set(LUA_VANILLA_LUA_SOURCES lua.c )
if (LUA_BUILD_LUA_COMPILER)
set(LUA_VANILLA_LUAC_SOURCES luac.c )
endif()
set(LUA_VANILLA_LUA_SOURCES lua.c)
if (LUA_BUILD_LUA_COMPILER)
set(LUA_VANILLA_LUAC_SOURCES luac.c)
endif()
set(LUA_VANILLA_GENERATE_LUA_HPP false)
else()
MESSAGE(WARNING "Using Lua 5.4.4 file list for ${LUA_VERSION} version")
Expand All @@ -150,10 +150,10 @@ else()
llex.c lmathlib.c lmem.c loadlib.c lobject.c lopcodes.c loslib.c
lparser.c lstate.c lstring.c lstrlib.c ltable.c ltablib.c ltm.c lundump.c
lutf8lib.c lvm.c lzio.c)
set(LUA_VANILLA_LUA_SOURCES lua.c )
if (LUA_BUILD_LUA_COMPILER)
set(LUA_VANILLA_LUAC_SOURCES luac.c )
endif()
set(LUA_VANILLA_LUA_SOURCES lua.c)
if (LUA_BUILD_LUA_COMPILER)
set(LUA_VANILLA_LUAC_SOURCES luac.c)
endif()
set(LUA_VANILLA_GENERATE_LUA_HPP false)
endif()

Expand Down Expand Up @@ -217,6 +217,7 @@ set(luacompiler "luac-${LUA_VANILLA_VERSION}")
# make an actual, buildable target
# that other parts of the code can depend on
add_library(${liblua} ${LUA_BUILD_LIBRARY_TYPE} ${LUA_VANILLA_LIB_SOURCES})
add_library(Lua::Lua ALIAS ${liblua})
set_target_properties(${liblua}
PROPERTIES
LANGUAGE ${LUA_VANILLA_LANGUAGE}
Expand All @@ -233,7 +234,9 @@ set_source_files_properties(${LUA_VANILLA_LIB_SOURCES}
target_include_directories(${liblua}
PUBLIC "${LUA_VANILLA_INCLUDE_DIRS}")
target_compile_definitions(${liblua}
PUBLIC LUA_COMPAT_ALL ${LUA_VANILLA_DLL_DEFINE})
PUBLIC
LUA_COMPAT_ALL
${LUA_VANILLA_DLL_DEFINE})
if (MSVC)
target_compile_options(${liblua}
PRIVATE /W1)
Expand Down
2 changes: 1 addition & 1 deletion cmake/Packages/FindLuwraBuild.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ ExternalProject_Add(LUWRA_BUILD_SOURCE
add_library(${luwra_lib} INTERFACE)
add_dependencies(${luwra_lib} LUWRA_BUILD_SOURCE)
target_include_directories(${luwra_lib} INTERFACE ${luwra_include_dirs})
target_link_libraries(${luwra_lib} INTERFACE ${LUA_LIBRARIES})
target_link_libraries(${luwra_lib} INTERFACE Lua::Lua)
if (NOT MSVC)
target_compile_options(${luwra_lib} INTERFACE
-Wno-noexcept-type -Wno-ignored-qualifiers -Wno-unused-parameter)
Expand Down
2 changes: 1 addition & 1 deletion cmake/Packages/FindToLuappBuild.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ set_target_properties(${toluapp_lib} PROPERTIES
POSITION_INDEPENDENT_CODE TRUE)
target_include_directories(${toluapp_lib}
PUBLIC ${toluapp_include_dirs})
target_link_libraries(${toluapp_lib} PRIVATE ${LUA_LIBRARIES} ${CMAKE_DL_LIBS})
target_link_libraries(${toluapp_lib} PRIVATE Lua::Lua ${CMAKE_DL_LIBS})
if (MSVC)
target_compile_options(${toluapp_lib}
PRIVATE /W1)
Expand Down
2 changes: 1 addition & 1 deletion examples/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@

function(sol2_add_example_properties target-name)
target_link_libraries(${target-name}
PUBLIC Threads::Threads ${LUA_LIBRARIES} ${CMAKE_DL_LIBS})
PUBLIC Threads::Threads Lua::Lua ${CMAKE_DL_LIBS})
target_compile_definitions(${target-name}
PUBLIC SOL_PRINT_ERRORS=1)
target_compile_options(${target-name}
Expand Down
2 changes: 1 addition & 1 deletion examples/customization/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ function (MAKE_CUSTOMIZATION_EXAMPLE example_suffix target_sol)
endif()

target_link_libraries(${customization_example_name}
PRIVATE Threads::Threads ${target_sol} ${LUA_LIBRARIES})
PRIVATE Threads::Threads ${target_sol} Lua::Lua)
target_include_directories(${customization_example_name}
PRIVATE include)
endfunction()
Expand Down
2 changes: 1 addition & 1 deletion examples/interop/LuaBridge/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ function (make_luabridge_interop_example target_library example_suffix)

add_executable(${example_name} source/LuaBridge.cpp)
target_link_libraries(${example_name}
PRIVATE ${LUA_LIBRARIES} ${LUABRIDGE_LIBRARIES}
PRIVATE Lua::Lua ${LUABRIDGE_LIBRARIES}
${target_library} ${CMAKE_DL_LIBS})

if (MSVC)
Expand Down
2 changes: 1 addition & 1 deletion examples/interop/kaguya/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ function (make_kaguya_interop_example target_library example_suffix)

add_executable(${example_name} source/kaguya.cpp)
target_link_libraries(${example_name}
PRIVATE ${LUA_LIBRARIES} ${KAGUYA_LIBRARIES}
PRIVATE Lua::Lua ${KAGUYA_LIBRARIES}
${target_library} ${CMAKE_DL_LIBS})

if (MSVC)
Expand Down
2 changes: 1 addition & 1 deletion examples/interop/luwra/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ function (make_luwra_interop_example target_library example_suffix)

add_executable(${example_name} source/luwra.cpp)
target_link_libraries(${example_name}
PRIVATE ${LUA_LIBRARIES} ${LUWRA_LIBRARIES}
PRIVATE Lua::Lua ${LUWRA_LIBRARIES}
${target_library} ${CMAKE_DL_LIBS})

if (MSVC)
Expand Down
2 changes: 1 addition & 1 deletion examples/interop/tolua/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ function(make_tolua_interop_example target_library example_suffix)
add_executable(${example_name} source/tolua.cpp)
target_link_libraries(${example_name}
PRIVATE
${LUA_LIBRARIES} ${TOLUAPP_LIBRARIES} ${target_library} ${CMAKE_DL_LIBS})
Lua::Lua ${TOLUAPP_LIBRARIES} ${target_library} ${CMAKE_DL_LIBS})

if (MSVC)
target_compile_options(${example_name}
Expand Down
4 changes: 2 additions & 2 deletions examples/require_dll_example/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ function(make_require_from_dll_example target_lib example_lib_name_suffix)
PUBLIC MY_OBJECT_DLL
PRIVATE MY_OBJECT_BUILD)
target_link_libraries(${example_lib_name}
PUBLIC ${target_lib} ${LUA_LIBRARIES} ${CMAKE_DL_LIBS})
PUBLIC ${target_lib} Lua::Lua ${CMAKE_DL_LIBS})
target_include_directories(${example_lib_name}
PUBLIC "${LUA_INCLUDE_DIRS}")

Expand Down Expand Up @@ -83,7 +83,7 @@ function(make_require_from_dll_example target_lib example_lib_name_suffix)
# add executable target that represents require_from_dll program
add_executable(${example_name} ${require_from_dll_sources})
target_link_libraries(${example_name}
PRIVATE my_object ${LUA_LIBRARIES} ${target_lib} ${CMAKE_DL_LIBS})
PRIVATE my_object Lua::Lua ${target_lib} ${CMAKE_DL_LIBS})
target_include_directories(${example_name}
PRIVATE ${LUA_INCLUDE_DIRS})

Expand Down
47 changes: 47 additions & 0 deletions include/sol/abort.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
// sol2

// The MIT License (MIT)

// Copyright (c) 2013-2022 Rapptz, ThePhD and contributors

// Permission is hereby granted, free of charge, to any person obtaining a copy of
// this software and associated documentation files (the "Software"), to deal in
// the Software without restriction, including without limitation the rights to
// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
// the Software, and to permit persons to whom the Software is furnished to do so,
// subject to the following conditions:

// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.

// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

#ifndef SOL_ABORT_HPP
#define SOL_ABORT_HPP

#include <sol/version.hpp>

#include <sol/base_traits.hpp>

#include <cstdlib>

// clang-format off
#if SOL_IS_ON(SOL_DEBUG_BUILD)
#if SOL_IS_ON(SOL_COMPILER_VCXX)
#define SOL_DEBUG_ABORT() \
if (true) { ::std::abort(); } \
static_assert(true, "")
#else
#define SOL_DEBUG_ABORT() ::std::abort()
#endif
#else
#define SOL_DEBUG_ABORT() static_assert(true, "")
#endif
// clang-format on

#endif // SOL_ABORT_HPP
33 changes: 33 additions & 0 deletions include/sol/base_traits.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,39 @@ namespace sol {
template <template <class...> class Trait, class... Args>
constexpr inline bool is_detected_v = is_detected<Trait, Args...>::value;

template <typename _Default, typename _Void, template <typename...> typename _Op, typename... _Args>
class detector {
public:
using value_t = ::std::false_type;
using type = _Default;
};

template <typename _Default, template <typename...> typename _Op, typename... _Args>
class detector<_Default, void_t<_Op<_Args...>>, _Op, _Args...> {
public:
using value_t = ::std::true_type;
using type = _Op<_Args...>;
};

class nonesuch {
public:
~nonesuch() = delete;
nonesuch(nonesuch const&) = delete;
nonesuch& operator=(nonesuch const&) = delete;
};

template <template <typename...> typename _Op, typename... _Args>
using detected_t = typename detector<nonesuch, void, _Op, _Args...>::type;

template <typename _Default, template <typename...> typename _Op, typename... _Args>
using detected_or = detector<_Default, void, _Op, _Args...>;

template <typename _Default, template <typename...> typename _Op, typename... _Args>
using detected_or_t = typename detector<_Default, void, _Op, _Args...>::type;

template <typename _Default, template <typename...> typename _Op, typename... _Args>
constexpr inline bool detected_or_v = detector<_Default, void, _Op, _Args...>::value;

template <std::size_t I>
using index_value = std::integral_constant<std::size_t, I>;

Expand Down
22 changes: 11 additions & 11 deletions include/sol/compatibility.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,18 +34,18 @@

#if SOL_IS_ON(SOL_USE_COMPATIBILITY_LAYER)

#if SOL_IS_ON(SOL_USE_CXX_LUA) || SOL_IS_ON(SOL_USE_CXX_LUAJIT)
#ifndef COMPAT53_LUA_CPP
#define COMPAT53_LUA_CPP 1
#endif // Build Lua Compat layer as C++
// clang-format off
#if SOL_IS_ON(SOL_USING_CXX_LUA) || SOL_IS_ON(SOL_USING_CXX_LUAJIT)
#ifndef COMPAT53_LUA_CPP
#define COMPAT53_LUA_CPP 1
#endif // Build Lua Compat layer as C++
#endif
#ifndef COMPAT53_INCLUDE_SOURCE
#define COMPAT53_INCLUDE_SOURCE 1
#endif // Build Compat Layer Inline

#include <sol/compatibility/compat-5.3.h>
#include <sol/compatibility/compat-5.4.h>

#ifndef COMPAT53_INCLUDE_SOURCE
#define COMPAT53_INCLUDE_SOURCE 1
#endif // Build Compat Layer Inline
#include <sol/compatibility/compat-5.3.h>
#include <sol/compatibility/compat-5.4.h>
#endif
// clang-format on

#endif // SOL_COMPATIBILITY_HPP
14 changes: 9 additions & 5 deletions include/sol/compatibility/lua_version.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@

// clang-format off

#if SOL_IS_ON(SOL_USE_CXX_LUA)
#if SOL_IS_ON(SOL_USING_CXX_LUA)
#include <lua.h>
#include <lualib.h>
#include <lauxlib.h>
Expand All @@ -54,7 +54,7 @@
#define SOL_USE_LUAJIT_I_ SOL_DEFAULT_OFF
#endif // luajit

#if SOL_IS_ON(SOL_USE_CXX_LUAJIT)
#if SOL_IS_ON(SOL_USING_CXX_LUAJIT)
#include <luajit.h>
#elif SOL_IS_ON(SOL_USE_LUAJIT)
extern "C" {
Expand Down Expand Up @@ -146,9 +146,9 @@
#else
#if SOL_IS_ON(SOL_USE_LUAJIT)
#define SOL_EXCEPTIONS_CATCH_ALL_I_ SOL_DEFAULT_OFF
#elif SOL_IS_ON(SOL_USE_CXX_LUAJIT)
#elif SOL_IS_ON(SOL_USING_CXX_LUAJIT)
#define SOL_EXCEPTIONS_CATCH_ALL_I_ SOL_DEFAULT_OFF
#elif SOL_IS_ON(SOL_USE_CXX_LUA)
#elif SOL_IS_ON(SOL_USING_CXX_LUA)
#define SOL_EXCEPTIONS_CATCH_ALL_I_ SOL_DEFAULT_OFF
#else
#define SOL_EXCEPTIONS_CATCH_ALL_I_ SOL_DEFAULT_ON
Expand Down Expand Up @@ -192,7 +192,11 @@
#else
// Lua 5.2 only (deprecated in 5.3 (503)) (Can be turned on with Compat flags)
// Lua 5.2, or other versions of Lua with the compat flag, or Lua that is not 5.2 with the specific define (5.4.1 either removed it entirely or broke it)
#if (SOL_LUA_VERSION_I_ == 502) || (defined(LUA_COMPAT_BITLIB) && (LUA_COMPAT_BITLIB != 0)) || (SOL_LUA_VERSION_I_ < 504 && (defined(LUA_COMPAT_5_2) && (LUA_COMPAT_5_2 != 0)))
#if (SOL_LUA_VERSION_I_ == 502)
#define SOL_LUA_BIT32_LIB_I_ SOL_ON
#elif (defined(LUA_COMPAT_BITLIB) && (LUA_COMPAT_BITLIB != 0))
#define SOL_LUA_BIT32_LIB_I_ SOL_ON
#elif (SOL_LUA_VERSION_I_ < 504 && (defined(LUA_COMPAT_5_2) && (LUA_COMPAT_5_2 != 0)))
#define SOL_LUA_BIT32_LIB_I_ SOL_ON
#else
#define SOL_LUA_BIT32_LIB_I_ SOL_DEFAULT_OFF
Expand Down
6 changes: 3 additions & 3 deletions include/sol/forward.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@
#include <type_traits>
#include <string_view>

#if SOL_IS_ON(SOL_USE_CXX_LUA) || SOL_IS_ON(SOL_USE_CXX_LUAJIT)
#if SOL_IS_ON(SOL_USING_CXX_LUA) || SOL_IS_ON(SOL_USING_CXX_LUAJIT)
struct lua_State;
#else
extern "C" {
Expand Down Expand Up @@ -253,14 +253,14 @@ namespace sol {
typedef ::sol::types<__VA_ARGS__> type; \
}; \
} \
void a_sol3_detail_function_decl_please_no_collide()
static_assert(true, "")
#define SOL_DERIVED_CLASSES(T, ...) \
namespace sol { \
template <> \
struct derive<T> : std::true_type { \
typedef ::sol::types<__VA_ARGS__> type; \
}; \
} \
void a_sol3_detail_function_decl_please_no_collide()
static_assert(true, "")

#endif // SOL_FORWARD_HPP
Loading

0 comments on commit 334f855

Please sign in to comment.