luabind 0.9 compile error with clang 3.2

Tomasz Mikolajczyk <[email protected]> Mon, 31 Dec 2012 18:21:31 +0100
Newsgroups gmane.comp.lang.lua.bind.user
Message-ID <CAAnoKN-6RiHHJDGyxEe=chuFv88Qfiq9ULWVqA44cuzoiMwCpA@mail.gmail.com>
Hi.

The latest clang 3.2 detected an ambiguous forward declarations in
detail/format_signature.hpp file:

{{{
In file included from /home/tomaszmi/src/stack_content_by_name.cpp:27:
In file included from /home/tomaszmi/luabind/luabind.hpp:28:
In file included from /home/tomaszmi/luabind/class.hpp:94:
In file included from /home/tomaszmi/luabind/function.hpp:8:
In file included from /home/tomaszmi/luabind/make_function.hpp:13:
/home/tomaszmi/luabind/detail/format_signature.hpp:95:33: error:
reference to 'object' is ambiguous
LUABIND_TYPE_TO_STRING(luabind::object)
                                ^
/home/tomaszmi/luabind/detail/format_signature.hpp:73:27: note:
expanded from macro 'LUABIND_TYPE_TO_STRING'
    struct type_to_string<x> \
                          ^
/home/tomaszmi/luabind/object.hpp:826:12: note: candidate found by
name lookup is 'luabind::object'
using adl::object;
           ^
/home/tomaszmi/luabind/detail/format_signature.hpp:18:7: note:
candidate found by name lookup is 'luabind::object'
class object;
      ^
/home/tomaszmi/luabind/detail/format_signature.hpp:96:33: error:
reference to 'argument' is ambiguous
LUABIND_TYPE_TO_STRING(luabind::argument)
                                ^
/home/tomaszmi/luabind/detail/format_signature.hpp:73:27: note:
expanded from macro 'LUABIND_TYPE_TO_STRING'
    struct type_to_string<x> \
                          ^
/home/tomaszmi/luabind/object.hpp:827:12: note: candidate found by
name lookup is 'luabind::argument'
using adl::argument;
           ^
/home/tomaszmi/luabind/detail/format_signature.hpp:19:7: note:
candidate found by name lookup is 'luabind::argument'
class argument;
      ^
/home/tomaszmi/luabind/detail/format_signature.hpp:102:23: error:
reference to 'table' is ambiguous
struct type_to_string<table<Base> >
                      ^
/home/tomaszmi/luabind/object.hpp:1189:12: note: candidate found by
name lookup is 'luabind::table'
using adl::table;
           ^
/home/tomaszmi/luabind/detail/format_signature.hpp:21:8: note:
candidate found by name lookup is 'luabind::table'
struct table;
       ^
/home/tomaszmi/luabind/detail/format_signature.hpp:102:29: error:
'Base' does not refer to a value
struct type_to_string<table<Base> >
                            ^
/home/tomaszmi/luabind/detail/format_signature.hpp:101:17: note: declared here
template <class Base>
                ^
In file included from /home/tomaszmi/src/stack_content_by_name.cpp:27:
In file included from /home/tomaszmi/luabind/luabind.hpp:28:
In file included from /home/tomaszmi/luabind/class.hpp:94:
In file included from /home/tomaszmi/luabind/function.hpp:8:
/home/tomaszmi/luabind/make_function.hpp:95:15: error: reference to
'object' is ambiguous
  LUABIND_API object make_function_aux(
              ^
/home/tomaszmi/luabind/object.hpp:826:12: note: candidate found by
name lookup is 'luabind::object'
using adl::object;
           ^
/home/tomaszmi/luabind/detail/format_signature.hpp:18:7: note:
candidate found by name lookup is 'luabind::object'
class object;
      ^
In file included from /home/tomaszmi/src/stack_content_by_name.cpp:27:
In file included from /home/tomaszmi/luabind/luabind.hpp:28:
In file included from /home/tomaszmi/luabind/class.hpp:94:
In file included from /home/tomaszmi/luabind/function.hpp:8:
/home/tomaszmi/luabind/make_function.hpp:99:33: error: reference to
'object' is ambiguous
  LUABIND_API void add_overload(object const&, char const*, object const&);
                                ^
/home/tomaszmi/luabind/object.hpp:826:12: note: candidate found by
name lookup is 'luabind::object'
using adl::object;
           ^
/home/tomaszmi/luabind/detail/format_signature.hpp:18:7: note:
candidate found by name lookup is 'luabind::object'
class object;
      ^
In file included from /home/tomaszmi/src/stack_content_by_name.cpp:27:
In file included from /home/tomaszmi/luabind/luabind.hpp:28:
In file included from /home/tomaszmi/luabind/class.hpp:94:
In file included from /home/tomaszmi/luabind/function.hpp:8:
/home/tomaszmi/luabind/make_function.hpp:99:33: error: reference to
'object' is ambiguous
  LUABIND_API void add_overload(object const&, char const*, object const&);
                                ^
/home/tomaszmi/luabind/object.hpp:826:12: note: candidate found by
name lookup is 'luabind::object'
using adl::object;
           ^
/home/tomaszmi/luabind/detail/format_signature.hpp:18:7: note:
candidate found by name lookup is 'luabind::object'
class object;
      ^
In file included from /home/tomaszmi/src/stack_content_by_name.cpp:27:
In file included from /home/tomaszmi/luabind/luabind.hpp:28:
In file included from /home/tomaszmi/luabind/class.hpp:94:
In file included from /home/tomaszmi/luabind/function.hpp:8:
/home/tomaszmi/luabind/make_function.hpp:99:61: error: reference to
'object' is ambiguous
  LUABIND_API void add_overload(object const&, char const*, object const&);
                                                            ^
/home/tomaszmi/luabind/object.hpp:826:12: note: candidate found by
name lookup is 'luabind::object'
using adl::object;
           ^
/home/tomaszmi/luabind/detail/format_signature.hpp:18:7: note:
candidate found by name lookup is 'luabind::object'
class object;
      ^
In file included from /home/tomaszmi/src/stack_content_by_name.cpp:27:
In file included from /home/tomaszmi/luabind/luabind.hpp:28:
In file included from /home/tomaszmi/luabind/class.hpp:94:
In file included from /home/tomaszmi/luabind/function.hpp:8:
/home/tomaszmi/luabind/make_function.hpp:104:1: error: reference to
'object' is ambiguous
object make_function(lua_State* L, F f, Signature, Policies)
^
/home/tomaszmi/luabind/object.hpp:826:12: note: candidate found by
name lookup is 'luabind::object'
using adl::object;
           ^
/home/tomaszmi/luabind/detail/format_signature.hpp:18:7: note:
candidate found by name lookup is 'luabind::object'
class object;
      ^
In file included from /home/tomaszmi/src/stack_content_by_name.cpp:27:
In file included from /home/tomaszmi/luabind/luabind.hpp:28:
In file included from /home/tomaszmi/luabind/class.hpp:94:
In file included from /home/tomaszmi/luabind/function.hpp:8:
/home/tomaszmi/luabind/make_function.hpp:104:8: error: incomplete
result type 'luabind::object' in function definition
object make_function(lua_State* L, F f, Signature, Policies)
       ^
/home/tomaszmi/luabind/detail/format_signature.hpp:18:7: note: forward
declaration of 'luabind::object'
class object;
      ^
In file included from /home/tomaszmi/src/stack_content_by_name.cpp:27:
In file included from /home/tomaszmi/luabind/luabind.hpp:28:
In file included from /home/tomaszmi/luabind/class.hpp:94:
In file included from /home/tomaszmi/luabind/function.hpp:8:
/home/tomaszmi/luabind/make_function.hpp:115:1: error: reference to
'object' is ambiguous
object make_function(lua_State* L, F f)
^
/home/tomaszmi/luabind/object.hpp:826:12: note: candidate found by
name lookup is 'luabind::object'
using adl::object;
           ^
/home/tomaszmi/luabind/detail/format_signature.hpp:18:7: note:
candidate found by name lookup is 'luabind::object'
class object;
      ^
In file included from /home/tomaszmi/src/stack_content_by_name.cpp:27:
In file included from /home/tomaszmi/luabind/luabind.hpp:28:
In file included from /home/tomaszmi/luabind/class.hpp:94:
In file included from /home/tomaszmi/luabind/function.hpp:8:
/home/tomaszmi/luabind/make_function.hpp:115:8: error: incomplete
result type 'luabind::object' in function definition
object make_function(lua_State* L, F f)
       ^
/home/tomaszmi/luabind/detail/format_signature.hpp:18:7: note: forward
declaration of 'luabind::object'
class object;
      ^
In file included from /home/tomaszmi/src/stack_content_by_name.cpp:27:
In file included from /home/tomaszmi/luabind/luabind.hpp:28:
In file included from /home/tomaszmi/luabind/class.hpp:94:
In file included from /home/tomaszmi/luabind/function.hpp:10:
/home/tomaszmi/luabind/detail/call_function.hpp:224:26: error:
reference to 'object' is ambiguous
                        friend class luabind::object;
                                              ^
/home/tomaszmi/luabind/object.hpp:826:12: note: candidate found by
name lookup is 'luabind::object'
using adl::object;
           ^
/home/tomaszmi/luabind/detail/format_signature.hpp:18:7: note:
candidate found by name lookup is 'luabind::object'
class object;
      ^
In file included from /home/tomaszmi/src/stack_content_by_name.cpp:27:
In file included from /home/tomaszmi/luabind/luabind.hpp:28:
In file included from /home/tomaszmi/luabind/class.hpp:94:
In file included from /home/tomaszmi/luabind/function.hpp:10:
In file included from /home/tomaszmi/luabind/detail/call_function.hpp:320:
In file included from
/home/tomaszmi/boost/preprocessor/iteration/detail/iter/forward1.hpp:47:
/home/tomaszmi/luabind/detail/call_function.hpp:361:25: error:
reference to 'object' is ambiguous
        call_function(luabind::object const& obj
BOOST_PP_COMMA_IF(BOOST_PP_ITERATION())
BOOST_PP_ENUM(BOOST_PP_ITERATION(), LUABIND_OPERATOR_PARAMS, _) )
                               ^
/home/tomaszmi/luabind/object.hpp:826:12: note: candidate found by
name lookup is 'luabind::object'
using adl::object;
           ^
/home/tomaszmi/luabind/detail/format_signature.hpp:18:7: note:
candidate found by name lookup is 'luabind::object'
class object;
      ^
In file included from /home/tomaszmi/src/stack_content_by_name.cpp:27:
In file included from /home/tomaszmi/luabind/luabind.hpp:28:
In file included from /home/tomaszmi/luabind/class.hpp:94:
In file included from /home/tomaszmi/luabind/function.hpp:10:
In file included from /home/tomaszmi/luabind/detail/call_function.hpp:320:
In file included from
/home/tomaszmi/boost/preprocessor/iteration/detail/iter/forward1.hpp:47:
/home/tomaszmi/luabind/detail/call_function.hpp:373:6: error: member
access into incomplete type 'const luabind::object'
                obj.push(obj.interpreter());
                   ^
/home/tomaszmi/luabind/detail/format_signature.hpp:18:7: note: forward
declaration of 'luabind::object'
class object;
      ^
In file included from /home/tomaszmi/src/stack_content_by_name.cpp:27:
In file included from /home/tomaszmi/luabind/luabind.hpp:28:
In file included from /home/tomaszmi/luabind/class.hpp:94:
In file included from /home/tomaszmi/luabind/function.hpp:10:
In file included from /home/tomaszmi/luabind/detail/call_function.hpp:320:
In file included from
/home/tomaszmi/boost/preprocessor/iteration/detail/iter/forward1.hpp:47:
/home/tomaszmi/luabind/detail/call_function.hpp:374:24: error: member
access into incomplete type 'const luabind::object'
                return proxy_type(obj.interpreter(), 1, &detail::pcall, args);
                                     ^
/home/tomaszmi/luabind/detail/format_signature.hpp:18:7: note: forward
declaration of 'luabind::object'
class object;
      ^
In file included from /home/tomaszmi/src/stack_content_by_name.cpp:27:
In file included from /home/tomaszmi/luabind/luabind.hpp:28:
In file included from /home/tomaszmi/luabind/class.hpp:94:
In file included from /home/tomaszmi/luabind/function.hpp:10:
In file included from /home/tomaszmi/luabind/detail/call_function.hpp:320:
In file included from
/home/tomaszmi/boost/preprocessor/iteration/detail/iter/forward1.hpp:47:
/home/tomaszmi/luabind/detail/call_function.hpp:404:27: error:
reference to 'object' is ambiguous
        resume_function(luabind::object const& obj
BOOST_PP_COMMA_IF(BOOST_PP_ITERATION())
BOOST_PP_ENUM(BOOST_PP_ITERATION(), LUABIND_OPERATOR_PARAMS, _) )
                                 ^
/home/tomaszmi/luabind/object.hpp:826:12: note: candidate found by
name lookup is 'luabind::object'
using adl::object;
           ^
/home/tomaszmi/luabind/detail/format_signature.hpp:18:7: note:
candidate found by name lookup is 'luabind::object'
class object;
      ^
In file included from /home/tomaszmi/src/stack_content_by_name.cpp:27:
In file included from /home/tomaszmi/luabind/luabind.hpp:28:
In file included from /home/tomaszmi/luabind/class.hpp:94:
In file included from /home/tomaszmi/luabind/function.hpp:10:
In file included from /home/tomaszmi/luabind/detail/call_function.hpp:320:
In file included from
/home/tomaszmi/boost/preprocessor/iteration/detail/iter/forward1.hpp:47:
/home/tomaszmi/luabind/detail/call_function.hpp:416:6: error: member
access into incomplete type 'const luabind::object'
                obj.push(obj.interpreter());
                   ^
/home/tomaszmi/luabind/detail/format_signature.hpp:18:7: note: forward
declaration of 'luabind::object'
class object;
      ^
In file included from /home/tomaszmi/src/stack_content_by_name.cpp:27:
In file included from /home/tomaszmi/luabind/luabind.hpp:28:
In file included from /home/tomaszmi/luabind/class.hpp:94:
In file included from /home/tomaszmi/luabind/function.hpp:10:
In file included from /home/tomaszmi/luabind/detail/call_function.hpp:320:
In file included from
/home/tomaszmi/boost/preprocessor/iteration/detail/iter/forward1.hpp:47:
/home/tomaszmi/luabind/detail/call_function.hpp:417:24: error: member
access into incomplete type 'const luabind::object'
                return proxy_type(obj.interpreter(), 1,
&detail::resume_impl, args);
                                     ^
/home/tomaszmi/luabind/detail/format_signature.hpp:18:7: note: forward
declaration of 'luabind::object'
class object;
      ^
fatal error: too many errors emitted, stopping now [-ferror-limit=]
20 errors generated.
}}}


The object, argument and table<> classes are declared in the
luabind::adl namespace, so the forward declarations should follow
that:

namespace luabind { namespace adl {

class object;
class argument;
template <class Base>
struct table;

} // namespace adl

using adl::object;
using adl::argument;
using adl::table;

} // namespace luabind

See the attached format_signature.hpp file containing the fix.

Regards,
Tomek

------------------------------------------------------------------------------
Master Visual Studio, SharePoint, SQL, ASP.NET, C# 2012, HTML5, CSS,
MVC, Windows 8 Apps, JavaScript and much more. Keep your skills current
with LearnDevNow - 3,200 step-by-step video tutorials by Microsoft
MVPs and experts. SALE $99.99 this month only -- learn more at:
http://p.sf.net/sfu/learnmore_122412

_______________________________________________
luabind-user mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/luabind-user
format_signature.hpp (text/x-c++hdr, 3.4 KB)
// Copyright Daniel Wallin 2008. Use, modification and distribution is
// subject to the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)

#ifndef LUABIND_FORMAT_SIGNATURE_081014_HPP
# define LUABIND_FORMAT_SIGNATURE_081014_HPP

# include <luabind/config.hpp>
# include <luabind/lua_include.hpp>
# include <luabind/typeid.hpp>

# include <boost/mpl/begin_end.hpp>
# include <boost/mpl/next.hpp>
# include <boost/mpl/size.hpp>

namespace luabind { namespace adl {

class object;
class argument;
template <class Base>
struct table;

} // namespace adl

using adl::object;
using adl::argument;
using adl::table;

} // namespace luabind

namespace luabind { namespace detail {

LUABIND_API std::string get_class_name(lua_State* L, type_id const& i);

template <class T>
struct type_to_string
{
    static void get(lua_State* L)
    {
        lua_pushstring(L, get_class_name(L, typeid(T)).c_str());
    }
};

template <class T>
struct type_to_string<T*>
{
    static void get(lua_State* L)
    {
        type_to_string<T>::get(L);
        lua_pushstring(L, "*");
        lua_concat(L, 2);
    }
};

template <class T>
struct type_to_string<T&>
{
    static void get(lua_State* L)
    {
        type_to_string<T>::get(L);
        lua_pushstring(L, "&");
        lua_concat(L, 2);
    }
};

template <class T>
struct type_to_string<T const>
{
    static void get(lua_State* L)
    {
        type_to_string<T>::get(L);
        lua_pushstring(L, " const");
        lua_concat(L, 2);
    }
};

# define LUABIND_TYPE_TO_STRING(x) \
    template <> \
    struct type_to_string<x> \
    { \
        static void get(lua_State* L) \
        { \
            lua_pushstring(L, #x); \
        } \
    };

# define LUABIND_INTEGRAL_TYPE_TO_STRING(x) \
    LUABIND_TYPE_TO_STRING(x) \
    LUABIND_TYPE_TO_STRING(unsigned x)

LUABIND_INTEGRAL_TYPE_TO_STRING(char)
LUABIND_INTEGRAL_TYPE_TO_STRING(short)
LUABIND_INTEGRAL_TYPE_TO_STRING(int)
LUABIND_INTEGRAL_TYPE_TO_STRING(long)

LUABIND_TYPE_TO_STRING(void)
LUABIND_TYPE_TO_STRING(bool)
LUABIND_TYPE_TO_STRING(std::string)
LUABIND_TYPE_TO_STRING(lua_State)

LUABIND_TYPE_TO_STRING(luabind::object)
LUABIND_TYPE_TO_STRING(luabind::argument)

# undef LUABIND_INTEGRAL_TYPE_TO_STRING
# undef LUABIND_TYPE_TO_STRING

template <class Base>
struct type_to_string<table<Base> >
{
    static void get(lua_State* L)
    {
        lua_pushstring(L, "table");
    }
};

template <class End>
void format_signature_aux(lua_State*, bool, End, End)
{}

template <class Iter, class End>
void format_signature_aux(lua_State* L, bool first, Iter, End end)
{
    if (!first)
        lua_pushstring(L, ",");
    type_to_string<typename Iter::type>::get(L);
    format_signature_aux(L, false, typename mpl::next<Iter>::type(), end);
}

template <class Signature>
void format_signature(lua_State* L, char const* function, Signature)
{
    typedef typename mpl::begin<Signature>::type first;

    type_to_string<typename first::type>::get(L);

    lua_pushstring(L, " ");
    lua_pushstring(L, function);

    lua_pushstring(L, "(");
    format_signature_aux(
        L
      , true
      , typename mpl::next<first>::type()
      , typename mpl::end<Signature>::type()
    );
    lua_pushstring(L, ")");

    lua_concat(L, static_cast<int>(mpl::size<Signature>()) * 2 + 2);
}

}} // namespace luabind::detail

#endif // LUABIND_FORMAT_SIGNATURE_081014_HPP