http://gcc.gnu.org/bugzilla/show_bug.cgi?id=53613
Bug #: 53613 Summary: Cannot override a inline "= default" virtual destructor. Classification: Unclassified Product: gcc Version: 4.7.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ AssignedTo: unassig...@gcc.gnu.org ReportedBy: kirbyz...@sogou-inc.com [root@djt-17-109-v06 tmp]# cat tover.cpp struct __cook { virtual ~__cook() = default; }; struct __cook1: public __cook { virtual ~__cook1() = default; }; struct __cook2: public __cook { virtual ~__cook2(); }; __cook2::~__cook2() {}; struct __cook3: public __cook { virtual ~__cook3(); }; __cook3::~__cook3() = default; [root@djt-17-109-v06 tmp]# g++47 -c -std=gnu++11 tover.cpp tover.cpp:6:10: error: looser throw specifier for 'virtual __cook1::~__cook1()' tover.cpp:2:10: error: overriding 'virtual __cook::~__cook() noexcept (true)' tover.cpp:10:10: error: looser throw specifier for 'virtual __cook2::~__cook2()' tover.cpp:2:10: error: overriding 'virtual __cook::~__cook() noexcept (true)' tover.cpp:15:10: error: looser throw specifier for 'virtual __cook3::~__cook3()' tover.cpp:2:10: error: overriding 'virtual __cook::~__cook() noexcept (true) ' [root@djt-17-109-v06 tmp]# g++ -c -std=gnu++0x tover.cpp # g++ 4.4.6 works Workaround: define parent destructor outside the class definition. [root@djt-17-109-v06 tmp]# cat tover.cpp struct __cook { virtual ~__cook(); }; __cook::~__cook() = default; /*...*/