https://gcc.gnu.org/bugzilla/show_bug.cgi?id=45065
--- Comment #4 from Eric Gallager <egallager at gcc dot gnu.org> --- (In reply to Eric Gallager from comment #3) > (In reply to Dean Edmonds from comment #0) > > Compiling with -fvisibility=hidden and -fvisibility-inlines-hidden. > > > > I have a Base class with default visibility which contains two virtual > > methods, one inlined and the other not. A Derived class with hidden > > visibility overrides the non-inlined method and doesn't touch the inlined > > one. If the declaration of the overridden method appears *before* the > > Derived's virtual destructor then the object file for Derived weakly exports > > the Base class's inlined method. But if the declaration appears *after* > > Derived's virtual destructor then the object for Derived doesn't export the > > Base class's inlined method at all. > > > > Given that I'm compiling with -fvisibility-inlines-hidden I *think* that > > means that the Base class's inlined method should never be exported. Even if > > I'm wrong about that, surely it should not matter the order in which the > > Derived class's methods are declared. > > > > Here's an example which demonstrates the problem: > > > > class __attribute__ ((visibility("default"))) Base > > { > > public: > > Base(); > > virtual ~Base(); > > virtual void func() const; > > virtual void inlineFunc() {} > > }; > > > > class Derived : public Base > > { > > public: > > Derived(); > > void func() const; > > virtual ~Derived(); > > }; > > > > void Derived::func() const > > {} > > > > Compiled on OSX 10.6.4 with g++ 4.2.1, using the following command: > > > > g++-4.2 -Wall -c -arch x86_64 -fvisibility=hidden > > -fvisibility-inlines-hidden -O3 -m64 -isysroot > > /Developer/SDKs/MacOSX10.6.sdk -mmacosx-version-min=10.6 -o Derived.o > > Derived.cpp > > > > Looking at the object file using 'nm -m Derived.o | grep inlineFunc' gives: > > > > 0000000000000010 (__TEXT,__textcoal_nt) weak private external > > __ZN6Common10inlineFuncEv > > 0000000000000098 (__TEXT,__eh_frame) weak private external > > __ZN6Common10inlineFuncEv.eh > > > > If I move the declaration of Derived::func() so that it comes after > > ~Derived() then 'nm -m Derived.o | grep inlineFunc' returns nothing. > > > > > > On 10.5 with gcc8, the grep only returns one line: > > $ /usr/local/bin/g++ -Wall -c -arch x86_64 -fvisibility=hidden > -fvisibility-inlines-hidden -O3 -m64 -isysroot > /Developer/SDKs/MacOSX10.5.sdk -mmacosx-version-min=10.5 -Wextra -pedantic > -o 45065.o 45065.cc > $ nm -m 45065.o | grep inlineFunc > 0000000000000010 (__TEXT,__textcoal_nt) weak private external > __ZN4Base10inlineFuncEv > > The difference is no version suffixed with '.eh' so I think it's a 10.5 to > 10.6 difference. huh, that's strange, I checked on 10.6 and I don't get the '.eh'-suffixed version here either, so I guess it isn't a 10.5 vs. 10.6 difference after all... what version cctools were you using? > > > I see similar behaviour on GNU/Linux (2.6.30.9-96.fc11.x86_64) using g++ > > 4.4.1. Compiling with this command: > > > > g++ -Wall -c -fvisibility=hidden -fvisibility-inlines-hidden -O3 -m64 -o > > Derived.o Derived.cpp > > > > and using 'objdump -t Derived.o | grep inlineFunc' to inspect the result > > gives this when Derived::func() is declared before ~Derived(): > > > > 0000000000000000 l d .text._ZN4Base10inlineFuncEv 0000000000000000 > > .text._ZN4Base10inlineFuncEv > > 0000000000000000 w F .text._ZN4Base10inlineFuncEv 0000000000000002 > > .hidden _ZN4Base10inlineFuncEv > > > > and gives nothing when Derived::func() is declared after ~Derived(). > > (In reply to Paolo Carlini from comment #2) > > I can confirm the behavior with today's mainline. And seems weird indeed. > > Changing status to NEW then since it's confirmed.