Opened 11 years ago

Closed 11 years ago

#6207 closed Bugs (fixed)

shared_lock swap compiler error on clang 3.0 c++11

Reported by: viboes Owned by: viboes
Milestone: Boost 1.49.0 Component: thread
Version: Boost 1.48.0 Severity: Problem
Keywords: swap Cc: viboes

Description

While runing the regression test on clang-3.0/2.9 c++11 the following compile error appears

clang-darwin.compile.c++ ../../../bin.v2/libs/thread/test/test_lock_concept.test/clang-darwin-2.9x/debug/threading-multi/test_lock_concept.o
In file included from test_lock_concept.cpp:6:
In file included from ../../../boost/test/unit_test.hpp:19:
In file included from ../../../boost/test/test_tools.hpp:20:
In file included from ../../../boost/test/unit_test_log.hpp:21:
In file included from ../../../boost/test/tree/observer.hpp:20:
In file included from ../../../boost/test/detail/global_typedef.hpp:18:
In file included from ../../../boost/test/utils/basic_cstring/basic_cstring.hpp:21:
In file included from ../../../boost/test/utils/basic_cstring/bcs_char_traits.hpp:25:
In file included from /usr/include/c++/4.2.1/string:46:
In file included from /usr/include/c++/4.2.1/bits/char_traits.h:45:
/usr/include/c++/4.2.1/bits/stl_algobase.h:99:11: error: 'operator=' is a private member of 'boost::shared_lock<boost::shared_mutex>'
      __a = __b;
      ~~~ ^ ~~~
In file included from test_lock_concept.cpp:6:
In file included from ../../../boost/test/unit_test.hpp:20:
In file included from ../../../boost/test/unit_test_suite.hpp:21:
In file included from ../../../boost/test/tree/test_case_template.hpp:31:
In file included from ../../../boost/mpl/for_each.hpp:28:
In file included from ../../../boost/utility/value_init.hpp:30:
In file included from ../../../boost/swap.hpp:10:
../../../boost/utility/swap.hpp:33:5: note: in instantiation of function template specialization 'std::swap<boost::shared_lock<boost::shared_mutex> >' requested here
    swap(left,right);
    ^
../../../boost/utility/swap.hpp:51:5: note: in instantiation of function template specialization 'boost_swap_impl::swap_impl<boost::shared_lock<boost::shared_mutex> >' requested here
    ::boost_swap_impl::swap_impl(left, right);
    ^
test_lock_concept.cpp:394:9: note: in instantiation of function template specialization 'boost::swap<boost::shared_lock<boost::shared_mutex>, boost::shared_lock<boost::shared_mutex> >' requested here
        swap(l1,l2);
        ^
test_lock_concept.cpp:535:44: note: in instantiation of member function 'test_locks_can_be_swapped<boost::shared_mutex, boost::shared_lock<boost::shared_mutex> >::operator()' requested here
    test_locks_can_be_swapped<Mutex,Lock>()();

I think the problem comes from this declaration:

#ifndef BOOST_NO_RVALUE_REFERENCES

template<typename Mutex> void swap(shared_lock<Mutex>&& lhs,shared_lock<Mutex>&& rhs) {

lhs.swap(rhs);

}

#else

template<typename Mutex> void swap(shared_lock<Mutex>& lhs,shared_lock<Mutex>& rhs) {

lhs.swap(rhs);

}

#endif

As I suspect that the overloading is not working. BTW, all the working swap overloads use the non moving interface.

When I use instead

template<typename Mutex> void swap(shared_lock<Mutex>& lhs,shared_lock<Mutex>& rhs) {

lhs.swap(rhs);

}

the test works.

Change History (4)

comment:1 by viboes, 11 years ago

Component: Nonethread

Sorry I mean when I add the overloading

#ifndef BOOST_NO_RVALUE_REFERENCES
    template<typename Mutex>
    void swap(shared_lock<Mutex>&& lhs,shared_lock<Mutex>&& rhs)
    {
        lhs.swap(rhs);
    }
    template<typename Mutex>
    void swap(shared_lock<Mutex>& lhs,shared_lock<Mutex>& rhs)
    {
        lhs.swap(rhs);
    }
#else
    template<typename Mutex>
    void swap(shared_lock<Mutex>& lhs,shared_lock<Mutex>& rhs)
    {
        lhs.swap(rhs);
    }
#endif

comment:2 by viboes, 11 years ago

Cc: viboes added

Committed in trunk revision 75801.

comment:3 by viboes, 11 years ago

Status: newassigned

comment:4 by viboes, 11 years ago

Resolution: fixed
Status: assignedclosed

Committed in release at #76291

Note: See TracTickets for help on using tickets.