https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95321
Bug ID: 95321 Summary: Run-time crash on valid destructor code Product: gcc Version: 9.1.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: fxcoudert at gcc dot gnu.org Target Milestone: --- // Run-time crash with g++ >= 9 and -Ox, x > 1 // Works perfectly with g++ <= 8.3 class IDestroyable { protected: virtual void Destroy() = 0; public: void operator delete (void * ptr) { if (ptr != nullptr) static_cast<IDestroyable *>(ptr)->Destroy(); } }; class IToto { public: virtual void Toto() = 0; }; class ITotoDestroyable : public IToto, public IDestroyable { public: void operator delete (void * ptr) { if (ptr != nullptr) delete static_cast<IDestroyable *>(static_cast<ITotoDestroyable *>(ptr)); } }; template <typename INTERFACE> class DestroyableBase : public INTERFACE { protected: virtual void Destroy() { ::delete this; } public: virtual ~DestroyableBase() { } void operator delete (void * ptr) { ::operator delete (ptr); } }; #include <iostream> class TotoDestroyable : public DestroyableBase<ITotoDestroyable> { public: ~TotoDestroyable() { std::cout << "OK Destroyed !\n"; } void Toto() { std::cout << "Toto !\n"; } }; int main() { ITotoDestroyable * foo = new TotoDestroyable(); // Uncomment to workaround the crash // foo->Toto(); delete foo; } Segfaults at runtime when compiled with G++ >= 9 and -O1 or higher. Process 52619 launched: '/tmp/a.out' (x86_64) Process 52619 stopped * thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x0) frame #0: 0x0000000100000d44 a.out`main [inlined] IDestroyable::operator delete(ptr=0x0000000100604858) at a.cpp:11:70 8 public: 9 void operator delete (void * ptr) 10 { -> 11 if (ptr != nullptr) static_cast<IDestroyable *>(ptr)->Destroy(); 12 } 13 }; 14