On Tuesday, 23 January 2018 at 02:25:57 UTC, Mike Franklin wrote:

Should `destroy` be `@system` so it can't be called in `@safe` code, or should the compiler be smart enough to figure out the flow control and throw an error?

Interestingly, `destroy` is an unsafe operation for classes.

import std.stdio;

class A
{
    void hello() @safe { writeln("hello"); }
}

void main() @safe
{
    A a = new A();
    a.hello();
destroy(a); // onlineapp.d(12): Error: @safe function 'D main' cannot call
                 // @system function 'object.destroy!(A).destroy'
    a.hello();
}

https://run.dlang.io/is/AwKBc3


But it's not an unsafe operation for structs

import std.stdio;

struct A
{
    int i;
    void print() @safe { writeln(i); }
}

void main() @safe
{
    A* a = new A();
    a.print();  // OK
    a.destroy();
    a.print();  // Error!
}

https://run.dlang.io/is/Fm7qBR

Not sure if that's a bug or not.

Mike

Reply via email to