Is @safe still a work-in-progress?

Walter Bright newshound2 at digitalmars.com
Thu Aug 23 08:48:15 UTC 2018


On 8/22/2018 3:52 AM, Atila Neves wrote:
> On Wednesday, 22 August 2018 at 09:05:13 UTC, Walter Bright wrote:
>> On 8/21/2018 8:58 PM, Nicholas Wilson wrote:
>>> On Tuesday, 21 August 2018 at 14:31:02 UTC, Atila Neves wrote:
>>>> The problem is that the code we write doesn't deal directly with pointers - 
>>>> see the recent confusion in this forum over where `scope` on the left 
>>>> applies to the `this` pointer or the one returned by the member function.
>>>>
>>>> Kagamin just told me I needed to use `return` instead of `scope` to get 
>>>> things to work and I'm still not sure why.
>>>
>>> The way I think about it is if you have a function that takes a pointer, any 
>>> pointer, and either returns it or a pointer derived from it (dereferencing or 
>>> indexing) that argument must be marked `return`. In your case it was a 
>>> pointer derived from `this` so `return` must be applied to `this`.
>>
>>
>> Another way to think about it is this:
>>
>>    S s;
>>    return &s;
>>
>> We all know that is an error. The idea is to have a way to express that for:
>>
>>     S s;
>>     return s.foo();
>>
>> and:
>>
>>     S s;
>>     return foo(&s);
>>
>> so that the compiler knows that the return value of foo() is attached to the 
>> lifetime of s. Pretty much everything flows from that.
> 
> Would the guideline below be correct?
> 
> "Add scope to every non-template member function that isn't meant to escape this 
> and add return to every non-template member function that returns all or part of 
> `this` by pointer or ref if you want the compiler to check that nothing gets 
> escaped in @safe code."

Being a template doesn't make any difference, except that it will helpfully 
infer these things.

Also, since 'this' is passed by 'ref' to struct member functions, it cannot 
escape anyway with dip1000:

   struct S {
     int x;
     @safe ref int foo() { return x; }
   }

   dmd test -dip1000
   test.d(4): Error: returning this.x escapes a reference to parameter this, 
perhaps annotate with return

`scope` is for pointers, `ref` does not need further annotation.


More information about the Digitalmars-d mailing list