Found a pretty nasty bug in vibe-d: https://github.com/vibe-d/vibe.d/issues/2484

And it's caused by this behavior.

```D
import std;

struct Foo {
    Bar bar;
    bool err;

    ~this() {
// scope(failure) destroy(bar); // < this fixes the Bar destructor call
        enforce(!err, "Test err");
    }
}

struct Bar {
    static int refs;
    ~this() { refs--; }
}

void main()
{
    {
        Foo f;
        Bar.refs = 1;
    }
    assert(Bar.refs == 0);

    try () {
        Foo f;
        f.err = true;
        Bar.refs = 1;
    }();
    catch (Exception ex) {}
    assert(Bar.refs == 0);
}
```

So when the exception is thrown within Foo destructor (and it's bad on it's own but can easily happen as destructors aren't nothrow @nogc by default).

Is this behavior expected?

Reply via email to