https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85155
Jonathan Wakely <redi at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Version|8.0.1 |8.1.0 --- Comment #1 from Jonathan Wakely <redi at gcc dot gnu.org> --- struct B { virtual ~B() noexcept(false) = default; }; struct D : B { virtual ~D() { throw 17; } }; int main() { try { D d; return 1; } catch (int n) { return n; } } EDG gives a similar result to GCC: "85155.cc", line 6: error: nondeleted function overrides deleted function "B::~B" virtual ~D() { throw 17; } ^ "85155.cc", line 6: error: function "B::~B()" (declared at line 2) cannot be referenced -- it is a deleted function virtual ~D() { throw 17; } ^ "85155.cc", line 12: error: the default constructor of "D" cannot be referenced -- it is a deleted function D d; ^ 3 errors detected in the compilation of "85155.cc". Clang gives an error as soon as it sees the defaulted destructor, that's why there are no errors given for the derived class: struct B { virtual ~B() noexcept(false) = default; }; 85155.cc:2:11: error: exception specification of explicitly defaulted destructor does not match the calculated one virtual ~B() noexcept(false) = default; ^ 1 error generated. I can't find any justification in the standard for Clang's behaviour, the destructor should only be ill-formed if it is potentially invoked.