http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58201
--- Comment #7 from Jan Hubicka <hubicka at gcc dot gnu.org> --- OK, the destructor is used as: _ZN1BD2EPPKv/21 (B::~B()) @0x7f56014ecd10 Type: function Visibility: external public References: Referring: Availability: not_available Function flags: Called by: _ZN1C2C2D2Ev/4 (1.00 per call) (can throw external) _ZN1C2C2D1Ev/5 (1.00 per call) Calls: _ZN1C2C2D2Ev/4 (C::C2::~C2()) @0x7f56014d2d10 Type: function definition analyzed Visibility: public Aux: @0x7f56014d2e40 References: __gxx_personality_v0/18 (addr) Referring: Function flags: body Called by: Calls: A::~A()/20 (1.00 per call) void operator delete(void*)/22 (1.00 per call) A::~A()/20 (1.00 per call) B::~B()/21 (1.00 per call) Now with older GCC we do not output _ZN1C2C2D2Ev Older GCC gets: C::C2::~C2()/4 @0x7f15ce0c6360 (asm: _ZN1C2C2D2Ev) analyzed needed reachable body finalized called by: calls: A::~A()/16 (1.00 per call) void operator delete(void*)/14 (1.00 per call) A::~A()/16 (1.00 per call) (can throw external) B::~B()/15 (1.00 per call) References: fn:<built-in>/17 (addr) Refering this function: B::~B()/15 @0x7f15ce0d4000 (asm: _ZN1BD2Ev) availability:not_available called by: C::C2::~C2()/4 (1.00 per call) (can throw external) virtual C::C2::~C2()/5 (1.00 per call) calls: References: Refering this function: So it calls B::~B() instead of B::~B(void const**) The extra const** parameter is however passed in both I am not really sure how this difference happens...