<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Sat, Jan 17, 2015 at 10:59 AM, Edward Diener <span dir="ltr"><<a href="mailto:eldlistmailingz@tropicsoft.com" target="_blank">eldlistmailingz@tropicsoft.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><span class="">On 1/17/2015 11:53 AM, David Blaikie wrote:<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
Do you have a complete (standalone - preprocessed) example of this behavior?<br>
</blockquote>
<br></span>
Currently it come from trying to build Boost.Test on Windows using clang for Windows built for mingw/gcc-4.8.1.<br>
<br>
There is an execution_monitor class in execution_monitor.hpp which has as a member:<br>
<br>
boost::scoped_ptr<detail::<u></u>translate_exception_base> m_custom_translators;<br>
<br>
The detail::translate_exception_<u></u>base class, which is an abstract class, itself has as a member:<br>
<br>
boost::scoped_ptr<translate_<u></u>exception_base> m_next;<br>
<br>
boost::scoped_ptr is the inspiration for std::unique_ptr and is non-copyable, non-asignable. An execution_monitor instance is never copied or assigned.<br>
<br>
Building Boost.Test with clang gives errors:<br>
<br>
------------------------------<u></u>-------------------<br>
<br><font face="monospace, monospace">
"..\..\..\boost/test/<u></u>execution_monitor.hpp:59:23: error: 'operator=' is a private member of 'boost::scoped_ptr<boost::<u></u>detail::translate_exception_<u></u>base>'<br>
class BOOST_TEST_DECL translate_exception_base {<br>
                      ^<br>
..\..\..\boost/smart_ptr/<u></u>scoped_ptr.hpp:48:18: note: declared private here<br>
    scoped_ptr & operator=(scoped_ptr const &);<br>
                 ^<br>
..\..\..\boost/test/execution_<u></u>monitor.hpp:59:23: note: implicit copy assignment operator for 'boost::detail::translate_<u></u>exception_base' first required here<br>
class BOOST_TEST_DECL translate_exception_base {<br>
                      ^<br>
..\..\..\boost/test/execution_<u></u>monitor.hpp:59:23: error: field of type 'boost::scoped_ptr<translate_<u></u>exception_base>' has private copy constructor<br>
class BOOST_TEST_DECL translate_exception_base {<br>
                      ^<br>
..\..\..\boost/smart_ptr/<u></u>scoped_ptr.hpp:47:5: note: declared private here<br>
    scoped_ptr(scoped_ptr const &);<br>
    ^<br>
..\..\..\boost/test/execution_<u></u>monitor.hpp:59:23: note: implicit copy constructor for 'boost::detail::translate_<u></u>exception_base' first required here<br>
class BOOST_TEST_DECL translate_exception_base {<br>
                      ^<br>
..\..\..\boost/test/execution_<u></u>monitor.hpp:143:23: error: field of type 'boost::scoped_ptr<detail::<u></u>translate_exception_base>' has private copy constructor<br>
class BOOST_TEST_DECL execution_monitor {<br>
                      ^<br>
..\..\..\boost/smart_ptr/<u></u>scoped_ptr.hpp:47:5: note: declared private here<br>
    scoped_ptr(scoped_ptr const &);<br>
    ^</font>"<br>
<br>
------------------------------<u></u>----------------<br>
<br>
Gcc 4.8.1, which is used to build clang has no problem with any of this.<br>
<br>
I can try to work up as simple a standalone example as possible which will replicate this behavior.<br></blockquote><div><br>Step one is just to get the preprocessed source (compile with -E) and check that that reproduces the behavior - you can at least share that with us then we won't have to try to get exactly the same version of boost, whatever other system headers you have, etc.<br><br>(though it might still be something that only reproduces in windows mode, so knowing the full underlying command line (if you're running clang manually, you can run with -### and give us the details it prints out) can be useful too)<br><br>Ah, I think I see what it is (perhaps we could do a better job of the diagnostic)<br><br>BOOST_TEST_DECL can expand to declspec(dllexport) ( <a href="http://www.boost.org/doc/libs/1_40_0/boost/test/detail/config.hpp">http://www.boost.org/doc/libs/1_40_0/boost/test/detail/config.hpp</a> ) - which would (perhaps only on Clang?) cause all the implicit special members, like assignment operators, to be generated. Since it can't be generated, it fails.<br><br>Maybe the right behavior here is to only generate those that are valid? (one of the Windows-y guys (cc'd) will probably test out the various corner cases with MSVC here and see what the desired behavior is)<br> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><span class="">
<br>
On Sat, Jan 17, 2015 at 8:06 AM, Edward Diener<br>
<<a href="mailto:eldlistmailingz@tropicsoft.com" target="_blank">eldlistmailingz@tropicsoft.<u></u>com</a><br></span><span class="">
<mailto:<a href="mailto:eldlistmailingz@tropicsoft.com" target="_blank">eldlistmailingz@<u></u>tropicsoft.com</a>>> wrote:<br>
<br>
    I am using the latest clang built from source. I am seeing this<br>
    situation:<br>
<br></span>
    class XXX { some_non_copyable_non___<u></u>assignable_member_type member; }<span class=""><br>
<br>
    An object of class XXX never gets copied or assigned (it's a<br>
    singleton ) and yet clang is giving an errors of the form:<br>
<br>
    error: 'operator=' is a private member of<br></span>
    'some_non_assignable_member___<u></u>type'.<span class=""><br>
<br>
    and<br>
<br>
    error: field of type<br></span>
    'some_non_copyable_non___<u></u>assignable_member_type' has private copy<span class=""><br>
    constructor<br>
<br>
    My understanding of C++ is that if a member of a class is<br>
    non-copyable and non-assignable and an instance of that class is<br>
    never copied or assigned it is not an error even if the compiler<br>
    would be creating a default copy constructor and default assignment<br>
    operator when the class does not have user-defined versions.<br>
<br>
    The command line options to the clang++.exe compiler are:<br>
<br>
    -c -x c++ -O0 -g -fno-inline -Wall -pedantic -g<br>
<br>
<br>
<br>
<br></span>
    ______________________________<u></u>___________________<br>
    cfe-dev mailing list<br>
    <a href="mailto:cfe-dev@cs.uiuc.edu" target="_blank">cfe-dev@cs.uiuc.edu</a><br>
    <mailto:<a href="mailto:cfe-dev@cs.uiuc.edu" target="_blank">cfe-dev@cs.uiuc.edu</a>><br>
    <a href="http://lists.cs.uiuc.edu/__mailman/listinfo/cfe-dev" target="_blank">http://lists.cs.uiuc.edu/__<u></u>mailman/listinfo/cfe-dev</a><br>
    <<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev" target="_blank">http://lists.cs.uiuc.edu/<u></u>mailman/listinfo/cfe-dev</a>><span class=""><br>
<br>
<br>
<br>
<br>
______________________________<u></u>_________________<br>
cfe-dev mailing list<br>
<a href="mailto:cfe-dev@cs.uiuc.edu" target="_blank">cfe-dev@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev" target="_blank">http://lists.cs.uiuc.edu/<u></u>mailman/listinfo/cfe-dev</a><br>
<br>
</span></blockquote><div class=""><div class="h5">
<br>
<br>
______________________________<u></u>_________________<br>
cfe-dev mailing list<br>
<a href="mailto:cfe-dev@cs.uiuc.edu" target="_blank">cfe-dev@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev" target="_blank">http://lists.cs.uiuc.edu/<u></u>mailman/listinfo/cfe-dev</a><br>
</div></div></blockquote></div><br></div></div>