MSVC being stupid (again)?

Stephan Bergmann sbergman at redhat.com
Thu Mar 8 10:18:58 UTC 2018


On 07.03.2018 08:39, Bjoern Michaelsen wrote:
> Im going slightly mad over:
> 
>   https://gerrit.libreoffice.org/#/c/49565/
> 
> it:
> 
> - uses a class which has a move ctor in a std container and a deleted copy
>    ctor, which _should_ be fine
> - compiles fine on OSX and Linux gcc and Linux clang
> - it fails on MSVC with some bull&^(t errors that start off with "I tried to
>    instanciate the deleted copy ctor" (which sounds almost reasonable) but ends
>    with stuff including boost::args. which has ~nothing to do with the changes
>    stl stuff involved and sound like it really took a wrong turn at some place
> - copying and renaming the involved clasess to uwriter seems to make the
>    std::list<SwDepend2> compile just fine
> 
> My gut feeling is that window precompiled headers are hitting a broken corner
> case here. Anyone having any hints?

What I note is that SwDepend has a move ctor but no move assignment op. 
Both SwDepend and WriterMultiListener (containing a std::list<SwDepend> 
member) being SW_DLLPUBLIC, I assume that MSVC wants to instantiate some 
std::list<SwDepend> inline member function that requires SwDepend to be 
MoveAssignable.  Even if that function would never be used (and thus 
Clang/GCC not instantiating it for non-MSVC ABIs, and not running into 
an issue), MSVC would still want to do that when those SW_DLLPUBLIC 
expand to __declspec(dllexport).

(Or maybe it's even trying to instantiate a std::list<SwDepend> member 
function that requires SwDepend to indeed be CopyConstructible.  But, 
without looking deeper now, I would suspect that would be a bug in 
MSVC's standard library.)

Not sure if this could be fixed by making select (implicit) member 
functions of SwDepend and/or WriterMultiListener non-inline and moving 
their definitions out into a .cxx.


More information about the LibreOffice mailing list