http://gcc.gnu.org/bugzilla/show_bug.cgi?id=47218

           Summary: [4.6.0 regression] C++ multiple definitions of
                    non-virtual thunk problem
           Product: gcc
           Version: 4.6.0
            Status: UNCONFIRMED
          Severity: major
          Priority: P3
         Component: c++
        AssignedTo: unassig...@gcc.gnu.org
        ReportedBy: da...@gcc.gnu.org


Sometime between 2010-12-22 and rev.167484, something changed in the behaviour
of the C++ compiler w.r.t the way it handles non-virtual thunks.  I have just
discovered this while working on a patch for PR43601; a compiler built from
trunk on the earlier date reproduces the problem described there, ending in an
out-of-memory error during the final link:

Creating library file:
/tmp/wx/obj-x-ming-new/lib/libwx_mswd_core-2.8.dll.a/opt/
mingw-new/lib/gcc/i686-pc-mingw32/4.6.0/../../../../i686-pc-mingw32/bin/ld:
fina
l link failed: Memory exhausted
collect2: ld returned 1 exit status


... whereas a compiler built from r.167484 emits a whole lot of
multiple-definition errors, and stops before trying to complete the link:

Creating library file:
/tmp/wx/obj-x-ming-clean/lib/libwx_based-2.8.dll.abasedll_wfstream.o:/tmp/wx/wxWidgets-2.8.11/src/common/wfstream.cpp:407:
multiple definition of `non-virtual thunk to wxFFileStream::~wxFFileStream()'
basedll_filesys.o:/tmp/wx/wxWidgets-2.8.11/src/common/filesys.cpp:697: first
defined here
basedll_wfstream.o:/tmp/wx/wxWidgets-2.8.11/src/common/wfstream.cpp:407:
multiple definition of `non-virtual thunk to wxFFileStream::~wxFFileStream()'
basedll_filesys.o:/tmp/wx/wxWidgets-2.8.11/src/common/filesys.cpp:697: first
defined here
basedll_wfstream.o:/tmp/wx/wxWidgets-2.8.11/src/common/wfstream.cpp:407:
multiple definition of `non-virtual thunk to wxFileStream::~wxFileStream()'
basedll_filesys.o:/tmp/wx/wxWidgets-2.8.11/src/common/filesys.cpp:697: first
defined here
basedll_wfstream.o:/tmp/wx/wxWidgets-2.8.11/src/common/wfstream.cpp:407:
multiple definition of `non-virtual thunk to wxFileStream::~wxFileStream()'
basedll_filesys.o:/tmp/wx/wxWidgets-2.8.11/src/common/filesys.cpp:697: first
defined here
basedll_zipstrm.o:/tmp/wx/wxWidgets-2.8.11/src/common/zipstrm.cpp:2423:
multiple definition of `non-virtual thunk to wxFFileStream::~wxFFileStream()'
basedll_filesys.o:/tmp/wx/wxWidgets-2.8.11/src/common/filesys.cpp:697: first
defined here
basedll_zipstrm.o:/tmp/wx/wxWidgets-2.8.11/src/common/zipstrm.cpp:2423:
multiple definition of `non-virtual thunk to wxFFileStream::~wxFFileStream()'
basedll_filesys.o:/tmp/wx/wxWidgets-2.8.11/src/common/filesys.cpp:697: first
defined here
basedll_zipstrm.o:/tmp/wx/wxWidgets-2.8.11/src/common/zipstrm.cpp:2423:
multiple definition of `non-virtual thunk to wxFileStream::~wxFileStream()'
basedll_filesys.o:/tmp/wx/wxWidgets-2.8.11/src/common/filesys.cpp:697: first
defined here
basedll_zipstrm.o:/tmp/wx/wxWidgets-2.8.11/src/common/zipstrm.cpp:2423:
multiple definition of `non-virtual thunk to wxFileStream::~wxFileStream()'
basedll_filesys.o:/tmp/wx/wxWidgets-2.8.11/src/common/filesys.cpp:697: first
defined here
basedll_registry.o:/tmp/wx/wxWidgets-2.8.11/src/msw/registry.cpp:1428: multiple
definition of `non-virtual thunk to wxFFileStream::~wxFFileStream()'
basedll_filesys.o:/tmp/wx/wxWidgets-2.8.11/src/common/filesys.cpp:697: first
defined here
basedll_registry.o:/tmp/wx/wxWidgets-2.8.11/src/msw/registry.cpp:1428: multiple
definition of `non-virtual thunk to wxFFileStream::~wxFFileStream()'
basedll_filesys.o:/tmp/wx/wxWidgets-2.8.11/src/common/filesys.cpp:697: first
defined here
basedll_registry.o:/tmp/wx/wxWidgets-2.8.11/src/msw/registry.cpp:1428: multiple
definition of `non-virtual thunk to wxFileStream::~wxFileStream()'
basedll_filesys.o:/tmp/wx/wxWidgets-2.8.11/src/common/filesys.cpp:697: first
defined here
basedll_registry.o:/tmp/wx/wxWidgets-2.8.11/src/msw/registry.cpp:1428: multiple
definition of `non-virtual thunk to wxFileStream::~wxFileStream()'
basedll_filesys.o:/tmp/wx/wxWidgets-2.8.11/src/common/filesys.cpp:697: first
defined here
collect2: ld returned 1 exit status

In both cases the build was configured with a cygwin-x-mingw cross compiler
using the same command line:

$ /tmp/wx/wxWidgets-2.8.11/configure --with-msw --enable-debug
--enable-debug_gdb --enable-shared 2>&1 --host=i686-pc-mingw32 

More once I've diagnosed what's going on in some of the generated object files.
 I've marked this major as it could easily affect a whole lot of c++ library
builds, but may reduce that severity if it turns out to be something unusual
that wx is doing.  However it's still a regression.

Reply via email to