https://gcc.gnu.org/bugzilla/show_bug.cgi?id=103711

Sebastian Redl <sebastian.redl at getdesigned dot at> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |sebastian.redl@getdesigned.
                   |                            |at

--- Comment #2 from Sebastian Redl <sebastian.redl at getdesigned dot at> ---
Clang does not.

Here's an extended test case:

#include <iostream>

using namespace std;

int constructions = 0;
int destructions = 0;

struct A
{
    A()
    {
        constructions++;
    }
    virtual ~A() {
        destructions++;
    }
};

struct B : public virtual A
{
    B(int dummy)
    {
    };
    B() : B(1) {
        throw -1;
    }
    virtual ~B() = default;
};

struct C : public B
{
};

int main() {
    try
    {
        B b;
    }
    catch (int e)
    {
        cout << "Caughtb: " << e << endl;
    }
    try
    {
        C c;
    }
    catch (int e)
    {
        cout << "Caughtc: " << e << endl;
    }
    cout << constructions << " constructions" << endl;
    cout << destructions << " destructions" << endl;
}

Now GCC generates two versions of B::B(): one called by the complete object
construction on the stack, and one called by the base object construction in
C::C().

Unfortunately, both versions call the complete object destructor B::~B() in
their unwinding code, when the base object delegating constructor should call
the base object destructor.

Here's a godbolt link with the generated assembly:
https://godbolt.org/z/hEvYjrsGj

Reply via email to