* Dimitry Andric (d...@freebsd.org) wrote:

> We're working on updating llvm, clang and lldb to 3.5.0 in head.
> This is quite a big update again, and any help with testing is
> appreciated.

Well, of 4 error logs from exp-run I've checked (one my port and 3
unmaintained ports) two had basically the same problem and it seems
to be libc++ related, so I ask: was new version of libc++ imported
along with clang/llvm? Past experience show that libc++ should be
updated along with clang, as it may have bugs new clang versions
are not tolerable to.

I've prepared the minimal test program to demonstrate the problem:

--- test.cc begins here ---
#include <functional>
#include <iostream>

class Foo {
public:
        void Const() const { std::cerr << "OK" << std::endl; }
};

int main() {
        Foo foo;
        auto f = std::bind(&Foo::Const, foo);
        f();

        return 0;
}
--- test.cc ends here ---

Note that the method std::bind is used on is const (non-const methods
produce no problems). 

Here's how it works:

--- test.log begins here ---
% for CC in c++ g++48 g++49 g++5 clang++33 clang++34 clang++35; do echo "===> 
${CC}"; ${CC} -std=c++11 test.cc && ./a.out; done
===> c++
OK
===> g++48
OK
===> g++49
OK
===> g++5
OK
===> clang++33
OK
===> clang++34
OK
===> clang++35
In file included from test.cc:1:
In file included from /usr/include/c++/v1/functional:474:
/usr/include/c++/v1/type_traits:433:76: error: no matching function for call to 
'__source'
    : public integral_constant<bool, 
sizeof(__is_function_imp::__test<_Tp>(__is_function_imp::__source<_Tp>())) == 1>
                                                                           
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/include/c++/v1/type_traits:438:14: note: in instantiation of template 
class 'std::__1::__libcpp_is_function<void () const, false>' requested here
    : public __libcpp_is_function<_Tp> {};
             ^
/usr/include/c++/v1/type_traits:443:97: note: in instantiation of template 
class 'std::__1::is_function<void () const>' requested here
template <class _Tp, class _Up> struct __libcpp_is_member_function_pointer<_Tp 
_Up::*> : public is_function<_Tp> {};
                                                                                
                ^
/usr/include/c++/v1/type_traits:446:14: note: in instantiation of template 
class 'std::__1::__libcpp_is_member_function_pointer<void (Foo::*)() const>' 
requested here
    : public __libcpp_is_member_function_pointer<typename remove_cv<_Tp>::type> 
{};
             ^
/usr/include/c++/v1/type_traits:460:38: note: in instantiation of template 
class 'std::__1::is_member_function_pointer<void (Foo::*)() const>' requested 
here
                                    !is_member_function_pointer<_Tp>::value> {};
                                     ^
/usr/include/c++/v1/type_traits:3093:17: note: in instantiation of template 
class 'std::__1::is_member_object_pointer<void (Foo::*)() const>' requested here
                is_member_object_pointer<typename 
remove_reference<_Fp>::type>::value &&
                ^
/usr/include/c++/v1/type_traits:3100:1: note: (skipping 2 contexts in 
backtrace; use -ftemplate-backtrace-limit=0 to see all)
__invoke(_Fp&& __f, _A0&& __a0)
^
/usr/include/c++/v1/type_traits:3126:11: note: in instantiation of template 
class 'std::__1::__invokable_imp<void (Foo::*)() const, Foo &>' requested here
          __invokable_imp<_Fp, _Args...>::value>
          ^
/usr/include/c++/v1/functional:1973:31: note: in instantiation of template 
class 'std::__1::__invokable<void (Foo::*)() const, Foo &>' requested here
    static const bool value = __invokable<_Fp,
                              ^
/usr/include/c++/v1/functional:1985:18: note: in instantiation of template 
class 'std::__1::_is_valid_bind_return<void (Foo::*)() const, 
std::__1::tuple<Foo>, std::__1::tuple<> >' requested here
          bool = _is_valid_bind_return<_Fp, _BoundArgs, _TupleUj>::value>
                 ^
/usr/include/c++/v1/functional:2082:18: note: in instantiation of default 
argument for '__bind_return<void (Foo::*)() const, std::__1::tuple<Foo>, 
std::__1::tuple<> >' required here
        typename __bind_return<_Fd, _Td, tuple<_Args&&...> >::type
                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
test.cc:12:3: note: while substituting deduced template arguments into function 
template 'operator()' [with _Args = <>]
        f();
         ^
/usr/include/c++/v1/type_traits:424:28: note: candidate template ignored: 
substitution failure [with _Tp = void () const]: reference to function type 
'void () const' cannot have 'const' qualifier
template <class _Tp> _Tp&  __source();
                     ~~~   ^
test.cc:12:2: error: no matching function for call to object of type 
'std::__1::__bind<void (Foo::*)() const, Foo &>'
        f();
        ^
/usr/include/c++/v1/functional:2083:9: note: candidate template ignored: 
substitution failure [with _Args = <>]: implicit instantiation of undefined 
template 'std::__1::__bind_return<void (Foo::*)() const, std::__1::tuple<Foo>, 
std::__1::tuple<>, false>'
        operator()(_Args&& ...__args)
        ^
/usr/include/c++/v1/functional:2092:9: note: candidate template ignored: 
substitution failure [with _Args = <>]: implicit instantiation of undefined 
template 'std::__1::__bind_return<void (Foo::*const)() const, const 
std::__1::tuple<Foo>, std::__1::tuple<>, false>'
        operator()(_Args&& ...__args) const
        ^
2 errors generated.
--- test.log ends here ---

I think this should be fixed in the first place.

-- 
Dmitry Marakasov   .   55B5 0596 FF1E 8D84 5F56  9510 D35A 80DD F9D2 F77D
amd...@amdmi3.ru  ..:  jabber: amd...@jabber.ru    http://www.amdmi3.ru
_______________________________________________
freebsd-current@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to "freebsd-current-unsubscr...@freebsd.org"

Reply via email to