On Tuesday, 21 August 2018 at 10:57:15 UTC, Atila Neves wrote:
Never mind, I forgot to use -dip1000. Ok, cool, so _why_ does it work as intended now? Also, if I have to remember to annotate correctly, surely this is a massive hole in @safe dip1000?

It thought dip1000 was impenetrable, but if I understand it (honestly that's a surprise!), `scope` has strict semantics: all in, nothing out; you don't need to think about lifetime of data passed to scope parameters, because it doesn't escape anywhere. If you want to return data extracted from argument, `return` attribute relaxes scoping rules and allows to return data and passes scoping properties from argument to return value much like `inout` does for const.

Without annotation:

@safe:
struct MyStruct
{
    import core.stdc.stdlib;
    int* ints;
    this(int size) @trusted { ints = cast(int*) malloc(size); }
    ~this() scope @trusted { free(ints); }
    inout(int)* ptr() inout { return ints; }
}

int* gInt;
void f()
{
    scope s=MyStruct(10);
    gInt=s.ptr;
}

Error: scope variable s assigned to non-scope parameter this calling MyStruct.ptr
Doesn't let to call method without annotation.

Reply via email to