Friends don't let friends use inout with scope and -dip1000

Kagamin spam at here.lot
Tue Aug 21 11:52:25 UTC 2018


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.


More information about the Digitalmars-d mailing list