On Thu, Jun 28, 2012 at 02:13:47PM -0400, Rafael Espíndola wrote: [ problem with visibility for bar::~bar for testcase ] > $ cat test.h > struct foo { > virtual ~foo(); > }; > struct bar : public foo { > virtual void zed(); > }; > $ cat def.cpp > #include "test.h" > void bar::zed() { > } > $ cat undef.cpp > #include "test.h" > void f() { > foo *x(new bar); > delete x; > } > ... > > I can see two ways of solving this and would like for both clang and > gcc to implement the same: > > [1] * Make sure the destructor is emitted everywhere. That is, clang and > gcc have a bug in producing an undefined reference to _ZN3barD0Ev. > [2] * Make it clear that the file exporting the vtable has to export the > symbols used in it. That is, the Itanium c++ abi needs clarification > and so does gcc's lto plugin (and the llvm patch I am working on).
I think that the second solution wins because it allows for the production of less object code, and it is consistent with the rationale for the vtable optimization rule (the vtable is emitted by the file that has the definition for the first non-inline virtual function; simply do the same for the auto-generated virtual destructor). The first solution requires making one copy per compilation unit and eliminating the duplicates at link time.