ThePhD / sol2

Sol3 (sol2 v3.0) - a C++ <-> Lua API wrapper with advanced features and top notch performance - is here, and it's great! Documentation:
http://sol2.rtfd.io/
MIT License
4.06k stars 492 forks source link

Compilation Error when Member Variables set in new_usertype. #1588

Closed theanimatorspal closed 3 months ago

theanimatorspal commented 3 months ago

So I upgraded my compiler, (clang, clang-cl) to the latest version and the following code works no more

    auto vec2_multiply_overloads = sol::overload(
        [](const glm::vec2& v1, const glm::vec2& v2) -> glm::vec2 { return v1 * v2; },
        [](const glm::vec2& v1, float value) -> glm::vec2 { return v1 * value; },
        [](float value, const glm::vec2& v1) -> glm::vec2 { return v1 * value; });

    auto vec2_divide_overloads = sol::overload(
        [](const glm::vec2& v1, const glm::vec2& v2) -> glm::vec2 { return v1 / v2; },
        [](const glm::vec2& v1, float value) -> glm::vec2 { return v1 / value; },
        [](float value, const glm::vec2& v1) -> glm::vec2{ return v1 / value; });

    auto vec2_addition_overloads = sol::overload(
        [](const glm::vec2& v1, const glm::vec2& v2) -> glm::vec2 { return v1 + v2; },
        [](const glm::vec2& v1, float value) -> glm::vec2 { return v1 + value; },
        [](float value, const glm::vec2& v1) -> glm::vec2 { return v1 + value; });

    auto vec2_subtraction_overloads = sol::overload(
        [](const glm::vec2& v1, const glm::vec2& v2) -> glm::vec2 { return v1 - v2; },
        [](const glm::vec2& v1, float value) -> glm::vec2 { return v1 - value; },
        [](float value, const glm::vec2& v1) -> glm::vec2 { return v1 - value; });

    lua.new_usertype<glm::vec2>(
        "vec2",
        sol::call_constructor,
        sol::constructors<glm::vec2(float), glm::vec2(float, float)>(),
        "x", &glm::vec2::x,
        "y", &glm::vec2::y,
        sol::meta_function::multiplication, vec2_multiply_overloads,
        sol::meta_function::division, vec2_divide_overloads,
        sol::meta_function::addition, vec2_addition_overloads,
        sol::meta_function::subtraction, vec2_subtraction_overloads,
        "length", [](const glm::vec2& v) { return glm::length(v); });

When I comment out the line with

    "x", &glm::vec2::x,
    "y", &glm::vec2::y

It Compiles, but if I don't comment then I get lots of compilation errors which say


hpp:19875:31: error: address of overloaded function 'call' does not match required type 'int (lua_State *)'
[build]  19875 |                                 lua_CFunction freefunc = &function_detail::upvalue_this_member_variable<C, Fx>::template call<is_yielding, no_trampoline>;
[build]        |                                                           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[build] C:/Users/sansk/OneDrive/Pictures/jkrgui/ksaivulkan/Vendor\sol/sol.hpp:20033:5: note: in instantiation of function template specialization 'sol::function_detail::select_member_variable<false, false, float glm::vec<2, float>::*>' requested here
[build]  20033 |                                 select_member_variable<is_yielding, no_trampoline>(L, std::forward<Fx>(fx), std::forward<Args>(args)...);
[build]        |                                 ^
[build] C:/Users/sansk/OneDrive/Pictures/jkrgui/ksaivulkan/Vendor\sol/sol.hpp:20157:22: note: in instantiation of function template specialization 'sol::function_detail::select<false, false, float glm::vec<2, float>::*>' requested here
[build]  20157 |                                 function_detail::select<false, false>(L, std::forward<Args>(args)...);
[build]        |                                                  ^
[build] C:/Users/sansk/OneDrive/Pictures/jkrgui/ksaivulkan/Vendor\sol/sol.hpp:11759:14: note: in instantiation of function template specialization 'sol::stack::unqualified_pusher<float glm::vec<2, float>::*>::push<float glm::vec<2, float>::*>' requested here
[build]  11759 |                                 return p.push(L, std::forward<T>(t), std::forward<Args>(args)...);
[build]        |                                          ^
[build] C:/Users/sansk/OneDrive/Pictures/jkrgui/ksaivulkan/Vendor\sol/sol.hpp:16257:7: note: in instantiation of function template specialization 'sol::stack::push<float glm::vec<2, float>::*>' requested here
[build]  16257 |                                                 push(L, std::forward<Value>(value));
[build]        |                                                 ^
[build] C:/Users/sansk/OneDrive/Pictures/jkrgui/ksaivulkan/Vendor\sol/sol.hpp:12131:59: note: in instantiation of function template specialization 'sol::stack::field_setter<char[2]>::set<const char (&)[2], float glm::vec<2, float>::*>' requested here
[build]  12131 |                         field_setter<meta::unqualified_t<Key>, global, raw> {}.set(L, std::forward<Key>(key), std::forward<Value>(value), tableindex);
[build]        |                                                                                ^
[build] C:/Users/sansk/OneDrive/Pictures/jkrgui/ksaivulkan/Vendor\sol/sol.hpp:25659:14: note: (skipping 3 contexts in backtrace; use -ftemplate-backtrace-limit=0 to see all)
[build]  25659 |                                                 stack::set_field<global, raw>(L, std::forward<Key>(key), std::forward<Keys>(keys)..., table_index);
[build]        |                                                        ^
[build] C:/Users/sansk/OneDrive/Pictures/jkrgui/ksaivulkan/Vendor\sol/sol.hpp:26372:20: note: in instantiation of function template specialization 'sol::basic_table_core<false, sol::basic_reference<false>>::set<const char (&)[2], float glm::vec<2, float>::*>' requested here
[build]  26372 |                                         table_base_t::set(std::forward<Key>(key), std::forward<Value>(value));
[build]        |                                                       ^
[build] C:/Users/sansk/OneDrive/Pictures/jkrgui/ksaivulkan/Vendor\sol/sol.hpp:26322:38: note: in instantiation of function template specialization 'sol::basic_usertype<glm::vec<2, float>, sol::basic_reference<false>>::set<const char (&)[2], float glm::vec<2, float>::*>' requested here
[build]  26322 |                         (void)detail::swallow { 0, (this->set(std::get<I * 2>(std::move(args)), std::get<I * 2 + 1>(std::move(args))), 0)... };
[build]        |                                                           ^
[build] C:/Users/sansk/OneDrive/Pictures/jkrgui/ksaivulkan/Vendor\sol/sol.hpp:26524:7: note: in instantiation of function template specialization 'sol::basic_usertype<glm::vec<2, float>, sol::basic_reference<false>>::tuple_set<0ULL, 1ULL, 2ULL, 3ULL, 4ULL, 5ULL, 6ULL, 7ULL, const sol::call_construction &, sol::constructor_list<glm::vec<2, float> (float), glm::vec<2, float> (float, float)> &&, const char (&)[2], float glm::vec<2, float>::*&&, const char (&)[2], float glm::vec<2, float>::*&&, sol::meta_function &&, sol::overload_set<(lambda at C:\Users\sansk\OneDrive\Pictures\jkrgui\JkrLuaExe\JkrMath.cpp:7:3), (lambda at C:\Users\sansk\OneDrive\Pictures\jkrgui\JkrLuaExe\JkrMath.cpp:8:3), (lambda at C:\Users\sansk\OneDrive\Pictures\jkrgui\JkrLuaExe\JkrMath.cpp:9:3)> &, sol::meta_function &&, sol::overload_set<(lambda at C:\Users\sansk\OneDrive\Pictures\jkrgui\JkrLuaExe\JkrMath.cpp:12:3), (lambda at C:\Users\sansk\OneDrive\Pictures\jkrgui\JkrLuaExe\JkrMath.cpp:13:3), (lambda at C:\Users\sansk\OneDrive\Pictures\jkrgui\JkrLuaExe\JkrMath.cpp:14:3)> &, sol::meta_function &&, sol::overload_set<(lambda at C:\Users\sansk\OneDrive\Pictures\jkrgui\JkrLuaExe\JkrMath.cpp:17:3), (lambda at C:\Users\sansk\OneDrive\Pictures\jkrgui\JkrLuaExe\JkrMath.cpp:18:3), (lambda at C:\Users\sansk\OneDrive\Pictures\jkrgui\JkrLuaExe\JkrMath.cpp:19:3)> &, sol::meta_function &&, sol::overload_set<(lambda at C:\Users\sansk\OneDrive\Pictures\jkrgui\JkrLuaExe\JkrMath.cpp:22:3), (lambda at C:\Users\sansk\OneDrive\Pictures\jkrgui\JkrLuaExe\JkrMath.cpp:23:3), (lambda at C:\Users\sansk\OneDrive\Pictures\jkrgui\JkrLuaExe\JkrMath.cpp:24:3)> &, const char (&)[7], (lambda at C:\Users\sansk\OneDrive\Pictures\jkrgui\JkrLuaExe\JkrMath.cpp:36:13) &&>' requested here
[build]  26524 |                         ut.tuple_set(std::make_index_sequence<(sizeof...(Args) + 1) / 2>(), std::forward_as_tuple(std::forward<Arg>(arg), std::forward<Args>(args)...));
[build]        |                            ^
[build] C:/Users/sansk/OneDrive/Pictures/jkrgui/ksaivulkan/Vendor\sol/sol.hpp:27984:18: note: in instantiation of function template specialization 'sol::basic_table_core<true, sol::basic_reference<false>>::new_usertype<glm::vec<2, float>, const char (&)[5], const sol::call_construction &, sol::constructor_list<glm::vec<2, float> (float), glm::vec<2, float> (float, float)>, const char (&)[2], float glm::vec<2, float>::*, const char (&)[2], float glm::vec<2, float>::*, sol::meta_function, sol::overload_set<(lambda at C:\Users\sansk\OneDrive\Pictures\jkrgui\JkrLuaExe\JkrMath.cpp:7:3), (lambda at C:\Users\sansk\OneDrive\Pictures\jkrgui\JkrLuaExe\JkrMath.cpp:8:3), (lambda at C:\Users\sansk\OneDrive\Pictures\jkrgui\JkrLuaExe\JkrMath.cpp:9:3)> &, sol::meta_function, sol::overload_set<(lambda at C:\Users\sansk\OneDrive\Pictures\jkrgui\JkrLuaExe\JkrMath.cpp:12:3), (lambda at C:\Users\sansk\OneDrive\Pictures\jkrgui\JkrLuaExe\JkrMath.cpp:13:3), (lambda at C:\Users\sansk\OneDrive\Pictures\jkrgui\JkrLuaExe\JkrMath.cpp:14:3)> &, sol::meta_function, sol::overload_set<(lambda at C:\Users\sansk\OneDrive\Pictures\jkrgui\JkrLuaExe\JkrMath.cpp:17:3), (lambda at C:\Users\sansk\OneDrive\Pictures\jkrgui\JkrLuaExe\JkrMath.cpp:18:3), (lambda at C:\Users\sansk\OneDrive\Pictures\jkrgui\JkrLuaExe\JkrMath.cpp:19:3)> &, sol::meta_function, sol::overload_set<(lambda at C:\Users\sansk\OneDrive\Pictures\jkrgui\JkrLuaExe\JkrMath.cpp:22:3), (lambda at C:\Users\sansk\OneDrive\Pictures\jkrgui\JkrLuaExe\JkrMath.cpp:23:3), (lambda at C:\Users\sansk\OneDrive\Pictures\jkrgui\JkrLuaExe\JkrMath.cpp:24:3)> &, const char (&)[7], (lambda at C:\Users\sansk\OneDrive\Pictures\jkrgui\JkrLuaExe\JkrMath.cpp:36:13), void>' requested here
[build]  27984 |                         return global.new_usertype<Class>(std::forward<Args>(args)...);
[build]        |                                       ^
[build] C:/Users/sansk/OneDrive/Pictures/jkrgui/JkrLuaExe/JkrMath.cpp:26:6: note: in instantiation of function template specialization 'sol::state_view::new_usertype<glm::vec<2, float>, const char (&)[5], const sol::call_construction &, sol::constructor_list<glm::vec<2, float> (float), glm::vec<2, float> (float, float)>, const char (&)[2], float glm::vec<2, float>::*, const char (&)[2], float glm::vec<2, float>::*, sol::meta_function, sol::overload_set<(lambda at C:\Users\sansk\OneDrive\Pictures\jkrgui\JkrLuaExe\JkrMath.cpp:7:3), (lambda at C:\Users\sansk\OneDrive\Pictures\jkrgui\JkrLuaExe\JkrMath.cpp:8:3), (lambda at C:\Users\sansk\OneDrive\Pictures\jkrgui\JkrLuaExe\JkrMath.cpp:9:3)> &, sol::meta_function, sol::overload_set<(lambda at C:\Users\sansk\OneDrive\Pictures\jkrgui\JkrLuaExe\JkrMath.cpp:12:3), (lambda at C:\Users\sansk\OneDrive\Pictures\jkrgui\JkrLuaExe\JkrMath.cpp:13:3), (lambda at C:\Users\sansk\OneDrive\Pictures\jkrgui\JkrLuaExe\JkrMath.cpp:14:3)> &, sol::meta_function, sol::overload_set<(lambda at C:\Users\sansk\OneDrive\Pictures\jkrgui\JkrLuaExe\JkrMath.cpp:17:3), (lambda at C:\Users\sansk\OneDrive\Pictures\jkrgui\JkrLuaExe\JkrMath.cpp:18:3), (lambda at C:\Users\sansk\OneDrive\Pictures\jkrgui\JkrLuaExe\JkrMath.cpp:19:3)> &, sol::meta_function, sol::overload_set<(lambda at C:\Users\sansk\OneDrive\Pictures\jkrgui\JkrLuaExe\JkrMath.cpp:22:3), (lambda at C:\Users\sansk\OneDrive\Pictures\jkrgui\JkrLuaExe\JkrMath.cpp:23:3), (lambda at C:\Users\sansk\OneDrive\Pictures\jkrgui\JkrLuaExe\JkrMath.cpp:24:3)> &, const char (&)[7], (lambda at C:\Users\sansk\OneDrive\Pictures\jkrgui\JkrLuaExe\JkrMath.cpp:36:13)>' requested here
[build]    26 |         lua.new_usertype<glm::vec2>(
[build]       |             ^
[build] C:/Users/sansk/OneDrive/Pictures/jkrgui/ksaivulkan/Vendor\sol/sol.hpp:19419:14: note: candidate template ignored: substitution failure [with is_yielding = false, no_trampoline = false]
[build]  19419 |                 static int call(lua_State* L) noexcept(std::is_nothrow_copy_assignable_v<T>) {
[build]        |                            ^
[build] 1 error generated.
[build] ninja: build stopped: subcommand failed. ```
theanimatorspal commented 3 months ago

I saw #1581 , Closing this.