[cfe-dev] [libc++] clang / libc++ fail to compile the code with boost
Eli Friedman
eli.friedman at gmail.com
Fri Jul 1 19:55:55 PDT 2011
On Fri, Jul 1, 2011 at 7:09 PM, ryuuta <ryuuta at gmail.com> wrote:
> Hi,
> I bet the problem is in boost implementation but
> I'm not 100% sure whether the issue is really on boost side or not.
> Compiling the following code
> $ cat boost_thread.cpp
> #include <boost/thread.hpp>
> int main()
> {
> return 0;
> }
> $ clang++ -stdlib=libc++ ./boost_thread.cpp
> In file included from ./boost_thread.cpp:1:
> In file included from /usr/include/boost/thread.hpp:24:
> In file included from /usr/include/boost/thread/future.hpp:14:
> In file included from /usr/include/boost/exception_ptr.hpp:9:
> In file included from
> /usr/include/boost/exception/detail/exception_ptr.hpp:19:
> In file included from /usr/include/boost/exception/info.hpp:15:
> In file included from /usr/include/boost/exception/to_string_stub.hpp:15:
> In file included from
> /usr/include/boost/exception/detail/object_hex_dump.hpp:14:
> /usr/include/boost/exception/detail/type_info.hpp:53:9: error: cannot define
> the implicit default assignment operator for
> 'boost::exception_detail::type_info_', because non-static reference
> member 'type_' can't use default assignment operator
> type_info_
> ^
> /usr/include/c++/v1/__tree:1244:35: note: in instantiation of member
> function 'std::__1::pair<boost::exception_detail::type_info_,
> boost::shared_ptr<boost::exception_detail::error_info_base>
>>::operator=' requested here
> __cache->__value_ = *__first;
> ^
> /usr/include/c++/v1/__tree:1185:9: note: in instantiation of function
> template specialization
> 'std::__1::__tree<std::__1::pair<boost::exception_detail::type_info_,
> boost::shared_ptr<boost::exception_detail::error_info_base> >,
> std::__1::__map_value_compare<boost::exception_detail::type_info_,
> boost::shared_ptr<boost::exception_detail::error_info_base>,
> std::__1::less<boost::exception_detail::type_info_>, true>,
> std::__1::allocator<std::__1::pair<boost::exception_detail::type_info_,
> boost::shared_ptr<boost::exception_detail::error_info_base> > >
>
>>::__assign_multi<std::__1::__tree_const_iterator<std::__1::pair<boost::exception_detail::type_info_,
> boost::shared_ptr<boost::exception_detail::error_info_base> >, const
> std::__1::__tree_node<std::__1::pair<boost::exception_detail::type_info_,
> boost::shared_ptr<boost::exception_detail::error_info_base> >, void *>
> *, long> >' requested here
> __assign_multi(__t.begin(), __t.end());
> ^
> /usr/include/c++/v1/map:760:21: note: in instantiation of member function
> 'std::__1::__tree<std::__1::pair<boost::exception_detail::type_info_,
> boost::shared_ptr<boost::exception_detail::error_info_base> >,
> std::__1::__map_value_compare<boost::exception_detail::type_info_,
> boost::shared_ptr<boost::exception_detail::error_info_base>,
> std::__1::less<boost::exception_detail::type_info_>, true>,
>
> std::__1::allocator<std::__1::pair<boost::exception_detail::type_info_,
> boost::shared_ptr<boost::exception_detail::error_info_base> > >
>>::operator='
> requested here
> __tree_ = __m.__tree_;
> ^
> /usr/include/boost/exception/info.hpp:160:26: note: in instantiation of
> member function 'std::__1::map<boost::exception_detail::type_info_,
> boost::shared_ptr<boost::exception_detail::error_info_base>,
> std::__1::less<boost::exception_detail::type_info_>,
> std::__1::allocator<std::__1::pair<const
> boost::exception_detail::type_info_,
> boost::shared_ptr<boost::exception_detail::error_info_base> > >
> >::operator=' requested here
> c->info_ = info_;
> ^
> /usr/include/boost/exception/detail/type_info.hpp:55:41: note: declared here
> detail::sp_typeinfo const & type_;
> ^
> /usr/include/c++/v1/utility:247:15: note: implicit default copy assignment
> operator for 'boost::exception_detail::type_info_' first required here
> first = __p.first;
> ^
> 1 error generated.
> ===================================
> Since
> $ clang++ -stdlib=libstdc++ ./boost_thread.cpp
> has worked perfectly fine my guess is that boost_thread.hpp doesn't strictly
> conform to the standard.
> Any comment will be appreciated.
> Thanks,
> Ryuta
> p.s.
> My boost library is 1.46.1.
Testcase without boost:
#include <map>
struct A { int& x; explicit A(int); public: bool operator<(const A&
other) const {return x < other.x; }};
void f(A* x) { std::map<A, int> y, z; z = y; }
This looks like a boost bug to me... as far as I can tell, the Key
type of an std::map is required to be assignable if you're assigning
one map to another (although the implementation isn't required to
actually use that assignment operator).
-Eli
More information about the cfe-dev
mailing list