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

Dgame r.schuett.1987 at gmail.com
Mon Aug 20 16:03:36 UTC 2018


On Monday, 20 August 2018 at 15:55:54 UTC, Kagamin wrote:
> On Monday, 20 August 2018 at 13:02:23 UTC, Atila Neves wrote:
>> On Monday, 20 August 2018 at 12:56:42 UTC, Kagamin wrote:
>>> You need `return` attribute there, not `scope`:
>>>
>>> struct MyStruct
>>> {
>>>     import core.stdc.stdlib;
>>>     int* ints;
>>>     this(int size) @trusted { ints = cast(int*) malloc(size); 
>>> }
>>>     ~this() @trusted { free(ints); }
>>>     inout(int)* ptr() return inout { return ints; }
>>> }
>>
>> I need `return` for what exactly? Your code still compiles, 
>> and my point is it shouldn't. It sure isn't memory safe.
>
> @safe:
> struct MyStruct
> {
>     import core.stdc.stdlib;
>     int* ints;
>     this(int size) @trusted { ints = cast(int*) malloc(size); }
>     ~this() @trusted { free(ints); }
>     inout(int)* ptr() return inout { return ints; }
> }
>
> int* gInt;
> void f()
> {
>     auto s=MyStruct(10);
>     gInt=s.ptr;
> }
>
>> Error: address of variable s assigned to gInt with longer 
>> lifetime
>
> Looks safe to me.

Is that safe as well?

void f()
{
     auto s = MyStruct(10);
     gInt = (() => s.ptr)();
}


More information about the Digitalmars-d mailing list