D is dead

Shachar Shemesh shachar at weka.io
Fri Aug 24 10:16:34 UTC 2018


On 23/08/18 15:03, Walter Bright wrote:
>> So you will excuse me, but I don't think this bug is being taken as 
>> seriously as I think it should.
> 
> It is a serious problem. (There are workarounds available, like using 
> scope(failure).)

I don't think you understand how unworkable this workaround is.

struct A {
   this(something);
   ~this();
}

struct B {
   A a;

   this(something) {
     a = A(something);
     // Safeguard against 14246
     scope(failure) destroy(a);

     // more code
   }
}

struct C {
   A a;

   this(something) {
     a = A(something);
     // Also needs a safeguard against 14246
     scope(failure) destroy(a);

     // more code
   }
}

struct D {
   this(something) {
     // Do nothing
   }
}

struct E {
   B b;
   D d;

   this(something) {
     b = B(something);
     // B doesn't even have an explicit destructor, but we are supposed 
to look at its implementation and understand that it contains A, so:
     scope(failure) destroy(b);

     d = D(something);
     // D doesn't even contain A, but it might one day, so:
     scope(failure) destroy(d);
   }
}


The chances of this scheme actually working without errors are, more or 
less, zero.


More information about the Digitalmars-d mailing list