https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96919
--- Comment #2 from Martin Liška <marxin at gcc dot gnu.org> --- Using latest GCC release you can see what happens: $ g++ pr96919.cc --coverage && ./a.out && gcov a-pr96919.cc -t hello libgcov profiling error:/home/marxin/Programming/testcases/a-pr96919.gcda:overwriting an existing profile data with a different timestamp -: 0:Source:pr96919.cc -: 0:Graph:a-pr96919.gcno -: 0:Data:a-pr96919.gcda -: 0:Runs:1 -: 1:class Base { -: 2:public: -: 3: Base() = default; 1*: 4: virtual ~Base() = default; ------------------ _ZN4BaseD0Ev: #####: 4: virtual ~Base() = default; ------------------ _ZN4BaseD2Ev: 1: 4: virtual ~Base() = default; ------------------ -: 5: virtual void foo() = 0; -: 6:}; -: 7:class Hello : public Base { -: 8:public: -: 9: Hello() = default; 1*: 10: ~Hello() = default; ------------------ _ZN5HelloD0Ev: #####: 10: ~Hello() = default; ------------------ _ZN5HelloD2Ev: 1: 10: ~Hello() = default; ------------------ -: 11: void foo() override; -: 12:}; -: 13: -: 14:#include <iostream> -: 15: -: 16:using namespace std; -: 17: 1: 18:void Hello::foo() { 1: 19: cout << "hello" << endl; 1: 20:} -: 21: 1: 22:int main(int argc, char* argv[]) { #####: 23: Hello hello; 1: 24: hello.foo(); 1: 25: return 0; -: 26:} So yes, it's a virtual destructor _ZN4BaseD0Ev that is not called. And the not executed line: #####: 4: Hello hello; corresponds to a basic block <bb 5> : <L3>: Hello::~Hello (&hello); resx 2 which would be executed when the Hellow constructor fails.